Определите номер разбиения прогона перестановки , обозначенный 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(π)⌉Snn≤8
Изменить: Вот другая интерпретация числа разделов прогона, который дает линейный алгоритм времени для его вычисления, и позволяет мне набросать доказательство моей гипотезы, таким образом проверяя формулу .⌈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 .62735814↦5162738472485136↦246813577521248136468357
Спуск в П - 1 теряется после операции , только если х ∈ А и у ∈ B . Наоборот, в терминах π - 1 разбиение на A и B соответствует A- бегам и B- бегам; каждый раз, когда заканчивается B- бег и начинается A- бег, происходит спуск. Чтобы «убить» спуск, мы должны переключиться с A- бега на B…xy…π−1x∈Ay∈Bπ−1ABABBAAB-бегать. Если мы убьем два спуска, мы переключимся посередине с бега на A- бег, неся спуск.BA
Этот аргумент может быть формализован, чтобы показать, что если возникает из π посредством операции, то d ( α - 1 ) ≥ ⌊ d ( π - 1 ) / 2 ⌋ , где d ( ⋅ ) - количество спусков. Это эквивалентно r ( α ) ≥ ⌈ r ( π ) / 2 ⌉απd(α−1)≥⌊d(π−1)/2⌋d(⋅)r(α)≥⌈r(π)/2⌉Таким образом, доказывая одно направление моей гипотезы. Другое направление проще, и об этом уже говорилось выше: мы просто берем каждый второй прогон и толкаем эти прогоны вправо, чтобы получить перестановку удовлетворяющую условию r ( α ) = ⌈ r ( π / 2 ) ⌉ .αr(α)=⌈r(π/2)⌉