Najpierw stwórzmy dwa, być może oczywiste, ale ważne założenia:
_.random_item
może wybrać ostatnią pozycję.
_.random_item
wybiera każdą pozycję z prawdopodobieństwem .1n + 1
Aby udowodnić poprawność algorytmu, potrzebujesz argumentu indukcyjnego podobnego do zastosowanego tutaj :
- W przypadku listy singletonów istnieje tylko jedna możliwość, dlatego jest ona wybierana jednolicie.
- Zakładając, że lista z elementami została wybrana jednolicie (ze wszystkich permutacji), pokaż, że ta z n + 1 elementami uzyskanymi za pomocą twojej techniki jest jednolicie wybrana.nn + 1
Odtąd dowód jest błędny. Poniżej znajduje się poprawny dowód; Zostawiam to tutaj, ponieważ zarówno błąd, jak i następujące kroki (które są rozsądne) mogą być pouczające.
Przydatne jest wyprowadzenie lokalnej (tj. Elementowej) właściwości, która musi zostać zachowana, ponieważ kłótnie o całą permutację są bolesne. Zauważ, że permutacja jest wybierana równomiernie, jeśli każdy element ma równe prawdopodobieństwo bycia w każdej pozycji, tj
∀π∈ P e r mnPr( L = π) = 1n !⟺∀i = 1n ∀j = 1nPr( Lja= j ) = 1n( 1 )
gdzie i zakładamy dla uproszczenia, że wstawiamy { 1 , … , n } do listy.n = | L |{ 1 , … , n }
Zobaczmy teraz, co robi Twoja technika przy wstawianiu elementu . Musimy rozważyć trzy przypadki (po zamianie):n + 1
- Jeden z elementów na liście, nie zamieniony, tj. i j ∈ { 1 , … , n }i ∈ { 1 , … , n }j ∈ { 1 , … , n }
- Jeden z elementów na liście, zamieniony, tj. i j ∈ { 1 , … , n }i = n + 1j ∈ { 1 , … , n }
- Nowy element, tj. i j = n + 1i ∈ { 1 , … , n + 1 }j = n + 1
Dla każdego przypadku obliczamy prawdopodobieństwo, że element będzie w pozycji i ; wszystkie muszą być 1jotja (co jest wystarczające z powodu(1)). Niechpn=11n + 1( 1 ) oznacza prawdopodobieństwo, że jeden z pierwszychnelementów znajdzie się w dowolnej pozycji na starej liście (hipoteza indukcyjna), aps=1pn= 1nn prawdopodobieństwo, że dowolna pozycja zostanie wybrana przez(założenia 1, 2). Zwróć uwagę, że coice listy zelementamini wybranie pozycji zamiany sązdarzeniami niezależnymi, więc prawdopodobieństwo czynników wspólnych zdarzeń, np.ps= 1n + 1random_item
n
Pr( Lja= J , i zamieniane ) = Pr( Lja= j ) ⋅ Par( I zamienione ) = Pnps
dla . Teraz do obliczeń.i , j ∈ { 1 , … , n }
Bierzemy pod uwagę tylko stare elementów. Taki element J znajduje się w pozycji i tylko wtedy, gdy to było przed ostatnim wkładania oraz i nie wchodzi w położeniu wymiany, to jest njotjaja
.Pr( Lja= j ) = pn( 1 - ps) = 1n. Nn + 1= 1n + 1
Uważamy tutaj, że jeden ze starych elementów jest zamieniany na ostatnią pozycję. Element mógł znajdować się na dowolnej ze starych pozycji, więc sumujemy wszystkie prawdopodobieństwa, że j było na pozycji i, a i wybrano jako pozycję wymiany, to znaczyjotjotjaja
.Pr( Ln + 1= j ) = ∑i = 1npnps= ∑i = 1n1n⋅ 1n + 1= 1n + 1
Nowy element kończy się w pozycji wtedy i tylko wtedy, gdy i jest wybrane jako pozycja wymiany, to znaczyjaja
.Pr( Lja= j ) = ps= 1n + 1
Wszystko okazało się dobrze, twoja strategia wstawiania rzeczywiście zachowuje jednolitość. Dzięki sile indukcji dowodzi to, że algorytm tworzy jednolicie rozmieszczone permutacje.
Słowo ostrzeżenia: dowód ten psuje się, jeśli wstawione elementy nie są połączone parami inaczej. rozróżnialne, ponieważ wtedy pierwsze równanie nie jest już ważne. Ale twój algorytm jest nadal aktualny; każda permutacja z duplikatami jest generowana przez tę samą liczbę losowych wykonań. Możesz to udowodnić, zaznaczając duplikaty (tzn. Czyniąc je rozróżnialnymi), wykonaj powyższy dowód i usuń oznaczenia (praktycznie); ostatni krok zwija zestawy równych rozmiarów permutacji do tego samego.
Jak słusznie zauważył Steven w komentarzach, powyższy dowód jest zasadniczo wadliwy, ponieważ nie ma zastosowania; możesz konstruować rozkłady na zbiorze permutacji, które spełniają prawą, ale nie lewą stronę¹.( 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)!
które musieliśmy pokazać. Dzięki sile indukcji dowodzi to, że algorytm tworzy jednolicie rozmieszczone permutacje.
- {(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)}140