Wie beweise ich die Korrektheit eines Shuffle-Algorithmus?

24

Ich habe zwei Möglichkeiten, eine Liste von Elementen in zufälliger Reihenfolge zu erstellen und möchte feststellen, ob sie gleichermaßen fair (unvoreingenommen) sind.

Die erste Methode, die ich verwende, besteht darin, die gesamte Liste der Elemente zu erstellen und sie dann zu mischen (z. B. eine Fisher-Yates-Mischung). Die zweite Methode ist eher eine iterative Methode, bei der die Liste bei jeder Einfügung gemischt wird. Im Pseudocode lautet die Einfügefunktion:

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

Ich bin daran interessiert, wie man die Fairness dieses speziellen Mischens demonstriert. Die Vorteile dieses Algorithmus, wo er verwendet wird, reichen aus, dass es in Ordnung wäre, auch wenn er etwas unfair ist. Um zu entscheiden, brauche ich einen Weg, um seine Fairness zu bewerten.

Meine erste Idee ist, dass ich die auf diese Weise möglichen Gesamtpermutationen im Vergleich zu den für eine Menge der endgültigen Länge möglichen Gesamtpermutationen berechnen muss. Ich bin jedoch ein bisschen ratlos darüber, wie man die Permutationen berechnet, die sich aus diesem Algorithmus ergeben. Ich kann auch nicht sicher sein, ob dies der beste oder einfachste Ansatz ist.

edA-qa mort-ora-y
quelle
Sie können eine statistische Stichprobe über eine große Anzahl von Läufen Ihres Algorithmus erstellen und mit dem erwarteten Wert vergleichen oder eine Art Zufallstest durchführen.
Dave Clarke
Sie möchten die Distribution testen. Ist es gleichmäßig verteilt oder schief. Ich vermute jedoch, dass Sie es viele, viele Male ausführen müssten.
Dave Clarke
Mir ist nicht klar, wie ich das machen würde. Es ist nicht die Zufälligkeit der Inhalte, nach denen ich suche, sondern die Zufälligkeit der Reihenfolge. Welcher Ansatz kann die Verteilung der Bestellung messen?
edA-qa mort-ora-y
Ach, dumm, ich könnte einen festen Eingabesatz verwenden und die Endposition jedes Elements verwenden, um eine Verteilung zu erhalten. Trotzdem würde ich eigentlich eher einen logischen Beweis als eine Simulation bevorzugen.
edA-qa mort-ora-y
@ edA-qamort-ora-y: Dein Wunsch ist mein Befehl. ;)
Raphael

Antworten:

22

Lassen Sie uns zunächst zwei vielleicht offensichtliche, aber wichtige Annahmen machen:

  1. _.random_item kann die letzte Position wählen.
  2. _.random_itemwählt jede Position mit der Wahrscheinlichkeit .1n+1

Um die Korrektheit Ihres Algorithmus zu beweisen, benötigen Sie ein induktives Argument ähnlich dem hier verwendeten :

  • Für die Singleton-Liste gibt es nur eine Möglichkeit, daher wird sie einheitlich ausgewählt.
  • Angenommen, die Liste mit Elementen wurde einheitlich ausgewählt (aus allen Permutationen), zeigen Sie, dass die mit Ihrer Technik erhaltene Liste mit Elementen einheitlich ausgewählt ist.n + 1nn+1

Ab hier ist der Beweis falsch. Einen korrekten Beweis finden Sie weiter unten. Ich lasse dies hier, weil sowohl der Fehler als auch die folgenden Schritte (die stichhaltig sind) lehrreich sein könnten.

Es ist nützlich, eine lokale (dh elementweise) Eigenschaft abzuleiten, die gelten muss, da es schmerzhaft ist, über die gesamte Permutation zu streiten. Beachten Sie, dass eine Permutation gleichmäßig gewählt wird, wenn jedes Element die gleiche Wahrscheinlichkeit hat, sich an jeder Position zu befinden, d. H

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

wound wir nehmen aus Gründen der Vereinfachung der Notation an, dass wir in die Liste einfügen .{ 1 , , n }n=|L|{1,,n}

Lassen Sie uns nun sehen, was Ihre Technik macht, wenn Sie das te Element einfügen . Wir müssen drei Fälle berücksichtigen (nach dem Tausch):n+1

  1. Eines der Elemente in der Liste, nicht vertauscht, dh undj { 1 , , n }i{1,,n}j{1,,n}
  2. Eines der Elemente in der Liste ist vertauscht, dh undj { 1 , , n }i=n+1j{1,,n}
  3. Das neue Element, dh undj = n + 1i{1,,n+1}j=n+1

