Як довести правильність алгоритму переміщення?


24

У мене є два способи скласти список предметів у випадковому порядку і я хотів би визначити, чи є вони однаково справедливими (неупередженими).

Перший метод, який я використовую, - це побудувати весь список елементів, а потім зробити переміщення на ньому (скажімо, перемішання Фішера-Йейта). Другий метод є скоріше ітераційним методом, який зберігає список перетасованим при кожній вставці. У псевдокоді функцією вставки є:

insert( list, item )
    list.append( item )
    swap( list.random_item, list.last_item )

Мене цікавить, як можна продемонструвати справедливість цього конкретного переміщення. Переваг цього алгоритму, де він використовується, достатньо, щоб навіть у випадку несправедливості це було б добре. Щоб вирішити, мені потрібен спосіб оцінити його справедливість.

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


Ви можете зробити статистичну вибірку за великою кількістю запусків свого алгоритму і порівняти його з очікуваним значенням або виконати якийсь тест на випадковість.
Дейв Кларк

Ви хочете перевірити розподіл. Він рівномірно розподілений, або перекошений. Але я підозрюю, що вам доведеться запускати його багато-багато разів.
Дейв Кларк

Мені не ясно, як я це зробив. Це не випадковість вмісту, за яким я переслідую, а випадковість впорядкування. Який підхід може виміряти розподіл замовлення?
edA-qa mort-ora-y

Ах, нерозумно, я міг би використовувати фіксований набір входів і використовувати остаточне положення кожного елемента, щоб отримати розподіл. І все-таки я б вважав за краще скоріше логічний доказ, ніж моделювання.
edA-qa mort-ora-y

@ edA-qamort-ora-y: Ваше бажання - це моя команда. ;)
Рафаель

Відповіді:


22

Спочатку зробимо два, можливо, очевидних, але важливих припущення:

  1. _.random_item може вибрати останню позицію.
  2. _.random_itemобирає кожну позицію з вірогідністю .1n+1

Щоб довести правильність свого алгоритму, вам потрібен спонукальний аргумент, аналогічний використаному тут :

  • Для одиночного списку є лише одна можливість, тому його вибирають рівномірно.
  • nn+1

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

Корисно дістати місцеве (тобто елементне) властивість, яке має містити, тому що сперечатися про всю перестановку болісно. Зауважте, що перестановка вибирається рівномірно, якщо кожен елемент має однакову ймовірність перебування в кожній позиції, тобто

πPermnPr(L=π)=1n!i=1n j=1nPr(Li=j)=1n(1)

n=|L|{1,,n}

n+1

  1. i{1,,n}j{1,,n}
  2. i=n+1j{1,,n}
  3. i{1,,n+1}j=n+1

ji1n+1(1)pn=1nnps=1n+1random_itemn

Pr(Li=j,i swapped)=Pr(Li=j)Pr(i swapped)=pnps

i,j{1,,n}

  1. njii

    Pr(Li=j)=pn(1ps)=1nnn+1=1n+1

  2. jjii

    Pr(Ln+1=j)=i=1npnps=i=1n1n1n+1=1n+1

  3. ii

    Pr(Li=j)=ps=1n+1

Все вийшло добре, ваша стратегія вставки дійсно зберігає однаковість. Силою індукції це доводить, що ваш алгоритм створює рівномірно розподілені перестановки.

Слово попередження: цей доказ розбивається, якщо вставлені елементи не є попарно різними, відповідно. відмітний, бо тоді саме перше рівняння вже не діє. Але ваш алгоритм все ще діє; кожна перестановка з дублікатами породжується однаковою кількістю випадкових страт. Ви можете довести це шляхом маркування дублікатів (тобто, зробивши їх помітними), виконайте вище тестування та видаліть маркування (практично); останній крок згортає рівні розміри перестановок на однакові.


(1)

random_itemL(k){1,,k}

πPermn+1{1,,n+1}

π=(π(1),π(2),,π(i1),n+1,π(i+1),,π(n),π(i))

πPermni{1,,n+1}Pr(L(n)=π)=1n!random_itemi1n+1πi

Pr(L(n+1)=π)=Pr(L(n)=π)Pr(i swapped)=1(n+1)!

що нам довелося показати. Силою індукції це доводить, що ваш алгоритм створює рівномірно розподілені перестановки.


  1. {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140

4
"Зауважте, що перестановка вибирається рівномірно, якщо кожен елемент має однакову ймовірність перебування на кожній позиції" - це неправда. Наприклад, безліч чотирьох перестановок на чотири елементи {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3 )} задовольняє ваше обмеження, але очевидно, це не безліч усіх перестановок. На жаль, вам доведеться використовувати глобальні властивості перестановки, тому що для визначення однорідності недостатньо локальних умов.
Стівен Стадницький
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.