Mergesort - Ist von Unten nach Oben schneller als Top-Down?
Ich gelesen habe "Algorithms, 4th Ed" von Sedgewick & Wayne, und auf dem Weg habe ich seit der Umsetzung der algorithmen in JavaScript.
Ich vor kurzem nahm die mergesort Beispiele in dem Buch zu vergleichen, top-down und bottom-up-Ansätze... aber ich finde, dass bottom-up schneller läuft (glaube ich). Siehe meine Analyse auf meinem blog.
- http://www.akawebdesign.com/2012/04/13/javascript-mergesort-top-down-vs-bottom-up/
Habe ich nicht in der Lage gewesen zu finden, jede Diskussion, sagt eine Methode mergesort, sollte schneller sein als die anderen. Ist meine Umsetzung (oder Analyse) fehlerhaft?
Hinweis: meine Analyse misst die iterative Schleifen des Algorithmus, nicht unbedingt das array vergleicht/bewegt. Vielleicht ist dies fehlerhaft oder irrelevant?
EDIT: Meine Analyse hat nicht wirklich Zeit, die Geschwindigkeit, so dass meine Aussage, es läuft "schneller" ist ein wenig irreführend. Ich bin die Verfolgung der "Iterationen" durch die rekursive Methode (top-down) und die for-Schleifen (bottom-up) - und bottom-up zu verwenden scheint weniger Iterationen.
- Der Vergleich und die Austauschvorgänge sind die wichtigsten Kostenpositionen in Art Analyse, bin ich mir ziemlich sicher.
- ja, Sie würde normalerweise werden die Elemente zu analysieren, die bei einem Vergleich verschiedener algorithmen zur Sortierung. Aber in diesem Fall, Sie sollten das gleiche zu sein... Sie sind den gleichen Algorithmus, also das ist nicht das, was ich bin nach. Meine Implementierung Spiegel, was ist in dem Buch... ist es nur möglich, dass bottom-up verwendet weniger Schleifen über/durch das array hat aber die gleiche Anzahl von vergleicht/bewegt?
- Ich sehe Ihren Punkt... aber die sind nicht trägt, um die Verschiedenheit in meiner iteration-count. Wenn Sie einen Blick auf meinen code, ich bin nur die Verfolgung der Iterationen innerhalb der rekursiven/iterativen Schleifen. Math.floor() hat das nichts zu tun - ich bin nicht mit einem Zeit-basierte Analyse
- Vielleicht "schneller laufen" in meinem ursprünglichen Beitrag ist nicht korrekt. Ich bin der Suche nach dem bottom-up-Schleifen über die Arrays mal weniger, aber das kann nicht haben etwas zu tun mit "speed"
- Gibt es irgendwelche Unterschiede, wenn Sie beim Sortieren ein array, dessen Größe ist genau eine Potenz von 2?
- Ja... mit array der Größe 1024, top-down hat 22,527 "Iterationen", während bottom-up hat 21,513 "Iterationen".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn durch schneller Sie bedeutet auch, dass weniger "Iterationen", dann ja. Wenn Sie sich Fragen, über Ausführung, Zeit vielleicht.
Der Grund ist, dass einige dieser 21,513 Iterationen sind dabei mehr als die 22,527 Iterationen.
Aus der Betrachtung der Quelle scheint es, wie einige der Blatt-Knoten in dem Diagramm werden sortiert, zusammen nicht einzeln resultiert in weniger verschmilzt und Sorten, aber Sie dauert länger.
Bottom-up und top-down-merge-Arten, sowie andere Varianten, die sind schon gut untersucht worden in den 90er Jahren. Kurz gesagt, wenn Sie Messen die Kosten als die Anzahl der Vergleiche von einzelnen Tasten, die besten Kosten sind die gleichen (~ (n lg n)/2), die schlechteste Kosten von oben nach unten ist geringer als oder gleich der Schlimmste Fall von bottom-up - (aber die beiden ~ n lg n) und die durchschnittlichen Kosten der top-down ist, der niedriger als oder gleich dem durchschnittlichen Fall von bottom-up - (aber die beiden ~ n lg n), wo "lg n" ist der binäre Logarithmus. Die Unterschiede stammen aus der linearen Bedingungen. Natürlich, wenn n=2^p, die beiden Varianten sind in der Tat genau das gleiche. Dies bedeutet, dass, Vergleichs-Weise, von oben nach unten ist immer besser als bottom-up. Darüber hinaus wurde bewiesen, dass die "halbe-halbe" splitting Strategie der top-down-merge-sort ist optimal. Die Forschungsarbeiten sind von Flajolet, Golin, Panny, Prodinger, Chen, Hwang und Sedgewick.
Hier ist, was ich kam in mein Buch Design und Auswertung von Rein Funktionalen Programmen (College Publications, UK), in Erlang:
Beachten Sie, dass dies nicht ein stabiles Sortieren. Auch in Erlang (und OCaml), die Sie verwenden müssen Aliase (ALIAS=...) in die Muster, wenn Sie möchten, um Speicherplatz zu sparen. Der trick hier ist, zu finden, die Mitte der Liste, ohne zu wissen, seine Länge. Dies geschieht durch cutr/3 übernimmt zwei Zeiger auf die input-Liste: man wird um eins inkrementiert, und die anderen zwei, so dass, wenn das zweite Ende erreicht hat, die erste ist in der Mitte. (Ich lernte dies von einem paper von Olivier Danvy.) Auf diese Weise, Sie brauchen nicht zu verfolgen, die Länge und die Sie nicht duplizieren die Zellen der zweiten Hälfte der Liste, so dass du nur noch (1/2)n lg n extra Raum, im Vergleich zu n lg n. Dies ist nicht bekannt.
Es wird oft behauptet, dass die bottom-up Variante ist vorzuziehen, für funktionale Sprachen oder verknüpften Liste (Knuth, Panny, Prodinger), aber ich glaube nicht, dass dies wahr ist.
War ich verblüfft, wie Sie durch den Mangel an Diskussion über merge-Sorten, so habe ich meine eigene Forschung, und schrieb ein großes Kapitel darüber. Ich bereite mich gerade auf eine neue edition mit mehr material auf merge sortiert.
Übrigens, es gibt auch andere Varianten: queue merge-sort und Online-merge-sort (ich Diskutiere das letztere in meinem Buch).
[EDIT: Als Maß für die Kosten ist die Anzahl der Vergleiche, gibt es keinen Unterschied zwischen der Wahl eines Arrays vs. verkettete Liste. Natürlich, wenn Sie die Umsetzung der top-down Variante mit verknüpften Listen, müssen Sie klug sein, wie Sie nicht unbedingt wissen, die Anzahl der Tasten, aber Sie müssen, um die traverse mindestens die Hälfte der Tasten, die jeweils Zeit, und reservieren, insgesamt (1/2)n lg n-Zellen (wenn Sie clever sind). Bottom-up merge-sort mit verknüpften Listen tatsächlich mehr erfordert zusätzlichen Speicher n lg n + n-Zellen. Also, auch mit verknüpften Listen, die top-down-Variante ist die beste Wahl. So weit wie die Länge des Programms geht, kann Ihre Laufleistung variieren, aber in eine funktionale Sprache, die top-down-merge-sort kann kürzer gestaltet werden als bottom-up -, wenn die Stabilität nicht erforderlich. Es gibt einige Papiere, besprechen Implementierungen Themen von merge-sort, wie in-place - (für die Sie brauchen, arrays), oder Stabilität etc. Zum Beispiel, ist Eine Sorgfältige Analyse von Mergesort-Programme, durch Katajainen und Larsson Traff (1997).]
mgsort xs = foldt merge [] [[x]|x<-xs]
.Hatte ich die gleiche Frage gestellt auf coursera Klassenforen für die August 2012 Ausgabe des dieser Kurs. Professor Kevin wayne (Princeton) antwortete, dass in vielen Fällen die Rekursion ist schneller als die iteration aufgrund von caching-verbesserte Leistungen.
So die kurze Antwort, die ich bekam, damals war das top-down-merge-sort schneller sein wird als bottom-up merge-sort, weil der caching-Gründen.
Bitte beachten Sie, dass die Klasse unterrichtet wurde in der Programmiersprache Java(nicht Javascript).