median der drei Werte-Strategie
Was ist der median der drei Strategie zu wählen, die pivot-Wert in quick-sort?
Ich lese es im web, aber ich konnte nicht herausfinden, was genau es ist? Und auch, wie es ist besser als die randomisierter quick-sort.
InformationsquelleAutor der Frage Abdul Samad | 2011-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den median der drei hat man Blick auf die ersten, mittleren und letzten elements des Arrays und wählen Sie den median dieser drei Elemente als pivot.
Um die "volle Wirkung" der median der drei, es ist auch wichtig zu Art diese drei Elemente, nicht nur die Verwendung des median als pivot -- dies hat keinen Einfluss auf das, was gewählt, da das pivot in der aktuellen iteration, aber kann/wird sich auf das auswirken, was als das pivot in der nächsten rekursiven Aufruf, die hilft, zu begrenzen, das schlechte Verhalten für ein paar anfänglichen Käufen (one stellt sich heraus, dass besonders schlecht zu sein in vielen Fällen ist ein array, das sortiert, außer dass das kleinste element am oberen Ende des Arrays (oder größte element am unteren Ende). Zum Beispiel:
Im Vergleich zur Kommissionierung der pivot zufällig:
Dass der zweite Punkt wahrscheinlich trägt ein wenig mehr Erklärung. Wenn Sie die offensichtliche (
rand()
) random number generator, es ist ziemlich einfach (in vielen Fällen jedenfalls) für jemanden, ordnen Sie die Elemente so, es wird ständig wählen Armen schwenkt. Dies kann ein ernstes Problem für so etwas wie ein web-server, kann die Sortierung von Daten, die eingegeben wurden, durch die ein potentieller Angreifer könnte die Halterung ein DoS-Angriff durch zu bekommen, Ihre server zu verschwenden eine Menge Zeit für das Sortieren der Daten. In einem Fall wie diesem, Sie könnte Verwendung eines wirklich zufälligen seed, oder Sie könnten Ihre eigenen PRNG anstelle von rand() -- oder Sie verwenden den Median von drei, die auch die anderen genannten Vorteile.Auf der anderen Seite, wenn Sie eine ausreichend Zufallsgenerator (z.B. ein hardware-generator oder-Verschlüsselung im counter-Modus), ist es wahrscheinlich mehr schwierig zu zwingen, eine schlechte Falle, als es für einen median-von-drei-Auswahl. Zur gleichen Zeit, die Erreichung dieses Niveau der Zufälligkeit in der Regel hat ziemlich wenig Aufwand seine eigene, so, wenn Sie wirklich erwarten, angegriffen zu werden, in diesem Fall, es ist wahrscheinlich nicht lohnt (und wenn Sie das tun, lohnt es sich wahrscheinlich, wenigstens erwägen, eine alternative, die garantiert O(N log N) worst case, wie ein merge-sort oder heap-sort.
InformationsquelleAutor der Antwort Jerry Coffin
Einer Umsetzung der Median der Drei, die ich gefunden habe funktioniert gut in meiner schnellen sortiert.
InformationsquelleAutor der Antwort rahvin_t
Diese Strategie besteht aus der Wahl drei zahlen deterministisch oder zufällig, und verwenden Sie dann der median als pivot.
Besser wäre, weil es verringert die Wahrscheinlichkeit des Findens "schlecht" schwenkt.
InformationsquelleAutor der Antwort Simone
Gemeinsam/Vanille quicksort wählt als Pivotelement das äußerste Rechte element. Dies hat zur Folge, dass es Exponate der pathologischen Leistung O(N2) für eine Reihe von Fällen. Insbesondere die sortiert und Umgekehrt sortierten Sammlungen. In beiden Fällen ist das Rechte element die schlechteste element zu wählen als Pivotelement. Der pivot ist ideal dachte mir in der Mitte von der Partitionierung. Die Partitionierung soll so teilen Sie die Daten mit der pivot in zwei Abschnitte, einen niedrigen und einen hohen Abschnitt. Niedrige Abschnitt niedriger als der Drehpunkt, den hohen Abschnitt höher.
Median-von-drei pivot-Auswahl:
Den häufigsten Pathologien O(N2) sortiert /rückwärts sortierte Eingaben werden gemildert. Ist es immer noch einfach zu erstellen pathologischen Eingänge median-von-drei. Aber es ist ein konstruiertes und schädliche Verwendung. Nicht einen natürlichen Bestellung.
Randomisierte pivot:
Wenn zufällige, das nicht eine pathologische O(N2) Verhalten. Die zufälligen pivot ist in der Regel sehr wahrscheinlich rechenintensive für eine generische Art und als solche unerwünscht. Und wenn es nicht zufällig (d.h. srand(0); rand(), berechenbar und anfällig für die gleichen O(N2) auszunutzen, wie oben beschrieben.
Beachten Sie, dass die zufälligen pivot - nicht profitieren Sie von der Auswahl mehr als ein element. Vor allem, weil die Wirkung der median ist bereits eine intrinsische, und ein zufälliger Wert ist mehr rechenintensive als auch die Bestellung von zwei Elementen.
InformationsquelleAutor der Antwort Captain Giraffe
Denke einfach... Python-Beispiel....
InformationsquelleAutor der Antwort Spiro
Können wir verstehen, die Strategie der median der drei durch ein Beispiel, angenommen wir haben ein array:
Also die am weitesten Links stehende element ist
8
und ganz Rechte element ist1
. Das mittlere element ist4
da für jede array mit der Länge 2kwählen wir die kth-element.Und dann Sortieren wir diese drei Elemente in aufsteigender Reihenfolge oder absteigender Reihenfolge, die gibt uns:
So, der median ist
4
. Und wir verwenden4
als unser pivot.Auf die Umsetzung Seite haben, können wir:
Einen anderen Weg, um es zu implementieren ist inspiriert von @kwrl, und ich möchte erklären, es ein bisschen klarer:
Betrachte die Funktion
findMedian
erste element zurückgeben, nur wennsecond Element > first Element > third Element
undthird Element > first Element > second Element
und in beiden Fällen:(second - first) * (third - first) < 0
die gleiche Argumentation anwenden, um die verbleibenden zwei Fällen.Den Kopf, mit der zweiten Implementierung ist, dass Sie könnten haben eine bessere Laufzeit.
InformationsquelleAutor der Antwort Leonard Ge
Ich denke, dass die Neuordnung der Werte im array ist nicht notwendig, für die nur drei Werte. Vergleichen Sie einfach alle von Ihnen durch subtrahieren; dann können Sie entscheiden, welches ist der median-Wert:
InformationsquelleAutor der Antwort kwrl