Чи існує алгоритм «сортування», який повертає випадкову перестановку при використанні компаратора монети?


9

Натхненний цим запитанням, в якому запитувач хоче знати, чи змінюється час роботи, коли компаратор, який використовується в стандартному алгоритмі пошуку, замінений на чесне монтування, а також відома невдача Microsoft в тому, щоб написати рівномірний генератор перестановки, моє питання таким чином :

Чи існує алгоритм сортування на основі порівняння, який буде залежно від нашої реалізації компаратора:

  1. повертайте елементи в упорядкованому порядку при використанні справжнього компаратора (тобто порівняння робить те, що ми очікуємо в стандартному алгоритмі сортування)
  2. повернути рівномірну випадкову перестановку елементів, коли компаратор буде замінено справедливим переворотом монети (тобто повернення x < y = trueз вірогідністю 1/2, незалежно від значення х і у)

Код алгоритму сортування повинен бути однаковим. Змінювати можна лише код всередині "чорної скриньки" порівняння.


Дивіться також це питання .
Рафаель

2
Дивіться також наступний цікаве питання: cstheory.stackexchange.com/questions/5321 / ... .
Yuval Filmus

1
Ви хочете, щоб ваш випадковий порівняльник був добре поведений? Ось два можливі способи. (1) Як тільки компаратор це вирішитьx<y, тоді x<y завжди, і теж y>x. (2) Те саме, але якщо крім того, порівняльник вирішить цеx<y і y<z, тоді вона зобов'язується x<zz>x). В обох випадках кожен необмежений запит все ще є абсолютно випадковим.
Yuval Filmus

@YuvalFilmus Я хочу, по суті, те, про що йдеться у вашому пов'язаному питанні, за винятком того, що та сама схема повинна також сортуватися, якщо ми замінимо випадкові ворота на ворота порівняння-обміну, які замовляють пару елементів.
Джо

1
Дивіться тут для хороших візуалізацій.
Рафаель

Відповіді:


3

Наступний детермінований (без компаратора) алгоритм працює для вхідного кортежу (a1,,an):

  1. Зробіть перемішування Фішера-Йейта, використовуючи компаратор зі статичною парою (скажімоa1<a2) у вигляді монети (відбір проб приймання-відхилення). Якщо компаратор виходить1 перший раз, використовуйте його перевернуто, щоб уникнути нескінченного циклу відхилення у детермінованому випадку.
  2. (Необов’язкове прискорення: спробуйте одну пару n часи, де n- це довжина або ваш вхід. Якщо будь-які два виходи відрізняються, поверніть перестановку, отриману в (1))
  3. Сортуйте масив за допомогою сортування об'єднань.

Враховуючи детерміновані відношення порядку як компаратора, цей алгоритм сортує масив за часом O(nlogn) оскільки перетасовка Фішера-Йейта пробігає O(n) використовуючи максимальний O(logn)не випадкові "випадкові біти" (наприклад, дзвінки до вашого компаратора) на кожному кроці та сортування злиття мають однакову асимптотичну складність. Результат (1) в цьому випадку абсолютно марний, але оскільки за ним слідує реальний сорт, це не шкодить.

З огляду на справжнє перевертання монет у порівнянні (1) перестановляє масив з однаковою ймовірністю для кожної перестановки, і якщо вам дійсно потрібно зробити (3) (ви вийшли з ладу (2) або (2) не змогли визначити випадковість), це не шкода, оскільки розподіл його результату залежить лише від порядку його введення, який рівномірно розподілений між усіма перестановками через (1), тому результат усього алгоритму також рівномірно розподілений. Геометрично розподіляється кількість повторень відбору вибірки приймання-відхилення (відхилення з вірогідністю)<12) і тому вона має очікувану цінність <2. Кожне повторення використовує максимумlognбіт, тому аналіз виконання майже такі ж , як і в детермінованому випадку, але ми тільки отримати очікуваний час роботи відO(nlogn), з можливістю незахищення (припиняється лише майже напевно ).


Як вказував Джо: Якщо ви не любите тест перший біт в (1), зробіть (3), то (1) і використовуйте an<a1 який є завжди 0, оскільки масив вже відсортований у детермінованому випадку. Крім того, ви повинні відняти випадкове число від верхньої межі діапазону в циклі, оскільки верхня межа для випадкового числа дає однакову перестановку. Але майте на увазі, що (2) заборонено тоді, тому що завжди потрібно робити перетасування у випадку викупу.


