Gibt es einen vergleichsbasierten Sortieralgorithmus, der durchschnittlich Vergleiche verwendet?
Das Vorhandensein eines Vergleichsalgorithmus für den schlimmsten Fall ist ein offenes Problem, aber der Durchschnittsfall reicht für einen randomisierten Algorithmus mit erwarteten Vergleichen von für jede Eingabe aus . Die Bedeutung von besteht darin, dass es sich um Vergleiche vom Optimum handelt, wobei nur ein Durchschnitt von o verschwendet wird Vergleiche pro Element.
Da ich bereits einen solchen Algorithmus habe, füge ich ihn als Antwort hinzu (im Q / A-Format ), aber ich begrüße zusätzliche Antworten, einschließlich anderer Algorithmen, ob ein solcher Algorithmus bereits bekannt war, verbessert und am schlechtesten ist. Fall .
Vorherige Arbeit: Die
Zusammenführungssortierung verwendet Vergleiche (auch im schlimmsten Fall).
Die Sortierung mit Zusammenführung und Einfügung (auch als Ford-Johnson-Sortierung bekannt) verwendet ebenfalls Vergleiche jedoch mit einer viel kleineren Konstante in . Verbesserte durchschnittliche Komplexität für die vergleichsbasierte Sortierung (von Kazuo Iwama und Junichi Teruyama) - ihr (1,2) Einfügealgorithmus ähnelt einem Teil meiner Antwort unten.
quelle
Antworten:
Update: Ich habe diese Antwort zu einer Papiersortierung mit einem Durchschnitt von Vergleichen erweitertlg(n!)+o(n) .
Ja, ein solcher Algorithmus existiert. Ich werde nur die beweisen , aber unter einer wahrscheinlichen Randomisierungsannahme erhalten wir auch . Ich werde auch einen Versuch für und .lg(n!)+o(n) lg(n!)+O(n1−ε) n0.5+o(1) O(n0.5−ε)
Wir können davon ausgehen, dass alle Elemente unterschiedlich sind, indem wir sie bei Bedarf mit Anmerkungen versehen. Im Durchschnittsfall werden verschiedene Elemente in zufälliger Reihenfolge verwendet. Wir können die durchschnittliche Anzahl von Vergleichen berechnen, indem wir den Entropieverlust für jeden Vergleich relativ zur Verwendung einer fairen Münze addieren.
Der Ausgangspunkt ist die Einfügesortierung mit einer binären Suche, um zu entscheiden, wo das nächste Element in die sortierte Teilmenge eingefügt werden soll . Wenn , eine Einfügung verwendet höchstens Vergleiche, die (in Bezug auf die Entropie) bis zu einem -Additivfaktor optimal sind (und für die durchschnittliche Fallkomplexität funktioniert auch). Nun, wennist nicht nahe an einer Potenz von 2, das Einfügen eines Elements ist nicht optimal (selbst im Durchschnitt und unabhängig davon, wie wir jede Abfrage ausgleichen), aber wenn wir Vergleiche verschwenden , könnten wir zu einer annähernd gleichmäßigen Verteilung steuern über einen Zeitraum vonS (1−ε)2m≤|S|≤2m−1 m O(ε) 2m≤|S|≤(1+ε)2m |S| A o(1) A S einer Länge nahe einer Potenz von 2 erhalten wir die gewünschte Optimalität.
Dies erreichen wir, indem wir Elemente in Chargen hinzufügen und manchmal Elemente der Charge effizient miteinander vergleichen, so dass das Intervall von , das einem Element entspricht, quasi zufällig abnimmt (und mit der Wahrscheinlichkeitsverteilung von innerhalb des Intervalls) nahezu gleichmäßig), und wenn die Intervalllänge nahe genug an einer Potenz von 2 liegt, führen Sie die binäre Suche durch, um einzufügen .S A A A
Gemeinsame Konstrukte
Wir behalten eine Teilmenge sortierter Elemente bei und verfolgen für jedes unsortierte Element das minimale Intervall von in dem sich bekanntermaßen befindet. ist die Länge von ; ist durch die Identität der Intervalle.S A IA S A |IA| IA IA=IB
Sei : Vergleiche mit und vergleiche dann (in zufälliger Reihenfolge) und mit entsprechenden Elementen von bis ihre Intervalle disjunkt sind (oder die Länge 1 haben). Das Element von wird (auf konsistente Weise) ausgewählt, um die Wahrscheinlichkeiten für den Vergleich so nahe wie möglich an 1/2 zu bringen, vorausgesetzt, dass beim Aufruf von gleichmäßig auf verteilt . Aufgrund der Disjunktheit am Ende die Einheitlichkeitsannahme bei.Compare(A,B) A B A B S S Compare (A,B) IA×IB Compare
Die folgenden Abschnitte können unabhängig voneinander gelesen werden.
Ein -Algorithmuslg(n!)+o(n)
Gegeben: Eine sortierte Liste und ein Stapel von unsortierten Elementen; ; Die unsortierten Elemente sind relativ zu zufällig .S m m∈ω(1)∩o(|S|) S
Wiederholen Sie (1) - (3), solange dies möglich ist:A B IA=IB
Compare(A,B)
|IA| A IA B
S
1. Wählen Sie zwei Elemente und aus dem Stapel mit (jede Auswahl funktioniert). 2. Führen Sie . 3. Wennnahe genug an einer Potenz von 2 liegt (Anmerkung 1) aus der Charge entfernen (ohne zu vergessen ); und tut in ähnlicher Weise mit . Schließlich: Fügen Sie alle Elemente in und schließen Sie die Sortierung ab.
Anmerkung 1: Für "nah genug" funktioniert jeder relative -Fehler (als Funktion von ), solange -Elemente in Schritt (4) entfernt werden (möglich durch Anmerkung 2). Unter einer vermuteten Randomisierungsannahme erfasst die Verwendung des relativen Fehlers Elemente und ermöglicht ein durchschnittlicher Vergleichssortieralgorithmus.o(1) m m−o(m) cloglogm/logm m(1−log−Θ(c)m) lg(n!)+O(nloglogn/logn)
Anmerkung 2: Da dieselbe Vergleichsfolge zu demselben Begrenzungsintervall führt, durchlaufen fast alle Elemente die Schritte (1) (sofern sie nicht in Schritt 4 entfernt wurden). Wenn zu Beginn und wir auswählen , vergleichen wir mit dem Element , und jede Anwendung von Schritt (3) auf hat Wahrscheinlichkeit der Reduzierung vonin mal. Nun haben wir für jedes Verhältnis , das keine rationale Potenz von 2 ist, , und so erhalten wir dasΩ(logm) A<B A A S[≈(1−1/2–√)|S|] A O(1) |IA| ≈1/(1−1/2–√) a>1 ∀ε>0∀d>0∃m,n∈N1−ε<amd2n<1+ε o(n) gebunden.
Ein wahrscheinlicher -Algorithmuslg(n!)+O(n1−ε)
Modulo eine Randomisierungsannahme, können wir Durchschnittsvergleiche wie folgt erzielen .lg(n!)+O(n1−ε)
Mische die Elemente nach dem Zufallsprinzip und sortiere die erste Hälfte in eine Liste , während die zweite Hälfte als unsortierte Charge beibehalten wird.S
Wiederholen, bis der Stapel leer ist:A∈batch G={B∈batch:|P(A<B)−0.5|<n−0.51ε} G A S
Wählen zufällig . Sei . Wenn leer ist, entfernen Sie aus der Charge und fügen Sie es in . Andernfalls:
Wenn unsere Randomisierungsannahme funktioniert (dh die Verteilung der Intervalllängen und -positionen ist zufällig genug), kann ein typisches während eines Großteils des Prozesses effizient mit einer Auswahl von Elementen (mit verglichen werden verschiedene Intervalllängen). Daher können wir normalerweise einen Vergleich für (1) oben wählen, und wenn wir mit dem Vergleichsergebnis Pech haben, erhalten wir immer noch Chancen, wodurch wir (wenn klein genug ist, sagen wir 0,01) eine -Vergleichsalgorithmus. Mit einigen Änderungen und Annäherungen kann die Gesamtberechnung quasilinear durchgeführt werden: Gegeben ein ElementA nΘ(1) nΘ(1) Θ(logn) ε lg(n!)+O(n1−ε) A Berechnen Sie vielversprechende Intervalllängen und suchen Sie dann s mit der richtigen ungefähren Mittel- und Intervalllänge.B
Es gibt eine Reihe von Möglichkeiten, Vergleiche zu optimieren, aber das Hindernis besteht darin, dass jeder Vergleich möglicherweise Pech hat und wir nur eine begrenzte Anzahl von Vergleichen haben. Wenn nach der Optimierung durchschnittlich 4 Vergleiche durchführt und mit einer Wahrscheinlichkeit von 1/4 "erfolgreich" ist, erhalten wir .Compare(A,B) ε≈(1−ε)/4/log4/32≈0.09
Ein vielleicht viel besserer Ansatz besteht darin, zu warten, bis ein Intervall nahe einer Potenz von 2 liegt, und nicht die einzelnen Intervalllängen, sondern die Längenverteilungen zu steuern.
Ein Versuch eines -Algorithmuslg(n!)+n0.5+o(1)
Angenommen, und wir erhalten einen unsortierten Stapel von Elementen mit den ebenfalls angegebenen Intervallen mittypischerweise und mit gleichmäßig verteilt (bis zu einem zufälligen Fehler und mit ausreichender Genauigkeit halten, auch wenn dies auf bedingt ist ). Dann können wir die Elemente, die durchschnittlich Vergleiche verschwenden, wie folgt sortieren : (*) Fügen Sie alle Elemente in der Reihenfolge ihres ursprünglichen . Auf diese Weise werden alle Elemente eingefügt, wenn ihre Intervalllänge nahe einer Potenz von 2 liegt.|S|=n n IA |IA| n1−o(1) |IA|2⌊lg|IA|⌋ A<S[i] n0.5+o(1)
|IA|2⌊lg|IA|⌋
Der Sortieralgorithmus wird: In zufälliger Reihenfolge die Liste mischen und sortieren die erste Hälfte . Um die zweite Hälfte einzufügen, machen Sie die Verteilung richtig und machen Sie das (*) oben.S
So erstellen Sie den Verteilung richtig, wir können eine 'zufällige' Verteilung machen und dann den richtigen Bruchteil der Elemente für jede während der Rest zufällig ausgewählt wird (ggf. wiederholen). Dies sollte jedoch korrigieren global wissen wir nicht, ob es lokal mit der erforderlichen Genauigkeit gesteuert werden kann (daher das Wort "Versuch" oben).|IA|2⌊lg|IA|⌋ |IA|/2⌊lg|IA|⌋ |IA|2⌊lg|IA|⌋
Um eine 'zufällige' Verteilung zu , können wir mit , außer dass wir bei identischem Anfangs- keine Randomisierung in einer sublogarithmischen Tiefe erwarten (dh mit lange genug). Ich vermute jedoch, dass wir eine Randomisierung in einer sublogarithmischen Tiefe erhalten, indem wir Verallgemeinerungen (wahrscheinlich funktioniert jede vernünftige Wahl) von mit Elementen verwenden: Wenn wir Elemente verschränkt halten (dh verbunden mit Vergleichsergebnissen), sollten wir für jeden Vergleich mit ungefähr pendelfreie Auswahlmöglichkeiten haben . Dies sollteCompare(A,B) P(A<B)≈0.5 IA IA Compare k=ω(1) k=ω(1) k S O(logkn+logk) Randomisierungstiefe nach Wunsch (unter der Annahme, dass nicht zu groß ist, da wir die Tiefe benötigen, um die Elemente zu entwirren). Ich gehe davon aus, dass die Berechnung quasilinear erfolgen kann, wenn ein ausreichend kleines .k Θ(logk) k
Da ein Vergleich mit Ja-Wahrscheinlichkeit nur -Entropie verschwendet , sollten die anfängliche Randomisierung und die leichte Ungleichmäßigkeit der Elemente in ihren Begrenzungsintervallen nur benötigen. Entropiemüll. Wenn die Verteilungsformung gut genug erfolgreich ist, stammt der Entropieabfall hauptsächlich aus Intervalllängenfehlanpassungen während (*) (daher ).1/2+n−0.5 O(1/n) no(1) n0.5+o(1)
Eine mögliche Kombination von :lg(n!)+O(n0.5−ε) Wenn die Verteilungsformung gut genug funktioniert und wir die Chargengröße gleich und machen selektiv Elemente in (*) (oben) ablehnen , können wir alle außer diesen Elementen mit Entropieabfall einfügen. wie folgt. Teilen Sie in nahezu gleiche Intervalle auf, und wenn sich während des Einfügens auf ein Intervall , lehnen Sie es ab (dh brechen Sie das Einfügen ab), wenn das Intervall zu lang ist, und verringern Sie so die Variation in den Längen dieser Intervalle|S|+n0.5+ε ≈n0.5+ε ≈n0.5+ε n0.5−ε/2+o(1) S nε IA Θ(nε/2) Zeiten, was wiederum die Längenschwankungen der zufälligen Länge Intervalle in Zeiten nach Bedarf reduziert . Jetzt können wir den obigen Algorithmus verwenden, um die verbleibenden Elemente mit Abfall einzufügen, wenn klein ist genug.n1−o(1) nε/2−o(1) lg(n!)+O(n1−ε) O(n0.5−ε′) ε
Komplexität der Sortierung im ungünstigsten Fall : Höchstwahrscheinlich gibt es einen Sortieralgorithmus mit Vergleichen im ungünstigsten Fall. Um den Median zu finden, gibt es eine lineare Lücke zwischen dem Durchschnittsfall ( Vergleiche) und dem schlechtesten Fall (mindestens Vergleiche). Zum Sortieren gibt es jedoch viel Freiheit, Vergleiche zu arrangieren und neue Sortieralgorithmen zu finden.lg(n!)+o(n) 1.5n+o(n) (2+ε)n−O(1)
quelle