Во-первых, давайте сделаем два, возможно, очевидных, но важных предположения:
_.random_item
Можно выбрать последнюю позицию.
_.random_item
выбирает каждую позицию с вероятностью .1n + 1
Чтобы доказать правильность вашего алгоритма, вам нужен индуктивный аргумент, подобный тому, который используется здесь :
- Для одноэлементного списка существует только одна возможность, поэтому он выбирается равномерно.
- Предполагая, что список с элементами был выбран равномерно (из всех перестановок), покажите, что список с n + 1 элементами, полученный по вашей методике, выбран равномерно.Nn + 1
С этого момента доказательство неверно. Пожалуйста, смотрите ниже для правильного доказательства; Я оставляю это здесь, потому что и ошибка, и последующие шаги (которые являются правильными) могут быть образовательными.
Полезно получить локальное (т.е. поэлементное) свойство, которое должно храниться, потому что спорить о всей перестановке болезненно. Заметьте, что перестановка выбирается равномерно, если каждый элемент имеет равную вероятность нахождения в каждой позиции, т.е.
∀π∈ P e r mNPr( L = π) = 1н !⟺∀я = 1N ∀J = 1NPr( Ля= j ) = 1N( 1 )
где и для простоты обозначения мы предполагаем, что вставляем { 1 , … , n } в список.n = | L |{ 1 , … , n }
Теперь давайте посмотрим, что делает ваша техника при вставке го элемента. Мы должны рассмотреть три случая (после обмена):n + 1
- Один из элементов в списке не поменялся местами, т.е. и j ∈ { 1 , … , n }i ∈ { 1 , … , n }j ∈ { 1 , … , n }
- Один из элементов в списке поменялся местами, т.е. и j ∈ { 1 , … , n }я = n + 1j ∈ { 1 , … , n }
- Новый элемент, т.е. и j = n + 1i ∈ { 1 , … , n + 1 }j = n + 1
Для каждого случая мы вычисляем вероятность того, что элемент окажется в позиции i ; все должно быть 1Jя (что достаточно из-за(1)). Пустьpn=11n + 1( 1 ) - вероятность того, что один из первыхnэлементовокажетсяв любой позиции старого списка (гипотеза индукции), аps=1пN= 1NN вероятность выбора какой-либо позиции(предположения 1, 2). Обратите внимание, что выбор списка сnэлементами и выбор позиции свопинга являютсянезависимыми событиями, поэтому вероятности совместного события составляют фактор, напримерпs= 1n + 1random_item
N
Pr( Ля= j , я поменялся местами ) = Pr( Ля= j ) ⋅ Pr( я поменялся местами ) = pNпs
i , j ∈ { 1 , … , n }
NJяя
Pr( Ля= j ) = pN( 1 - рs) = 1N⋅ нn + 1= 1n + 1
JJяя
Pr( Лn + 1= j ) = ∑я = 1NпNпs= ∑я = 1N1N⋅ 1n + 1= 1n + 1
яя
Pr( Ля= j ) = ps= 1n + 1
Все получилось хорошо, ваша стратегия вставки действительно сохраняет единообразие. В силу индукции это доказывает, что ваш алгоритм создает равномерно распределенные перестановки.
Предупреждение: это доказательство ломается, если вставленные элементы не отличаются попарно, соответственно. различимы, потому что тогда самое первое уравнение больше не действует. Но ваш алгоритм все еще действует; каждая перестановка с дубликатами генерируется одинаковым количеством случайных выполнений. Вы можете доказать это, пометив дубликаты (то есть сделав их различимыми), выполнив приведенные выше проверки и удалив маркировку (виртуально); последний шаг объединяет равные по размеру наборы перестановок в одно и то же.
( 1 )
random_item
L( к ){ 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