Warum ist Merge Sort Worst Case Laufzeit O (n log n)?
Kann mir jemand erklären in einfachen Englisch oder eine einfache Möglichkeit, es zu erklären?
InformationsquelleAutor der Frage adit | 2011-10-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf eine "traditionelle" merge-sort, jeder Durchlauf durch die Daten, verdoppelt sich die Größe der sortierten Abschnitten. Nach dem ersten Durchlauf die Datei, die sortiert werden in Abschnitte der Länge zwei. Nach dem zweiten pass, der Länge vier. Dann acht, sechzehn, usw.. bis auf die Größe der Datei.
Ist es notwendig zu halten, die Verdoppelung der Größe der sortierten Abschnitte, bis es einen Abschnitt, bestehend aus der gesamten Datei. Es dauert lg(N) Verdoppelungen der Abschnitt Größe zu erreichen, die Größe der Datei, und jeder pass von den Daten nehmen sich die Zeit proportional zu der Anzahl der Datensätze.
InformationsquelleAutor der Antwort supercat
Den Merge-Sort verwenden Sie die Teile und herrsche " - Ansatz zur Lösung des Sortier-Problems. Erstens, es teilt sich den Eingang in die Hälfte mit Rekursion. Nach der Division, Sortieren Sie die Hälften und führen Sie Sie in eine sortierte Ausgabe. Siehe die Abbildung
Bedeutet dies, dass die besser zu Sortieren Hälfte von Ihrem problem und machen Sie einen einfachen merge eine Unterroutine. So ist es wichtig zu wissen, die Komplexität der merge eine Unterroutine, und wie oft es aufgerufen wird, in die Rekursion.
Den pseudo-code für die merge-sort ist wirklich einfach.
Es ist leicht zu sehen, dass in jeder Schleife, die Sie haben werden 4 Operationen: k++i++ oder j++die if-Anweisung und die attribution C = A|B. So haben Sie weniger oder gleich 4N + 2 Operationen geben einen O(N) Komplexität. Zum Wohle der Nachweis 4N + 2 werden so behandelt, 6N, da ist wahr für N = 1 (4N +2 <= 6N).
Also davon aus, dass Sie eine Eingabe mit N Elemente und übernehmen N ist eine Potenz von 2 ist. Auf jeder Ebene, haben Sie zwei mal mehr Teilprobleme, die mit einem Eingang mit der Hälfte der Elemente von der vorherigen Eingabe. Dies bedeutet, dass auf der Ebene j = 0, 1, 2, ..., lgN wird es 2^j Teilprobleme mit einer Eingabe der Länge N /2^j. Die Anzahl der Operationen auf jeder Ebene j wird weniger oder gleich
Beobachten, dass es doens egal, die Ebene, die Sie haben immer weniger oder gleich 6N Operationen.
Da gibt es lgN + 1 Ebenen, die Komplexität
Referenzen:
InformationsquelleAutor der Antwort Davi Sampaio
Dies ist, weil ob worst-case oder average-case der merge-sort nur teilen das array in zwei Hälften, auf jeder Stufe, die es gibt lg(n) - Komponente und die andere N-Komponente kommt von seiner Vergleiche, die sind auf jeder Bühne. Also die Kombination, wird fast O(nlg n). Egal ob Durchschnittlicher Fall oder der Schlimmste Fall, lg(n) Faktor, der immer vorhanden ist. Rest-N-Faktor hängt davon ab, Vergleiche die kommt aus dem Vergleiche gemacht in beiden Fällen. Jetzt der Schlimmste Fall ist eine, in der N Vergleiche geschieht, für eine N-Eingang in jedem Stadium. So wird es eine O(nlg n).
InformationsquelleAutor der Antwort Pankaj Anand
Nachdem die Aufteilung der Arrays auf die Bühne, wo man einzelne Elemente, d.h. nennen Sie Teillisten,
in jeder Phase vergleichen wir die Elemente der jede Unterliste mit den angrenzenden Teilliste. Zum Beispiel, [die Wiederverwendung @Davi ' s Bild
]
log(n) base 2
Damit die gesamte Komplexität wäre == (max Anzahl der Vergleiche in jeder Phase * Anzahl der Stufen) == O((n/2)*log(n)) ==> O(nlog(n))
InformationsquelleAutor der Antwort blueskin
MergeSort-Algorithmus erfolgt in drei Schritten:
Den Algorithmus benötigt ca logn übergibt ein array Sortieren von n Elementen und so insgesamt die Zeit-Komplexität ist nlogn.
InformationsquelleAutor der Antwort MisterJoyson
Viele der anderen Antworten sind toll, aber ich didn ' T sehen jede Erwähnung von Höhe und Tiefe im Zusammenhang mit der "merge-sort Baum" Beispiele. Hier ist ein weiterer Weg der Annäherung an die Frage mit einem großen Schwerpunkt auf den Baum. Hier ist noch ein Bild zur Erklärung:
Nur eine Zusammenfassung: wie andere Antworten haben darauf hingewiesen, wir wissen, dass die Arbeit der Zusammenführung von zwei sortierte Scheiben von der Sequenz in linearer Zeit (die Seriendruck-Funktion, die wir aufrufen, von der Haupt-Sortier-Funktion).
Jetzt suchen auf diesem Baum, wo wir uns vorstellen können, jeder Nachkomme der Wurzel (außer der Wurzel) einen rekursiven Aufruf der Sortier-Funktion, lassen Sie uns versuchen, zu beurteilen, wie viel Zeit verbringen wir auf jedem Knoten... Da das aufschneiden der Sequenz und Zusammenführen (beide zusammen) nehmen die lineare Zeit, die Zeit an jedem Knoten linear mit Bezug auf die Länge der Sequenz in diesem Knoten.
Hier ist, wo die Baum-Tiefe kommt. Wenn n die Gesamtgröße der ursprünglichen Sequenz, die Größe der Sequenz an einem beliebigen Knoten n/2iwobei i die Tiefe. Dies ist gezeigt in der Abbildung oben. Putting dies zusammen mit der linearen Menge an Arbeit für jedes Segment haben wir eine Laufzeit von O(n/2i) für jeden Knoten in dem Baum. Jetzt müssen wir nur um die Summe, die für die n Knoten. Ein Weg dies zu tun ist, um das zu erkennen, es sind 2i - Knoten auf jeder Ebene der Tiefe in den Baum. So für alle level, wir haben O(2i * n/2i), O(n), denn wir können kündigen, die 2is! Wenn jeder Tiefe ist O(n), müssen wir nur multiplizieren, dass durch die Höhe dieser binäre Baum, der logn. Antwort: O(nlogn)
Referenz: Datenstrukturen und Algorithmen in Python
InformationsquelleAutor der Antwort trad
Algorithmus merge-sort sortiert eine Sequenz S der Größe n in O(n log n)
mal angenommen, zwei Elemente in S verglichen werden kann, in O(1) Zeit.
InformationsquelleAutor der Antwort Andrii Glukhyi
Die rekursive Struktur haben Tiefe
log(N)
und auf jeder Ebene in diesem Baum werden Sie tun, eine kombinierteN
arbeiten zum Zusammenführen von zwei sortierten arrays.Zusammenführen der sortierten arrays
Zum Zusammenführen von zwei sortierten arrays
A[1,5]
undB[3,4]
Sie einfach Durchlaufen, sowohl am Anfang, sammeln der Unterste element zwischen den beiden arrays und Inkrementieren der Zeiger für das array. Sie sind fertig, wenn beide Zeiger bis zum Ende der jeweiligen arrays.Merge-sort Abbildung
Ihre rekursive Aufruf-stack wird wie folgt Aussehen. Die Arbeit beginnt an den unteren Blattknoten und Blasen.
Damit Sie
N
Arbeit an jedemk
Ebenen in der Struktur, wok = log(N)
N * k = N * log(N)
InformationsquelleAutor der Antwort geg