Цікава проблема сортування


14

Дано трубку з пронумерованими кульками (випадковим чином). У трубці є отвори для видалення кульки. Розгляньте наступні кроки для однієї операції:

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

Етапи 1 - 3 розглядаються як одна операція.

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

Наприклад: Якщо трубка містить: [ 1 4 2 3 5 6 ]     [1 4 2 3 5 6]

Тоді ми можемо вийняти 44 і 55 і 66 , і якщо нахилити трубу вліво, отримуємо [ 1 2 3 ]  [1 2 3] , і вставляємо ( 4 5 6 )  (4 5 6) в такому порядку до кінця труби, щоб дістати [ 1 2 3 4 5 6 ]     [1 2 3 4 5 6] .

Отже мінімальна кількість необхідних кроків - 1. Мені потрібно знайти мінімальні операції, щоб сортувати трубу.

Будь-які ідеї чи підказки, як вирішити цю проблему?


Якщо вони виходять у зворотному порядку, вам доведеться вийняти 2, 3, ... для того, щоб додати і в кінці, для n операцій у всіх. Це, очевидно, найгірший випадок. 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()
Yuval Filmus

Мені подобається думати про це з точки зору зняття інверсій. З кожною операцією ви можете видалити інверсії між будь-яким набором X і S - X (де S - весь набір кульок). Отже, ви просто повинні обережно вибирати свої набори X. XSXSX
Джо

Відповіді:


10

Визначте номер перегону для запуску перестановки π , позначений r ( π ) , використовуючи наступний процес. Нехай k - максимальне ціле число, таке, що числа min ( π ) , , k з'являються у порядку збільшення у π . Видаліть їх з π та повторіть процес. Кількість раундів, необхідних для споживання всієї перестановки, становить r ( π ) .πr(π)kmin(π),,kππr(π)

Наприклад, давайте обчислимо r ( 62735814 ) . Ми спочатку відклали 1 , щоб отримати 6273584 . Потім відкладаємо 234 , щоб отримати 6758 . Потім відкладаємо 5 , щоб отримати 678 . Нарешті, ми відклали 678, щоб отримати порожню перестановку. Це займає чотири раунди, тому r ( 62735814 ) = 4r(62735814)1627358423467585678678r(62735814)=4 .

Чим це представлення корисне для сортування 62735814 ? Виконайте кожен другий запуск, тобто 234 , 678 , і перемістіть ці числа вправо, щоб отримати 51627384 (відредагуйте: у порядку, який вони відображаються в перестановці, тобто 627384 ). Зараз є лише два запуски, а саме 1234 , 5678 , і ми можемо сортувати список, перемістивши 567862735814234,678516273846273841234,56785678 праворуч.

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

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

Edit: Ось інша інтерпретація числа вступного розділу , який дає лінійний алгоритм для обчислення часу, і дозволяє мені начерк докази моєї гіпотези, таким чином перевіряючи формулу вхід 2 г ( л ) .log2r(π)

Розглянемо перестановку 62735814 ще раз. Причина того, що перший запуск закінчується в 1, полягає в тому, що 2 з'являється перед 1 . Аналогічно, другий запуск закінчується в 4, оскільки 5 з'являється перед 4 і так далі. Отже, номер перемикання запуску перестановки є числом i s таким, що i + 1 з'являється перед i .62735814121454ii+1i

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

Як виглядає операція з точки зору π - 1 ? нехай B - це множина чисел, яку ми рухаємо праворуч, а A - множина чисел, що залишаються зліва. Заміняємо числа в A перестановкою на { 1 , , | А | }, що представляє їх відносний порядок, і замініть числа в B перестановкою на { | А | + 1 , , | А | + | Б | }π1BAA{1,,|A|}B{|A|+1,,|A|+|B|}. Наприклад, розглянемо хід 6273 5 8 1 451 6273846273581451627384. In terms of the inverse permutations, it's 72485136246813577248513624681357. So 7575 was mapped to 2121 and 248136248136 was mapped to 468357468357.

A descent xyxy in π1π1 is lost after the operation only if xAxA and yByB. Conversely, in terms of π1π1, the partition into AA and BB corresponds to AA-runs and BB-runs; every time a BB-run ends and an AA-run begins, there is a descent. In order to "kill" a descent, we have to switch from an AA-run to a BB-run. If we kill two descents, we will have switched in the middle from a BB-run to an AA-run, incurring a descent.

This argument can be formalized to show that if αα arises from ππ via an operation, then d(α1)d(π1)/2d(α1)d(π1)/2, where d() is the number of descents. This is equivalent to r(α)r(π)/2, thus proving one direction of my conjecture. The other direction is easier, and was already outlined above: we simply take every second run and push these runs to the right to get a permutation α satisfying r(α)=r(π/2).


You are taking out several rounds of balls at once, I understand that isn't allowed.
vonbrand

1
I'm taking them in the order they appear in the permutation. That is legal.
Yuval Filmus

i am bit confused. can you please explain min number of operations required to sort [6 5 4 3 2 1] and also you mentioned like "Take every second run, i.e. 234,678, and move these numbers to the right to get 51627384" can you please explian this with detail and also how to calculate r(π) efficently?
user6709

1) r(654321)=6, so you would need 3 operations. For example, 654321531|64251|62341234|56.
Yuval Filmus

2) You take all the numbers belonging to these runs (in the order they appear in the permutation), and move them to the right. In this case, you take 627384 and move them to the right, leaving 51 to the left.
Yuval Filmus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.