Интересная проблема по сортировке

14

Дана трубка с пронумерованными шариками (случайно). Трубка имеет отверстия для удаления шарика. Рассмотрим следующие шаги для одной операции:

  1. Вы можете выбрать один или несколько шариков из отверстий и запомнить порядок, в котором вы выбрали шарики.
  2. Вам нужно наклонить трубу влево, чтобы оставшиеся шарики в трубе сместились влево и заняли пустое пространство, созданное удалением шариков.
  3. Вы не должны изменять порядок, в котором вы выбрали пронумерованные шары из трубы. Теперь вы снова помещаете их в трубу, используя свободное пространство, созданное движением шариков.

Шаги с 1 по 3 рассматриваются как одна операция.

Узнайте минимальные операции, необходимые для сортировки пронумерованных шаров в порядке возрастания.

Например: если трубка содержит:[1 4 2 3 5 6]

Тогда мы можем вынуть и и , и если мы наклоним трубу влево, мы получим и вставим в этом порядке до конца трубы, чтобы получить .456[1 2 3](4 5 6)[1 2 3 4 5 6]

Поэтому минимальное количество необходимых шагов - 1. Мне нужно найти минимальные операции для сортировки трубы.

Любые идеи или советы о том, как решить эту проблему?

Ракеш
источник
Если они идут в обратном порядке, вы должны убрать 2, 3, ... по порядку и добавить в конце для операций всего. Это явно худший случай. n
vonbrand
2
8,7,6,5,4,3,2,1 -> 75318642 -> 51627384 -> 12345678, всегда занимая нечетные позиции.
adrianN
Подводя итог моему ответу: минимальное количество операций, необходимых для сортировки перестановки равно log 2 ( d ( π - 1 ) + 1 ) , где d ( ) - количество спусков. πlog2(d(π1)+1)d()
Юваль Фильмус
Мне нравится думать об этом с точки зрения удаления инверсий. С каждой операцией вы можете удалять инверсии между любым набором и S - X (где S - весь набор шаров). Итак, вам просто нужно тщательно выбирать наборы X. XSXSX
Джо

Ответы:

10

Определите номер разбиения прогона перестановки , обозначенный r ( π ) , используя следующий процесс. Пусть k - максимальное целое число такое, что числа min ( π ) , , k появляются в порядке возрастания в π . Удалите их из π и повторите процесс. Количество раундов, которое требуется, чтобы поглотить всю перестановку, равно r ( π ) .πr(π)kmin(π),,kππr(π)

Например, давайте вычислим . Сначала мы откладываем 1 , чтобы получить 6273584 . Затем мы откладываем 234 , чтобы получить 6758 . Затем мы откладываем 5 , чтобы получить 678 . Наконец, мы выделяем 678, чтобы получить пустую перестановку. Это занимает четыре раунда, поэтому r ( 62735814 ) = 4 .r(62735814)1627358423467585678678r(62735814)=4

Как это представление полезно для сортировки ? Сделайте каждый второй прогон, то есть 234 , 678 , и переместите эти числа вправо, чтобы получить 51627384 (отредактируйте: в порядке их появления в перестановке, то есть 627384 ). Теперь есть только два прогона, а именно 1234 , 5678 , и мы можем отсортировать список, переместив 5678 вправо.62735814234,678516273846273841234,56785678

Теперь позвольте мне сделать следующую гипотезу: Для перестановки пусть Π будет множеством всех перестановок, достижимых из π за один ход. Тогда min α Π r ( α ) = r ( π ) / 2 .πΠπminαΠr(α)=r(π)/2

Учитывая эту гипотезу, легко показать, что минимальное число ходов, необходимое для сортировки перестановки равно log 2 r ( π ) , и я проверил эту формулу для всех перестановок в S n при n 8 .πlog2r(π)Snn8

Изменить: Вот другая интерпретация числа разделов прогона, который дает линейный алгоритм времени для его вычисления, и позволяет мне набросать доказательство моей гипотезы, таким образом проверяя формулу .log2r(π)

Рассмотрим перестановку раз. Причина того, что первый запуск заканчивается на 1, состоит в том, что 2 появляется перед 1 . Точно так же второй цикл заканчивается 4, так как 5 появляется перед 4 и так далее. Следовательно, номер разбиения прогона перестановки - это число i s, такое, что i + 1 появляется перед i .62735814121454ii+1i

Мы можем сформулировать это более кратко, если мы посмотрим на обратную перестановку. Рассмотрим снова . Возьмем π - 1 = 72485136 . Эта перестановка имеет три спуска: 7 2 48 5 1 36 (спуск - это позиция, меньшая, чем предыдущая). Каждый из спусков соответствует началу нового пробега. Таким образом, r ( π ) равно единице плюс количество спусков в π - 1 .π=62735814π1=7248513672485136r(π)π1

Как выглядит операция с точки зрения ? пусть B будет набором чисел, которые мы переместим вправо, а A будет набором чисел, которые останутся слева. Заменим числа в A перестановкой на { 1 , , | A | } представляющий их относительный порядок, и замените числа в B перестановкой на { | A | + 1 , , | A | + | Б | }π1BAA{1,,|A|}B{|A|+1,,|A|+|B|}, Например, рассмотрим ход . С точки зрения обратных перестановок, это 7 248 5 136 46 2 468 1 357 . Таким образом, 75 был сопоставлен с 21, а 248136 был сопоставлен с 468357 .627358145162738472485136246813577521248136468357

Спуск в П - 1 теряется после операции , только если х А и у B . Наоборот, в терминах π - 1 разбиение на A и B соответствует A- бегам и B- бегам; каждый раз, когда заканчивается B- бег и начинается A- бег, происходит спуск. Чтобы «убить» спуск, мы должны переключиться с A- бега на Bxyπ1xAyBπ1ABABBAAB-бегать. Если мы убьем два спуска, мы переключимся посередине с бега на A- бег, неся спуск.BA

Этот аргумент может быть формализован, чтобы показать, что если возникает из π посредством операции, то d ( α - 1 ) d ( π - 1 ) / 2 , где d ( ) - количество спусков. Это эквивалентно r ( α ) r ( π ) / 2 απd(α1)d(π1)/2d()r(α)r(π)/2Таким образом, доказывая одно направление моей гипотезы. Другое направление проще, и об этом уже говорилось выше: мы просто берем каждый второй прогон и толкаем эти прогоны вправо, чтобы получить перестановку удовлетворяющую условию r ( α ) = r ( π / 2 ) .αr(α)=r(π/2)

Юваль Фильмус
источник
Вы вынимаете несколько раундов шаров одновременно, я понимаю, что это не разрешено.
vonbrand
1
Я беру их в порядке их появления в перестановке . Это законно.
Юваль Фильмус
Я немного смущен. Можете ли вы объяснить минимальное количество операций, необходимых для сортировки [6 5 4 3 2 1], а также упомянули, что «Возьмите каждую вторую серию, то есть 234 678, и переместите эти числа вправо, чтобы получить 51627384», можете ли вы объяснить это с помощью подробно, а также как эффективно рассчитать r (π)?
user6709
r(654321)=6654321531|64251|62341234|56
62738451