Ви навіть можете використовувати ті самі дзвінки до свого порівняльника для (1) та (3), але потім довести, що результат рівномірно розподілений, принаймні набагато складніше, якщо це можливо взагалі.


Наступний алгоритм не має чітких фаз переміщення та сортування, але є асимптотично повільнішим. Це по суті сортування вставки з двійковим пошуком . Я буду використовуватиa=(a1,,an) позначити вхід і bk=(bk,1,,bk,k) для позначення результату після k-й тур:

  1. Встановити b1,1=a1
  2. Якщо a2<a1 тоді b2=(a2,a1) і (c,d):=(2,1) ще b2=(a1,a2) і (c,d):=(1,2). В будь-якому випадкуad<ac завжди буде 0 (тобто хибне) для не випадкового порівняння.
  3. Для отримання bk для k3 отримати bk1 спочатку.
  4. Дозволяє l=log2k і k=2l, тобто k - найменша потужність 2 не менше, ніж k.
  5. Дозволяє i0=0. Для кожногоj{1,,l} дозволяє
    ij={ij1+2ljij1+2lj>k1ad<acij1ij1+2lj>k1¬(ad<ac)ij1+2ljij1+2ljk1bk1,ij1+2lj<akij1ij1+2ljk1¬(bk1,ij1+2lj<ak)
  6. Якщо il>k повторити (5.) інше bk=(bk1,1,,bk1,il1,ak,bk1,il,,bk1,k1)
  7. Вихідні дані bn

Випадковий випадок: 5 +, якщо пункт 6 є по суті вибіркою прийняття-відхилення. Решта алгоритму - це наївна перетасовка: перетасувати першуk1 елементів і додайте k-елемент до кожної позиції з однаковою ймовірністю. Якби ми використовували звичайний сортування вставки, ми отримали б біноміальне розподіл.

Зауважте, що цей алгоритм є неефективним в обох режимах порівняно з перемиканням Fisher-Yates та сортуванням, оскільки вставлення елемента у довільну позицію дороге, якщо для використання масиву та двійкового пошуку потрібен лінійний час, якщо використовується список. Але, можливо, модифікація сортування купи або сортування дерева аналогічним чином може призвести до більш швидкого алгоритму.


@Joe Ви можете помістити всі ваші бали, які все ще є дійсними для публікації в поточній формі, в один коментар і видалити решту?
frafl

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

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

Перший коментар: Зауважте, що я не викидаю цей перший зразок, це "подвійне використання". Я думав про інвертування кожного 2-го біта, але це не завадило б нескінченному циклу. Насправді потрібен певний нерегулярний зразок і навіть може відхилити набагато більше записів. Звичайно, я міг би створити два останні біти замість першого та найсвіжішого, але це не зовсім інакше.
frafl

Другий коментар: Порядок (1) проти (3) важливий лише в тому випадку, якщо ви використовуєте крок (2), оскільки у випадковому випадку вам потрібно переконатися, що перетасування зроблено з ймовірністю 1, інакше рівномірний розподіл буде порушений. Чому це повинно залежатиi? В цьому випадкуan<a1 завжди відповідатиме 0, що все, що нам потрібно.
frafl

4

Ні, це неможливо, якщо тільки n2. Ймовірність того, що перестановка генерується вашим алгоритмом за допомогою випадкового компаратора, є діадичною, тобто формоюA/2B, тоді як вірогідність повинна бути 1/n!. Колиn>2, немає можливості писати 1/n! у формі A/2B.


1
Але це справедливо лише в тому випадку, якщо нам потрібен детермінований обмежений час виконання, про що не вимагали у питанні. Якщо ми вимагаємо лише очікуваний час виконання буде обмеженим, це не повинно бути жодних проблем.
frafl

1
Чи знаєте ви будь-який розумний алгоритм сортування, який не закінчується в поліноміальний час?
Yuval Filmus

2
Ви змішуєте детермінований і випадковий випадок. Алгоритм може закінчуватися в детермінованому поліномному часі, якщо його викликають у детермінованому співвідношенні порядку і в очікуваний час полінома, якщо його називають монетою як компаратора.
frafl

@YuvalFilmus чому має бути дерево рішень 2kлистя?
Джо

Якщо ви займаєтесь kпорівняння в цілому, то ймовірність будь-якої події буде мати формуA/2k. Йдеться не про кількість листя. Єдиний вихід, як пропонує frafl, має необмежену кількість порівнянь.
Yuval Filmus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.