Складність застосування перестановки на місці


27

На мій подив, мені не вдалося знайти документи про це - напевно, шукали неправильні ключові слова.

Отже, у нас є масив чого-небудь і функція на його показниках; f - перестановка.ff

Як ми можемо переупорядкувати масив відповідно до із пам’яттю та часом виконання якомога ближче до O ( 1 ) та O ( n ) ?fO(1)O(n)

Чи є додаткові умови, коли це завдання стає простішим? Наприклад, коли ми чітко знаємо, що функція - обернена величина f ?gf

Я знаю алгоритм, який слідкує за циклами і проходить цикл для кожного індексу, щоб перевірити, чи є він найменшим у його циклі, але знову ж таки, він має найгірший час роботи , хоча в середньому він, схоже, веде себе краще. ..O(n2)


Просте спостереження: Якщо не тільки масив елементів, але й масив, що містить функцію f, можна записати, то завдання легко виконати в O (n) час, використовуючи цілі регістри O (1) (кожен довжиною O ( журнал n) біти) та додатковий простір для одного елемента, просто слідуючи за кожним циклом. Але це не працює, якщо функція f задана на сховищі лише для читання (або f задається лише як оракул), що, на мою думку, є припущенням у цьому питанні.
Цуйосі Іто

23
Fich та ін. 1995 : час, O ( log n ) простір. Тут також обговорюються деякі особливі випадки. O(nlogn)O(logn)
Юкка Суомела

Так, я припускаю, що у нас є f як оракул.
jkff

3
@JukkaSuomela, ти повинен це зробити у відповідь. Крім того, враховуючи, що є довільною перестановкою, простий аргумент ентропії дає O ( n log n ) простір та / або час, тому я був би здивований, якби ти міг зробити краще, ніж O ( n log n ) у часі та просторі. fO(nlogn)O(nlogn)
user834

Відповіді:


4

Варіант 0: Permuting In Place (1995) від Віри Е. Фіх, Дж. Іна Мунро, Патрісіо В. Поблете часу O ( log 2 n ) простір.O(nlogn)O(log2n)

Варіант 1: Обдурити, стиснувши перестановку до лаконічної структури даних, див. Munro http://www.itu.dk/people/ssrao/icalp03-a.pdf .

Варіант 2: Використовуйте розклад основного циклу, щоб зберігати перманентну лаконічно і використовувати цей додатковий простір для обману http://oeis.org/A186202

Варіант 3: Відстежуйте найбільший індекс кожного маніпульованого циклу. Для кожної ітерації використовуйте найбільший невидимий індекс, щоб перемістити все в своєму циклі по одному. Якщо він потрапляє на побачений індекс, скасуйте все, що працює, тому що циклом вже маніпулювали. час, O ( # циклів log n ) простір.O(n2)O(#cycleslogn)

Варіант 4: Відслідковуйте найбільший індекс кожного маніпульованого циклу, але виконайте їх лише партіями різної тривалості циклу. Для кожної ітерації використовуйте найбільший невидимий індекс, щоб переміщувати все в своєму циклі по одному. Якщо він потрапляє на побачений індекс, скасуйте все, що працює, тому що цикл thae вже маніпулюється час, O ( ( # циклів _ з _ же _ розмір ) * журнал п ) простір.O(n2distinct_cycle_lengths)O((#cycles_with_same_size)logn)

Варіант 5: Із того ж паперу Манро, як і варіант 0, для обертати цикл p ( i ), якщо i - найбільший показник у цьому циклі. O ( n 2 ) час і O ( log n ) простір.i=1..нp(i)iO(n2)O(logn)


nlogn

№5 використовує менше місця, ніж # 0, коефіцієнтом log (n).
Чад Brewbaker

1

Якщо ви використовуєте подання циклу перестановки, вам потрібен 1 додатковий елемент масиву, щоб зберігати елемент, який наразі перестановлений, і ви можете виконувати цикли в гірших операціях O (N).


2
jkff вже сказав, що він знає алгоритм наступного циклу, тому він, очевидно, хоче, щоб сама перестановка трактувалася як (близька до) чорна скринька. Як він зазначає у запитанні, перетворення з (майже) чорного поля в подання циклу може зайняти O (n ^ 2) час.
Джошуа Грохов

Чорний ящик p (i) - це добре. Ви просто обходите цикл, поки не повернетесь до i. Проблема полягає в тому, що Коломогоров складний у тому, щоб зберігати список оновлених елементів, щоб ви не циркулювали їх кілька разів. У Манро є межі щодо цього. itu.dk/people/ssrao/icalp03-a.pdf
Чад Брюбекер

-2

Будь-яка перестановка з N елементів може бути перетворена на будь-яку іншу перестановку за допомогою N-1 або меншої кількості обмінів. Найгірший випадок для цього методу може вимагати виклику O (n ^ 2) до вашого оракула, F (). Почніть з найменшого положення. Нехай х - позиція, яку ми зараз міняємо.

Якщо F (x)> = x, то поміняйте місцями x і F (x). Інше, ми повинні знайти, де в списку зараз знаходиться елемент, який знаходився в положенні F (x). Це можна зробити за допомогою наступної ітерації. Нехай y = F (x). Робіть, поки y> = x: y = F (y): End Do. Тепер обмінюємося позиціями х і у.


3
O(n2)

Вибачте. Я новачок у цій групі. Мені подобається цей метод через його простоту. Я іноді знаходжу простоту швидше, ніж ефективність. Я знаю інший метод, який вимагає кроків O (n), але простір O (nlogn).
Рассел Пасхальний,

1
Рассел, навіть виділяючи та нулюючи простір O (n log n) - це вже O (n log n), ви мали на увазі інший бік?
jkff

Ви дійсно не маєте місця та нульового простору. Основна ідея - коли F (x)> x нам потрібно запам’ятати, куди ми поставимо предмет у позицію x. Для дійсно великих n я б використовував базу даних і просто веду записи про те, куди переміщується елемент x. Запис можна видалити, коли х потрапить до остаточного місця.
Рассел Пасхальний,

1
Але чому ви тоді говорите, що для цього потрібен пробіл O (n log n)?
jkff

-2

Цей метод використовує зворотний F і вимагає n біт зберігання. Якщо x - позиція елемента в початковому масиві, нехай G (x) є позицією елемента в відсортованому масиві. Нехай B - n-бітовий масив. Встановіть усі n біт B у 0.

ДЛЯ x = 1 до n-1: ЯКЩО B (x) == 0 ТАКОЖ: y = G (x): DO UNTIL x == y: Поміняйте місцями x і y: B (y) = 1: y = G ( y): LOOP: ENDIF: NEXT X

Цей спосіб продовжує поміняти елемент, який знаходиться в даний час у позиції x, на остаточне положення предмета. Внутрішня петля закінчується, коли правильний елемент поміняється в положення х. Оскільки кожен своп переміщує принаймні один елемент до остаточного положення елемента, внутрішній цикл Do не може виконати більше n-1 разів під час виконання. Я думаю, що цей метод - це O (n) час і простір.


2
Ви подивилися на папір? Два алгоритми, які ви перераховуєте тут, є двома "очевидними". У документі є менш очевидні з різними компромісами в часі та просторі, зокрема набагато менше місця.
Yuval Filmus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.