Für jeden Fall berechnen wir die Wahrscheinlichkeit, dass sich das Element an Position ; alle müssen sich als herausstellen (was wegen ausreicht ). Sei die Wahrscheinlichkeit, dass sich eines der ersten Elemente an einer beliebigen Position in der alten Liste befindet (Induktionshypothese), und die Wahrscheinlichkeit von jede Position, die gewählt wird von (Annahmen 1, 2). Beachten Sie, dass der Koex der Liste mit Elementen und die Auswahl der Swap-Position unabhängige Ereignisse sind , sodass die Wahrscheinlichkeiten gemeinsamer Ereignisse zi 1ji (1)pn=11n+1(1) npn=1pn=1nn nps=1n+1random_itemn

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

für . Nun zu den Berechnungen.i,j{1,,n}

  1. Wir betrachten nur die alten Elemente. Ein solches Element befindet sich an Positionjnjii

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

  2. jjii

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

  3. Das neue Element landet genau dann an Position wenn als Swap-Position gewählt wurdeichii

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

Alles in allem hat sich herausgestellt, dass Ihre Einfügestrategie tatsächlich die Einheitlichkeit bewahrt. Induziert beweist dies, dass Ihr Algorithmus gleichmäßig verteilte Permutationen erzeugt.

Ein Wort der Warnung: Dieser Beweis bricht zusammen, wenn die eingefügten Elemente nicht paarweise unterschiedlich sind bzw. unterscheidbar, weil dann die allererste Gleichung nicht mehr gültig ist. Ihr Algorithmus ist jedoch weiterhin gültig. Jede Permutation mit Duplikaten wird durch die gleiche Anzahl zufälliger Ausführungen generiert. Sie können dies beweisen, indem Sie Duplikate markieren (dh sie unterscheidbar machen), den obigen Beweis durchführen und die Markierungen (virtuell) entfernen. Im letzten Schritt werden gleich große Sätze von Permutationen zu denselben reduziert.


Wie Steven in den Kommentaren richtig bemerkt hat, ist der obige Beweis von Grund auf fehlerhaft, da nicht zutrifft; Sie können Verteilungen auf der Menge der Permutationen konstruieren, die die rechte, aber nicht die linke Seite erfüllen¹.(1)

Daher müssen wir mit Permutationswahrscheinlichkeiten arbeiten, was sich schließlich als nicht so schlecht herausstellt. Die Annahmen zu random_itemund die induktive Struktur, die zu Beginn des Beitrags beschrieben wurden, bleiben bestehen, wir fahren von dort fort. Let die Liste bezeichnen , nachdem eingefügt wurde. { 1 , , k }L(k){1,,k}

Es sei eine beliebige Permutation von . Es kann eindeutig als geschrieben werdenπPermn+1{1,,n+1}

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

für einige und . Nach Induktionshypothese ist . Außerdem wird Position mit der Wahrscheinlichkeit angenommen. Da die zufälligen Entscheidungen von und (stochastisch) unabhängig sind, erhalten wirπ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)!

was wir zeigen mussten. Induziert beweist dies, dass Ihr Algorithmus gleichmäßig verteilte Permutationen erzeugt.


  1. Weisen Sie beispielsweise jede Permutation in Wahrscheinlichkeit und alle anderen . Es gibt auch Beispiele, die jeder Permutation eine Wahrscheinlichkeit ungleich Null zuweisen.1{(1,2,3,4),(2,3,4,1),(3,4,1,2),(4,1,2,3)} 0140
Raphael
quelle
4
'Beachten Sie, dass eine Permutation einheitlich gewählt wird, wenn jedes Element die gleiche Wahrscheinlichkeit hat, an jeder Position zu sein' - das ist nicht wahr. Zum Beispiel die Menge von vier Permutationen auf vier Elementen {(1, 2, 3, 4), (2, 3, 4, 1), (3, 4, 1, 2), (4, 1, 2, 3 )} erfüllt Ihre Einschränkung, ist aber offensichtlich nicht die Menge aller Permutationen. Leider müssen Sie globale Eigenschaften Ihrer Permutation verwenden, da keine lokalen Bedingungen ausreichen, um die Homogenität zu bestimmen.
Steven Stadnicki