Спочатку зробимо два, можливо, очевидних, але важливих припущення:
_.random_item
може вибрати останню позицію.
_.random_item
обирає кожну позицію з вірогідністю .1n + 1
Щоб довести правильність свого алгоритму, вам потрібен спонукальний аргумент, аналогічний використаному тут :
- Для одиночного списку є лише одна можливість, тому його вибирають рівномірно.
- нn + 1
Звідси доказ невірний. Про правильний доказ див. Нижче; Я залишаю це тут, тому що помилка та наступні кроки (які є здоровими) можуть бути навчальними.
Корисно дістати місцеве (тобто елементне) властивість, яке має містити, тому що сперечатися про всю перестановку болісно. Зауважте, що перестановка вибирається рівномірно, якщо кожен елемент має однакову ймовірність перебування в кожній позиції, тобто
∀π∈ P e r mнПр( L = π) = 1н !⟺∀i = 1н ∀j = 1нПр( Лi= j ) = 1н( 1 )
n = | L |{ 1 , … , n }
n + 1
- i ∈ { 1 , … , n }j ∈ { 1 , … , n }
- i = n + 1j ∈ { 1 , … , n }
- i ∈ { 1 , … , n + 1 }j = n + 1
ji1n + 1( 1 )pn=1nnps=1n+1random_item
n
Pr(Li=j,i swapped)=Pr(Li=j)⋅Pr(i swapped)=pnps
i,j∈{1,…,n}
njii
Pr(Li=j)=pn(1−ps)=1n⋅nn+1=1n+1
jjii
Pr(Ln+1=j)=∑i=1npnps=∑i=1n1n⋅1n+1=1n+1
ii
Pr(Li=j)=ps=1n+1
Все вийшло добре, ваша стратегія вставки дійсно зберігає однаковість. Силою індукції це доводить, що ваш алгоритм створює рівномірно розподілені перестановки.
Слово попередження: цей доказ розбивається, якщо вставлені елементи не є попарно різними, відповідно. відмітний, бо тоді саме перше рівняння вже не діє. Але ваш алгоритм все ще діє; кожна перестановка з дублікатами породжується однаковою кількістю випадкових страт. Ви можете довести це шляхом маркування дублікатів (тобто, зробивши їх помітними), виконайте вище тестування та видаліть маркування (практично); останній крок згортає рівні розміри перестановок на однакові.
(1)
random_item
L(k){1,…,k}
π′∈Permn+1{1,…,n+1}
π′=(π(1),π(2),…,π(i−1),n+1,π(i+1),…,π(n),π(i))
π∈Permni∈{1,…,n+1}Pr(L(n)=π)=1n!random_item
i1n+1πi
Pr(L(n+1)=π′)=Pr(L(n)=π)⋅Pr(i swapped)=1(n+1)!
що нам довелося показати. Силою індукції це доводить, що ваш алгоритм створює рівномірно розподілені перестановки.
- {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140