Вдохновленный этим вопросом, в котором спрашивающий хочет знать, изменяется ли время выполнения, когда компаратор, используемый в стандартном алгоритме поиска, заменяется честным броском монеты, а также заметной неудачей Microsoft в написании генератора равномерной перестановки, мой вопрос, таким образом, таков: :
Существует ли алгоритм сортировки на основе сравнения, который в зависимости от нашей реализации компаратора будет:
- возвращать элементы в отсортированном порядке при использовании истинного компаратора (то есть сравнение делает то, что мы ожидаем в стандартном алгоритме сортировки)
- возвращать равномерно случайную перестановку элементов, когда компаратор заменяется честным подбрасыванием монеты (то есть возвращение
x < y = true
с вероятностью 1/2, независимо от значений x и y)
Код для алгоритма сортировки должен быть таким же. Только код внутри «черного ящика» сравнения может быть изменен.
Ответы:
Следующий детерминированный (без компаратора) алгоритм работает для входного кортежа :(a1,…,an)
При наличии детерминированного отношения порядка в качестве компаратора этот алгоритм сортирует массив за время поскольку перемешивание Фишера-Йейтса выполняется в O ( n ) с использованием максимального O ( log n).O (nlogн ) O (n) случайная ) неслучайных «случайных битов» (например, вызовов вашего компаратора) ) в каждом шаге сортировка слиянием имеет одинаковую асимптотическую сложность. Результат (1) в этом случае совершенно бесполезен, но поскольку за ним следует реальная сортировка, это не вредит.O (журналн )
Учитывая реальный бросок монеты, когда компаратор (1) переставляет массив с равной вероятностью для каждой перестановки, и если вам действительно нужно сделать (3) (вы пропустили (2) или (2) не смогли определить случайность), это не вред, потому что распределение его результата зависит только от порядка его ввода, который равномерно распределен среди всех перестановок из-за (1), поэтому результат всего алгоритма также равномерно распределен. Количество раз, которое каждая повторная выборка-приемка должна быть геометрически распределена (отклонение с вероятностью ) и, следовательно, имеет ожидаемое значение<2. Каждоеиспользует повторение в большинствелогапбит, поэтому анализ выполнения почти такие жекакв детерминированном случае, но мы получить толькоожидаемое время работыотO(павторизуйтесьп), с возможностью nontermination (только прекращает< 12 < 2 журналN O (nlogн ) почти наверное ).
Как Джо отметил: Если вам не нравится , тест на первый бит в (1), делать (3) , затем (1) и использовать , который всегда 0 , так как массив уже отсортирован в детерминированный случай. Кроме того, вы должны вычесть ваше случайное число из верхней границы диапазона в цикле, потому что верхняя граница для случайного числа дает идентичную перестановку. Но имейте в виду, что (2) тогда запрещено, потому что вы всегда должны делать случайные действия в случае выкупа.aN<a1 0
Вы даже можете использовать те же вызовы для вашего компаратора для (1) и (3), но затем доказать, что результат распределен равномерно, как минимум, намного сложнее, если вообще возможно.
Следующий алгоритм не имеет отдельных фаз для перемешивания и сортировки, но асимптотически медленнее. Это по сути вставка сортировки с бинарным поиском . Я буду использовать для обозначения ввода, а b k = ( b k , 1 , … , b k , k ) для обозначения результата после k-го раунда:
Случайный случай: 5 + условие if из 6 - это, по сути, выборка принятия-отклонения. Остальная часть алгоритма - наивный случайный порядок: перемешайте первые элементов и добавьте kk−1 k элемент в каждую позицию с равной вероятностью. Если бы мы использовали обычную сортировку вставкой, мы бы получили вместо этого биномиальное распределение.
Обратите внимание, что этот алгоритм неэффективен в обоих режимах по сравнению со случайной сортировкой Фишера-Йейтса и сортировкой слиянием, поскольку вставка элемента в произвольную позицию является дорогой, если использование массива и бинарный поиск требуют линейного времени при использовании списка. Но, возможно, модификация сортировки кучи или сортировки дерева подобным образом может привести к более быстрому алгоритму.
источник
источник