Gibt es einen Sortieralgorithmus, der bei Verwendung eines Münzwurfkomparators eine zufällige Permutation zurückgibt?


9

Inspiriert von dieser Frage, bei der der Fragesteller wissen möchte, ob sich die Laufzeit ändert, wenn der in einem Standardsuchalgorithmus verwendete Komparator durch einen fairen Münzwurf ersetzt wird, und auch von Microsofts prominentem Versagen, einen einheitlichen Permutationsgenerator zu schreiben, ist meine Frage daher ::

Gibt es einen vergleichsbasierten Sortieralgorithmus, der abhängig von unserer Implementierung des Komparators:

  1. Geben Sie die Elemente in sortierter Reihenfolge zurück, wenn Sie einen echten Komparator verwenden (dh der Vergleich macht das, was wir von einem Standardsortieralgorithmus erwarten).
  2. Geben Sie eine gleichmäßig zufällige Permutation der Elemente zurück, wenn der Komparator durch einen fairen Münzwurf ersetzt wird (dh geben Sie x < y = truemit der Wahrscheinlichkeit 1/2 zurück, unabhängig vom Wert von x und y).

Der Code für den Sortieralgorithmus muss identisch sein. Nur der Code in der Vergleichsbox "Black Box" darf sich ändern.


Siehe auch diese Frage .
Raphael

2
Siehe auch die folgende interessante Frage: cstheory.stackexchange.com/questions/5321/… .
Yuval Filmus

1
Möchten Sie, dass sich Ihr Zufallskomparator gut benimmt? Hier sind zwei Möglichkeiten. (1) Sobald der Komparator feststellt, dass , dann immer und auch . (2) Gleich, aber wenn der Komparator weiterhin entscheidet, dass und , dann verpflichtet er sich zu (und ). In beiden Fällen ist jede uneingeschränkte Abfrage immer noch völlig zufällig. x < y y > x x < y y < z x < z z > xx<yx<yy>xx<yy<zx<zz>x
Yuval Filmus

@YuvalFilmus Ich möchte im Wesentlichen, was in Ihrer verknüpften Frage verlangt wird, außer dass dieselbe Schaltung auch sortieren sollte, wenn wir das zufällige Gatter durch ein Vergleichstauschgatter ersetzen, das das Elementpaar ordnet.
Joe

1
Sehen Sie hier für schöner Visualisierungen.
Raphael

Antworten:


3

Der folgende deterministische Algorithmus (ohne Komparator) funktioniert für ein Eingabetupel :(a1,,an)

  1. Führen Sie den Fisher-Yates-Shuffle mit Ihrem Komparator mit einem statischen Paar (z. B. ) als Münzwurf durch (Abtastung von Akzeptanz und Ablehnung). Wenn der Komparator das erste Mal ausgibt , verwenden Sie ihn invertiert, um im deterministischen Fall eine endlose Zurückweisungsschleife zu vermeiden. 1a1<a21
  2. (Optionale Beschleunigung: Versuchen Sie ein einzelnes Paar mal, wobei die Länge oder Ihre Eingabe ist. Wenn sich zwei der Ausgaben unterscheiden, geben Sie die in (1) erhaltene Permutation zurück.)nnn
  3. Sortieren Sie Ihr Array mithilfe der Zusammenführungssortierung.

Bei einer deterministischen Ordnungsbeziehung als Komparator sortiert dieser Algorithmus ein Array in der Zeit da die Fisher-Yates-Zufallswiedergabe in Verwendung von maximal Nicht zufällige "Zufallsbits" (z. B. Aufrufe Ihres Komparators) in jedem Schritt und Zusammenführungssortierung haben dieselbe asymptotische Komplexität. Das Ergebnis von (1) ist in diesem Fall völlig nutzlos, aber da es von einer echten Art gefolgt wird, schadet dies nicht.O ( n ) O ( log n )O(nlogn)O(n)O(logn)

