it-swarm.com.de

Was ist Stabilität in Sortieralgorithmen und warum ist es wichtig?

Ich bin sehr gespannt, warum Stabilität bei Sortieralgorithmen wichtig ist oder nicht?

218
DarthVader

Ein Sortieralgorithmus wird als stabil bezeichnet, wenn zwei Objekte mit gleichen Schlüsseln in der sortierten Ausgabe in der gleichen Reihenfolge angezeigt werden wie im zu sortierenden Eingabearray. Einige Sortieralgorithmen wie Einfügungssortierung, Zusammenführungssortierung, Blasensortierung usw. sind von Natur aus stabil.

Hintergrund : Ein "stabiler" Sortieralgorithmus hält die Artikel mit dem gleichen Sortierschlüssel in der richtigen Reihenfolge. Angenommen, wir haben eine Liste von Wörtern mit 5 Buchstaben:

Peach
straw
Apple
spork

Wenn wir die Liste nur nach dem ersten Buchstaben jedes Wortes sortieren, würde eine Stable-Sortierung ergeben:

Apple
Peach
straw
spork

In einem instabilen Sortieralgorithmus können straw oder spork vertauscht werden, aber in einem stabilen bleiben sie in den gleichen relativen Positionen (dh seit straw erscheint vor spork in der Eingabe, es erscheint auch vor spork in der Ausgabe).

Wir könnten die Liste der Wörter mit diesem Algorithmus sortieren: stabile Sortierung nach Spalte 5, dann 4, dann 3, dann 2, dann 1. Am Ende wird es richtig sortiert. Überzeugen Sie sich davon. (Übrigens, dieser Algorithmus heißt radix sort)

Angenommen, wir haben eine Liste mit Vor- und Nachnamen, um Ihre Frage zu beantworten. Wir werden gebeten, "nach Nachname, dann nach Vorname" zu sortieren. Wir könnten zuerst nach dem Vornamen sortieren (stabil oder instabil), dann nach dem Nachnamen stabil sortieren. Nach diesen Sortierungen wird die Liste hauptsächlich nach dem Nachnamen sortiert. Wenn jedoch die Nachnamen identisch sind, werden die Vornamen sortiert.

Sie können instabile Sortierungen nicht auf dieselbe Weise stapeln.

286
Joey Adams

Ein stabiler Sortieralgorithmus ist derjenige, der die identischen Elemente in derselben Reihenfolge sortiert, in der sie in der Eingabe erscheinen, während die instabile Sortierung kann nicht den Fall erfüllt.

Stabile Sortieralgorithmen:

  • Sortieren durch Einfügen
  • Zusammenführen, sortieren
  • Bubble Sort
  • Tim Sort
  • Zählen sortieren

Instabile Sortieralgorithmen:

  • Heap Sort
  • Auswahl sortieren
  • Shell sortieren
  • Schnelle Sorte

enter image description here

39
snr

Sortierstabilität bedeutet, dass Datensätze mit demselben Schlüssel ihre relative Reihenfolge vor und nach dem Sortieren beibehalten.

Stabilität ist also nur dann von Bedeutung, wenn das zu lösende Problem die Beibehaltung dieser relativen Reihenfolge erfordert.

Wenn Sie keine Stabilität benötigen, können Sie einen schnellen Algorithmus zum Auslesen des Arbeitsspeichers aus einer Bibliothek wie Heapsort oder Quicksort verwenden und diesen vergessen.

Wenn Sie Stabilität brauchen, ist es komplizierter. Stabile Algorithmen haben eine höhere CPU- und/oder Speicherauslastung als instabile Algorithmen. Wenn Sie also einen großen Datensatz haben, müssen Sie sich entscheiden, ob Sie die CPU oder den Speicher auslasten möchten. Wenn sowohl die CPU als auch der Arbeitsspeicher eingeschränkt sind, liegt ein Problem vor. Ein guter kompromissstabiler Algorithmus ist eine binäre Baumsorte; Der Wikipedia-Artikel hat eine pathetisch einfache C++ - Implementierung, die auf der STL basiert.

Sie können einen instabilen Algorithmus zu einem stabilen Algorithmus machen, indem Sie die ursprüngliche Datensatznummer als letzten Schlüssel für jeden Datensatz hinzufügen.

18
Bob Murphy

Es gibt einige Gründe, warum Stabilität wichtig sein kann. Wenn zwei Datensätze nicht durch Austauschen ausgetauscht werden müssen, kann dies zu einer Speicheraktualisierung führen. Eine Seite ist als verschmutzt gekennzeichnet und muss erneut auf die Festplatte (oder ein anderes langsames Medium) geschrieben werden.

15
Clinton Pierce

Es hängt davon ab, was Sie tun.

