Складність алгоритму переміщення Фішера-Йейта


15

Це питання стосується алгоритму Фішера-Йейта для повернення випадкових перетасовок заданого масиву. Сторінка Вікіпедії говорить, що її складність становить O (n), але я думаю, що це O (n log n).

У кожній ітерації i вибирається випадкове ціле число між 1 і i. Просто записати ціле число в пам'ять - O (log i), а оскільки є n ітерацій, то загальна сума є

O (log 1) + O (log 2) + ... + O (log n) = O (n log n)

що не краще, ніж наївний алгоритм. Я щось тут пропускаю?

Примітка. Наївний алгоритм повинен присвоїти кожному елементу випадкове число в інтервалі (0,1), а потім сортувати масив відповідно до призначених чисел.

Відповіді:


24

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


4
Хоча це справді "незначний гріх", я думаю, що це великий гріх педагогіки ТКС, що це ніколи прямо не згадується! Кожен студент CS виявляє це для себе і вважає, що щось головне не так, поки їм не скажуть, що всі знають це, але ніхто про це не говорить. Крім того, чи не було пару років тому, коли хтось використовував модель O (log n), щоб дати алгоритм суб-кубічного часу для якоїсь відомої проблеми, яка була припущена як Omega (n ^ 3)? Це колись вирішувалося?
randomwalker

2
Мені невідомо про брухаху, про яку ти йдеш. Щодо того, щоб не згадувати про це, ви точно маєте рацію. Після того, як я вперше прочитав пост Джеффа Еріксона, тепер я вказую на те, щоб довести P = PSPACE в моєму класі геометрії лише для ударів :)
Суреш Венкат

1
Дякую за відповідь. Я ніколи не знав, що це така велика справа. Посилання забезпечує хороше читання.
Томер Вромен

1
Підсумок: завжди робіть свою модель явною.
Jukka Suomela

2
O(logn)O(logn)

17

Стандартна модель обчислення передбачає, що арифметичні операції над цілими числами O (log n) -бітів можуть виконуватися в постійний час, оскільки ці операції, як правило, передаються апаратно. Отже, в алгоритмі Фішера-Йейтса "запис цілого числа i в пам'ять" займає лише час O (1).

Звичайно, цілком доречно аналізувати алгоритм з точки зору бітових операцій, але модель біт-вартості менш прогнозує фактичну поведінку. Навіть простий цикл for i = 1 to n: print(i)вимагає бітових операцій O (n log n).


Гарна точка з петлею. Ніколи цього не помічав ...
Томер Вромен

8

Це відповідь на те, що "[алгоритм Фішера-Йейтса] не кращий, ніж наївний алгоритм. Я щось тут пропускаю?" про що ви задали питання.

У вашому "наївному" алгоритмі, який використовує реальні числа: скільки бітів точності ви використовуєте? Якщо ви підраховуєте бітову складність (як, здається, це робите для Фішера-Йейта), і алгоритм використовує k випадкових біт для реальних чисел, то час його роботи буде Ω (kn log n), оскільки порівнювати два k- бітові реальні числа займають час Ω (k). Але k має бути принаймні Ω (log n), щоб два елементи не відображалися на одне дійсне число, а це означає, що алгоритм займає час Ω (n log 2 n), що повільніше, ніж переміщення Fisher-Yates на a коефіцієнт log n.

Якщо ви просто підраховуєте кількість арифметичних і порівняльних операцій і ігноруєте їхню бітну складність, тоді Фішер-Яйтс є Θ (n), а ваш алгоритм - Θ (n log n), все-таки фактор журналу n один від одного.


Я підозрював, що "наївний" алгоритм мав це неявне к ...
Томер Вромен

1
Алгоритм "наївності" може бути реалізований чисто в лінійний час наступним чином. Призначте кожному елементу випадкове ціле число між 1 і n ^ 3, а потім сортуйте числа за часом O (n) за допомогою радіоскопічного сортування. (З великою часткою ймовірності жоден з двох елементів не отримає однакове випадкове число. Якщо є дублікати, перестановіть їх рекурсивно.)
Jeffε

@JeffE: Дякую! Це дуже чисто і має таку ж складність, як і Фішер-Йейтс. Опублікувавши це, я насправді відчував, що "наївний" алгоритм не повинен бути гіршим ... Я пропустив той факт, що n k-бітових чисел можна сортувати в O (nk), не потребуючи O (nklog n). Але я думаю, що Кнут-Фішер-Йейтс все-таки краще в константах: йому потрібні точно (log n!) Випадкові біти - випадкове ціле число від 1 до n, потім 1 до n-1 і т.д., що є оптимальним (замість цього 3n log n), і це можна зробити на місці, маючи лише постійну додаткову пам'ять.
ShreevatsaR

6

Немає нічого особливого в цілих числах для цієї проблеми.

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

Брухаха, на яку посилався randomwalker, стосувався статті POPL 2008 ( http://portal.acm.org/citation.cfm?doid=1328438.1328460 ), обговорюваної тут: http://blog.computationalcomplexity.org/2009/05/shaving- logs-with-unit-cost.html

У цій публікації Lance Fortnow описує, як студент скаржився, що для сортування дійсно потрібен n log ^ 2 n час, якщо ми повинні прочитати всі журнали n бітів двох елементів, щоб порівняти їх, що здається розумним запереченням.


Я не отримую автора публікації в блозі. Він скаржиться, що сортування насправді є O (n log ^ 2 n), але потім каже, що папір твердий?
Томер Вромен

Папір твердий (тобто не хибний) тим, що існує модель, в якій арифметичні операції займають одиничний час, і в цій моделі алгоритм паперу є першим, хто досяг o (n ^ 3) операцій.
Дейв Доті

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

4

Сторінка Вікіпедії говорить, що її складність становить O (n), але я думаю, що це O (n log n).

Власне, O (n log n) є нижньою межею для цієї проблеми в моделях, де сортування - O (n log n). Якщо всі перестановки однаково вірогідні, то алгоритм як функція від випадкових потоків до перестановок повинен бути сюрєктивним. Є n! перестановки, тож у чомусь на кшталт моделі дерева рішень є гілки довжиною принаймні O (log n!) = O (n log n).

1ϵO(ϵ)


3

У TCS ми розглядаємо - якщо прямо не вказано інше - складність на машині Тьюрінга. Хоча це добре для теоретичних цілей, результати не дуже корисні на практиці, оскільки ми реалізуємо різні апаратні моделі (тобто кінцеві наближення) до апаратних засобів. Тому можливо задати складність цим моделям. Наприклад, ми зазвичай припускаємо, що машини реєстрації (подібні до реальних процесорів) можуть виконувати атомні операції на двох регістрах в постійний час - саме це, можливо, було використано тут.

Коротше кажучи: ви думаєте з точки зору ТМ, авторів статті з точки зору RM. Ви обоє праві.

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