Wenn ein echter Münzwurf als Komparator (1) das Array mit gleicher Wahrscheinlichkeit für jede Permutation permutiert und wenn Sie wirklich (3) tun müssen (Sie haben (2) oder (2) ausgelassen, um die Zufälligkeit nicht zu bestimmen), ist dies nein Schaden, weil die Verteilung seines Ergebnisses nur von der Reihenfolge seiner Eingabe abhängt, die aufgrund von (1) gleichmäßig auf alle Permutationen verteilt ist, so dass auch das Ergebnis des gesamten Algorithmus gleichmäßig verteilt ist. Die Häufigkeit, mit der jede Akzeptanz-Zurückweisungs-Abtastung wiederholt werden muss, ist geometrisch verteilt (Zurückweisung mit der Wahrscheinlichkeit ) und hat daher einen erwarteten Wert . Jede Wiederholung verwendet höchstens Bits, sodass die Laufzeitanalyse fast dieselbe ist wie im deterministischen Fall, aber wir erhalten nur eine <2lognO(nlogn)<12<2lognerwartete Laufzeit von mit der Möglichkeit der Nichtbeendigung (endet nur fast sicher ).O(nlogn)


Wie Joe betonte: Wenn Ihnen der Test für das erste Bit in (1) nicht gefällt, machen Sie (3) und dann (1) und verwenden Sie das immer , da das Array im deterministischen Fall bereits sortiert ist . Zusätzlich müssen Sie Ihre Zufallszahl von der Obergrenze des Bereichs in der Schleife subtrahieren, da die Obergrenze für die Zufallszahl die identische Permutation ergibt. Beachten Sie jedoch, dass (2) dann verboten ist, da Sie im Lösegeldfall immer mischen müssen.an<a10


Sie können für (1) und (3) sogar dieselben Aufrufe an Ihren Komparator verwenden, aber dann zu beweisen, dass das Ergebnis gleichmäßig verteilt ist, ist zumindest viel schwieriger, wenn überhaupt möglich.


