Дана трубка с пронумерованными шариками (случайно). Трубка имеет отверстия для удаления шарика. Рассмотрим следующие шаги для одной операции:
- Вы можете выбрать один или несколько шариков из отверстий и запомнить порядок, в котором вы выбрали шарики.
- Вам нужно наклонить трубу влево, чтобы оставшиеся шарики в трубе сместились влево и заняли пустое пространство, созданное удалением шариков.
- Вы не должны изменять порядок, в котором вы выбрали пронумерованные шары из трубы. Теперь вы снова помещаете их в трубу, используя свободное пространство, созданное движением шариков.
Шаги с 1 по 3 рассматриваются как одна операция.
Узнайте минимальные операции, необходимые для сортировки пронумерованных шаров в порядке возрастания.
Например: если трубка содержит:
Тогда мы можем вынуть и и , и если мы наклоним трубу влево, мы получим и вставим в этом порядке до конца трубы, чтобы получить .
Поэтому минимальное количество необходимых шагов - 1. Мне нужно найти минимальные операции для сортировки трубы.
Любые идеи или советы о том, как решить эту проблему?
sorting
permutations
Ракеш
источник
источник
Ответы:
Определите номер разбиения прогона перестановки , обозначенный r ( π ) , используя следующий процесс. Пусть k - максимальное целое число такое, что числа min ( π ) , … , k появляются в порядке возрастания в π . Удалите их из π и повторите процесс. Количество раундов, которое требуется, чтобы поглотить всю перестановку, равно r ( π ) .π r(π) k min(π),…,k π π r(π)
Например, давайте вычислим . Сначала мы откладываем 1 , чтобы получить 6273584 . Затем мы откладываем 234 , чтобы получить 6758 . Затем мы откладываем 5 , чтобы получить 678 . Наконец, мы выделяем 678, чтобы получить пустую перестановку. Это занимает четыре раунда, поэтому r ( 62735814 ) = 4 .r(62735814) 1 6273584 234 6758 5 678 678 r(62735814)=4
Как это представление полезно для сортировки ? Сделайте каждый второй прогон, то есть 234 , 678 , и переместите эти числа вправо, чтобы получить 51627384 (отредактируйте: в порядке их появления в перестановке, то есть 627384 ). Теперь есть только два прогона, а именно 1234 , 5678 , и мы можем отсортировать список, переместив 5678 вправо.62735814 234,678 51627384 627384 1234,5678 5678
Теперь позвольте мне сделать следующую гипотезу: Для перестановки пусть Π будет множеством всех перестановок, достижимых из π за один ход. Тогда min α ∈ Π r ( α ) = ⌈ r ( π ) / 2 ⌉ .π Π π minα∈Πr(α)=⌈r(π)/2⌉
Учитывая эту гипотезу, легко показать, что минимальное число ходов, необходимое для сортировки перестановки равно ⌈ log 2 r ( π ) ⌉ , и я проверил эту формулу для всех перестановок в S n при n ≤ 8 .π ⌈log2r(π)⌉ Sn n≤8
Изменить: Вот другая интерпретация числа разделов прогона, который дает линейный алгоритм времени для его вычисления, и позволяет мне набросать доказательство моей гипотезы, таким образом проверяя формулу .⌈log2r(π)⌉
Рассмотрим перестановку раз. Причина того, что первый запуск заканчивается на 1, состоит в том, что 2 появляется перед 1 . Точно так же второй цикл заканчивается 4, так как 5 появляется перед 4 и так далее. Следовательно, номер разбиения прогона перестановки - это число i s, такое, что i + 1 появляется перед i .62735814 1 2 1 4 5 4 i i+1 i
Мы можем сформулировать это более кратко, если мы посмотрим на обратную перестановку. Рассмотрим снова . Возьмем π - 1 = 72485136 . Эта перестановка имеет три спуска: 7 2 48 5 1 36 (спуск - это позиция, меньшая, чем предыдущая). Каждый из спусков соответствует началу нового пробега. Таким образом, r ( π ) равно единице плюс количество спусков в π - 1 .π=62735814 π−1=72485136 72485136 r(π) π−1
Как выглядит операция с точки зрения ? пусть B будет набором чисел, которые мы переместим вправо, а A будет набором чисел, которые останутся слева. Заменим числа в A перестановкой на { 1 , … , | A | } представляющий их относительный порядок, и замените числа в B перестановкой на { | A | + 1 , … , | A | + | Б | }π−1 B A A {1,…,|A|} B {|A|+1,…,|A|+|B|} , Например, рассмотрим ход . С точки зрения обратных перестановок, это 7 248 5 136 46 2 468 1 357 . Таким образом, 75 был сопоставлен с 21, а 248136 был сопоставлен с 468357 .62735814↦51627384 72485136↦24681357 75 21 248136 468357
Спуск в П - 1 теряется после операции , только если х ∈ А и у ∈ B . Наоборот, в терминах π - 1 разбиение на A и B соответствует A- бегам и B- бегам; каждый раз, когда заканчивается B- бег и начинается A- бег, происходит спуск. Чтобы «убить» спуск, мы должны переключиться с A- бега на B…xy… π−1 x∈A y∈B π−1 A B A B B A A B -бегать. Если мы убьем два спуска, мы переключимся посередине с бега на A- бег, неся спуск.B A
Этот аргумент может быть формализован, чтобы показать, что если возникает из π посредством операции, то d ( α - 1 ) ≥ ⌊ d ( π - 1 ) / 2 ⌋ , где d ( ⋅ ) - количество спусков. Это эквивалентно r ( α ) ≥ ⌈ r ( π ) / 2 ⌉α π d(α−1)≥⌊d(π−1)/2⌋ d(⋅) r(α)≥⌈r(π)/2⌉ Таким образом, доказывая одно направление моей гипотезы. Другое направление проще, и об этом уже говорилось выше: мы просто берем каждый второй прогон и толкаем эти прогоны вправо, чтобы получить перестановку удовлетворяющую условию r ( α ) = ⌈ r ( π / 2 ) ⌉ .α r(α)=⌈r(π/2)⌉
источник