Сложность алгоритма тасования Фишера-Йейтса

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 случайно .О(журналN)

Суреш Венкат
источник
4
Хотя это действительно "незначительный грех", я думаю, что это главный грех педагогики TCS, что это никогда не упоминается прямо! Каждый студент CS изучает это для себя и думает, что что-то серьезное неправильно, пока ему не скажут, что все это знают, но никто не говорит об этом. Кроме того, не было ли сенсации пару лет назад, когда кто-то использовал модель O (log n), чтобы дать субкубический алгоритм времени для некоторой известной проблемы, которая, как предполагалось, была Омега (n ^ 3)? Это когда-нибудь было решено?
Randomwalker
2
Я не знаю о ссоре, о которой ты говоришь. Что касается не упоминания этого, вы определенно правы. После того, как я впервые прочитал пост Джеффа Эриксона, теперь я хочу доказать, что P = PSPACE в моем классе геометрии только для ударов :)
Суреш Венкат
1
Спасибо за ответ. Я никогда не знал, что это было так важно. Ссылка обеспечивает хорошее чтение.
Томер Вромен
1
Итог: всегда делайте вашу модель явной.
Юкка Суомела
2
Я думаю, что основная причина того, что bit ops является постоянным временем, заключается в том, что (за полиномиальное время) вы можете запрограммировать таблицу поиска доступа с постоянным временем для всех пар операндов O ( log n ) -бит, для большинства «Современные» вычислительные модели. В этом нет ничего «греховного» ... для меня, я вижу это свойство как свойство, которое можно просто принять без потери общности. О(журналN)О(журналN)
Райан Уильямс
17

Стандартная модель вычислений предполагает, что арифметические операции над O (log n) -битными целыми числами могут выполняться за постоянное время, поскольку эти операции обычно передаются аппаратно. Таким образом, в алгоритме Фишера-Йейтса «запись целого числа i в память» занимает всего O (1) времени.

Конечно, анализировать алгоритм с точки зрения битовых операций совершенно целесообразно, но модель битовой стоимости менее предсказуема для реального поведения. Даже простой цикл for i = 1 to n: print(i)требует O (n log n) битовых операций.

Jeffε
источник
Хороший момент с петлей. Никогда этого не замечал ...
Томер Вромен
8

Это ответ на «Алгоритм Фишера-Йейтса не лучше наивного алгоритма. Я что-то здесь упускаю?» который вы задали в вопросе.

В вашем «наивном» алгоритме, который использует действительные числа: сколько бит точности вы используете? Если вы рассчитываете сложность битов (как вы, кажется, делаете для Фишера-Йейтса), и алгоритм использует k случайных битов для действительных чисел, тогда его время выполнения будет Ω (kn log n), поскольку сравнение двух k- Битовые действительные числа занимают время (к). Но k должно быть не менее Ω (log n), чтобы два элемента не отображались на одно и то же действительное число, а это означает, что алгоритм занимает Ω (n log 2 n) времени, что медленнее, чем случайное перемешивание Фишера-Йейтса на коэффициент логарифма

Если вы просто подсчитываете количество арифметических операций и операций сравнения и игнорируете их битовую сложность, то значение Фишера-Йейтса равно Θ (n), а ваш алгоритм равен Θ (n log n), но все равно с коэффициентом log n отдельно.

ShreevatsaR
источник
Я подозревал, что у «наивного» алгоритма было такое неявное…
Томер Вромен
1
«Наивный» алгоритм может быть чисто реализован за линейное время следующим образом. Присвойте каждому элементу случайное целое число от 1 до n ^ 3, а затем отсортируйте числа за O (n) времени с помощью сортировки по основанию. (С высокой вероятностью, никакие два элемента не получат одно и то же случайное число. Если есть дубликаты, рекурсивно
переставьте
@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- журналы-с-блок-cost.html

В этом посте Ланс Фортноу описывает, как будучи студентом, он жаловался, что для сортировки действительно требуется n log ^ 2 n времени, если мы должны прочитать все log 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). Если все перестановки одинаково вероятны, то алгоритм как функция от случайных потоков до перестановок должен быть сюръективным. Нет! перестановки, поэтому в чем-то вроде модели дерева решений есть ветви длиной не менее O (log n!) = O (n log n).

1-εО(ε)

Пер Вогсен
источник
3

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

Вкратце: вы думаете с точки зрения ТМ, авторы статьи - с точки зрения РМ. Вы оба правы.

Рафаэль
источник