Der folgende Algorithmus hat keine unterschiedlichen Phasen zum Mischen und Sortieren, ist jedoch asymptotisch langsamer. Es handelt sich im Wesentlichen um eine Einfügesortierung mit binärer Suche . Ich werde , um die Eingabe zu bezeichnen, und , um das Ergebnis nach der ten Runde zu bezeichnen:a=(a1,,an)bk=(bk,1,,bk,k)k

  1. Setzeb1,1=a1
  2. Wenn dann ist und sonst und . In beiden Fällen ist für einen nicht zufälligen Komparator immer (dh falsch).a2<a1b2=(a2,a1)(c,d):=(2,1)b2=(a1,a2)(c,d):=(1,2)ad<ac0
  3. Um für erhalten, erhalten Sie zuerst .bkk3bk1
  4. Sei und , dh ist die kleinste Potenz von nicht kleiner als .l=log2kk=2lk2k
  5. Sei . Für jedes lasse i0=0j{1,,l}
    ij={ij1+2ljij1+2lj>k1ad<acij1ij1+2lj>k1¬(ad<ac)ij1+2ljij1+2ljk1bk1,ij1+2lj<akij1ij1+2ljk1¬(bk1,ij1+2lj<ak)
  6. Wenn (5.) wiederholen, sonstb k = ( b k - 1 , 1 , ... , b k - 1 , i l - 1 , a k , b k - 1 , i l , ... , b k - 1 , k - 1 )il>kbk=(bk1,1,,bk1,il1,ak,bk1,il,,bk1,k1)
  7. Ausgabebn

Zufälliger Fall: 5 + Die if-Klausel von 6 ist im Wesentlichen eine Akzeptanz-Ablehnungs-Stichprobe. Der Rest des Algorithmus ist ein naives Mischen: Mischen Sie die ersten Elemente und fügen Sie das te Element mit gleicher Wahrscheinlichkeit zu jeder Position hinzu. Wenn wir die normale Einfügungssortierung verwenden würden, würden wir stattdessen eine Binomialverteilung erhalten.kk1k

Beachten Sie, dass dieser Algorithmus in beiden Modi im Vergleich zum Fisher-Yates-Shuffle- und Merge-Sortieren ineffizient ist, da das Einfügen eines Elements an eine beliebige Position teuer ist, wenn ein Array verwendet wird und die binäre Suche bei Verwendung einer Liste lineare Zeit benötigt. Aber vielleicht könnte eine Modifikation der Heap-Sortierung oder der Baumsortierung auf ähnliche Weise zu einem schnelleren Algorithmus führen.


@Joe kannst du alle deine noch gültigen Punkte für den Beitrag in der aktuellen Form in einem Kommentar zusammenfassen und den Rest löschen?
vom

Ich hatte auf einen Algorithmus gehofft, der keine unterschiedlichen Schritte ausführt, je nachdem, welcher Komparator verwendet wird. Können Sie eine unendliche Ablehnungsschleife vermeiden, ohne den Komparator zu prüfen? Ich denke, Sie könnten die Ablehnung vermeiden, indem Sie zuerst Schritt (3) ausführen ...
Joe

Was ist, wenn Sie den Sortierschritt ausführen und dann mischen, aber eine Folge von Vergleichen verwenden, die vom Index abhängen , sodass Sie im deterministischen Fall den Index des Elements erhalten (kein Swap) und es sortiert bleibt. Im zufälligen Fall führen Sie jedoch das Standard-Shuffle mit Ablehnungsabtastung durch. i
Joe

Erster Kommentar: Beachten Sie, dass ich das erste Beispielbit nicht wegwerfe, es ist "Dual Use". Ich dachte darüber nach, jedes zweite Bit zu invertieren, aber das würde die Endlosschleife nicht verhindern. Tatsächlich wird ein unregelmäßiges Muster benötigt und kann sogar viel mehr Einträge ablehnen. Natürlich könnte ich die beiden neuesten Bits anstelle des ersten und des neuesten XOR-verknüpfen, aber das ist nicht wirklich anders.
frafl

Zweiter Kommentar: Die Reihenfolge (1) vs. (3) ist nur wichtig, wenn Sie Schritt (2) verwenden, da Sie im Zufallsfall sicherstellen müssen, dass das Mischen mit der Wahrscheinlichkeit 1 durchgeführt wird, da sonst die Gleichverteilung verletzt wird. Warum sollte es hängt davon ab ? In diesem Fall antwortet immer mit , was alles ist, was wir brauchen. a n < a 1 0ian<a10
vom

4

Nein, dies ist nur möglich, wenn . Die Wahrscheinlichkeit, dass eine Permutation von Ihrem Algorithmus unter Verwendung eines Zufallskomparators erzeugt wird, ist dyadisch, dh von der Form , während die Wahrscheinlichkeit betragen sollte. Wenn , gibt es keine Möglichkeit, zu schreibenin der Form .A / 2 B 1 / n ! n > 2 1 / n ! A / 2 B.n2A/2B1/n!n>21/n!A/2B


1
Dies gilt jedoch nur, wenn wir eine deterministische Grenze für die Laufzeit benötigen, die in der Frage nicht angefordert wurde. Wenn nur die erwartete Laufzeit endlich sein soll, sollte dies kein Problem sein.
frafl

1
Kennen Sie einen vernünftigen Sortieralgorithmus, der nicht in Polynomzeit endet?
Yuval Filmus

2
Sie mischen den deterministischen und den zufälligen Fall. Der Algorithmus kann in der deterministischen Polynomzeit enden, wenn er mit einer deterministischen Ordnungsrelation aufgerufen wird, und in der erwarteten Polynomzeit, wenn er mit einer Münze als Komparator aufgerufen wird.
frafl

@YuvalFilmus warum muss der Entscheidungsbaum Blätter haben? 2k
Joe

Wenn Sie zu tun , bis du insgesamt Vergleiche, dann ist die Wahrscheinlichkeit von jedem Ereignis wird von der Form sein . Es geht nicht um die Anzahl der Blätter. Der einzige Ausweg besteht, wie frafl andeutet, in einer unbegrenzten Anzahl von Vergleichen. A / 2 kkA/2k
Yuval Filmus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.