Stellen Sie sich vor, Sie haben einige Personendatensätze mit einem Vor- und einem Nachnamenfeld. Zuerst sortieren Sie die Liste nach dem Vornamen. Wenn Sie dann die Liste mit einem stabilen Algorithmus nach Nachnamen sortieren, wird eine Liste nach Vorname UND Nachname sortiert.

14
svens

Ein Sortieralgorithmus gilt als stabil, wenn zwei Objekte mit gleichen Schlüsseln in der sortierten Ausgabe in derselben Reihenfolge angezeigt werden, wie sie im unsortierten Eingabearray angezeigt werden. Einige Sortieralgorithmen sind von Natur aus stabil, wie Einfügungssortierung, Zusammenführungssortierung, Blasensortierung usw., und einige Sortieralgorithmen sind nicht stabil, wie Heap-Sortierung, Schnellsortierung usw.

Jedes gegebene Sortieralgo, das nicht stabil ist, kann jedoch so modifiziert werden, dass es stabil ist. Es gibt verschiedene Möglichkeiten, die Sortierung zu stabilisieren, aber im Allgemeinen kann jeder vergleichsbasierte Sortieralgorithmus, der von Natur aus nicht stabil ist, durch Ändern der Tastenvergleichsoperation so geändert werden, dass der Vergleich zweier Tasten die Position als stabil betrachtet Faktor für Objekte mit gleichen Schlüsseln.

Referenzen: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdfhttp://en.wikipedia.org/wiki/Sorting_algorithm # Stability

4
roottraveller

Ich weiß, dass es dafür viele Antworten gibt, aber für mich hat diese Antwort , von Robert Harvey , es viel klarer zusammengefasst:

Bei einer stabilen Sortierung wird die ursprüngliche Reihenfolge der Eingabemenge beibehalten, bei der der [instabile] Algorithmus nicht zwischen zwei oder mehr Elementen unterscheidet.

Quelle

3
John R Perry

Wenn Sie annehmen, dass das, was Sie sortieren, nur Zahlen sind und nur ihre Werte sie identifizieren/unterscheiden (z. B. sind Elemente mit demselben Wert identisch), ist das Stabilitätsproblem des Sortierens bedeutungslos.

Objekte mit der gleichen Priorität beim Sortieren können jedoch unterschiedlich sein, und manchmal ist ihre relative Reihenfolge eine aussagekräftige Information. In diesem Fall führt eine instabile Sortierung zu Problemen.

Sie haben zum Beispiel eine Liste mit Daten, die die Zeitkosten [T] aller Spieler zum Reinigen eines Labyrinths mit Stufe [L] in einem Spiel enthält. Angenommen, wir müssen die Spieler danach ordnen, wie schnell sie das Labyrinth reinigen. Es gilt jedoch eine zusätzliche Regel: Spieler, die das Labyrinth mit einem höheren Level reinigen, haben immer einen höheren Rang, egal wie lange der Zeitaufwand ist.

Natürlich könnten Sie versuchen, den gepaarten Wert [T, L] mit einem Algorithmus, der den Regeln folgt, einer reellen Zahl [R] zuzuordnen und dann alle Spieler mit dem Wert [R] zu ordnen.

Wenn jedoch eine stabile Sortierung möglich ist, können Sie die gesamte Liste einfach nach [T] (Schnellere Spieler zuerst) und dann nach [L] sortieren. In diesem Fall wird die relative Reihenfolge der Spieler (nach Zeitaufwand) nicht geändert, nachdem Sie sie nach der Stufe des von ihnen gereinigten Labyrinths gruppiert haben.

PS: Natürlich ist der Ansatz, zweimal zu sortieren, nicht die beste Lösung für das jeweilige Problem, aber um die Frage nach dem Poster zu erklären, sollte es ausreichen.

1
M Ciel

Stabile Sortierung gibt immer dieselbe Lösung (Permutation) für dieselbe Eingabe zurück.

Zum Beispiel wird [2,1,2] mit einer stabilen Sortierung als Permutation [2,1,3] sortiert (zuerst Index 2, dann Index 1, dann Index 3 in der sortierten Ausgabe). Das bedeutet, dass die Ausgabe immer auf die gleiche Weise gemischt wird. Andere nicht stabile, aber immer noch korrekte Permutation ist [2,3,1].

Die schnelle Sortierung ist keine stabile Sortierung, und die Permutationsunterschiede zwischen denselben Elementen hängen vom Algorithmus für die Auswahl des Drehpunkts ab. Einige Implementierungen werden nach dem Zufallsprinzip ausgewählt. Dadurch kann eine schnelle Sortierung mit demselben Algorithmus zu unterschiedlichen Permutationen bei derselben Eingabe führen.

Stabiler Sortieralgorithmus ist notwendig deterministisch.

0
Luka Rahne