AVL- und Rotschwarzbäume gleichen sich beide selbst aus, mit Ausnahme der roten und schwarzen Farbe in den Knoten. Was ist der Hauptgrund für die Wahl von roten schwarzen Bäumen anstelle von AVL-Bäumen? Was sind die Anwendungen von roten schwarzen Bäumen?
107
Antworten:
Sowohl rot-schwarze Bäume als auch AVL-Bäume sind die am häufigsten verwendeten ausgeglichenen binären Suchbäume und unterstützen das Einfügen, Löschen und Nachschlagen garantiert
O(logN) time
. Es gibt jedoch folgende Vergleichspunkte zwischen den beiden:O(N)
zusätzlichen Platz in Anspruch. Wenn wir jedoch wissen, dass die Schlüssel, die in den Baum eingefügt werden, immer größer als Null sind, können wir das Vorzeichenbit der Schlüssel verwenden, um die Farbinformationen eines rot-schwarzen Baums zu speichern. In solchen Fällen nimmt der rot-schwarze Baum keinen zusätzlichen Platz ein.Rot-schwarze Bäume sind allgemeiner Zweck. Sie eignen sich relativ gut zum Hinzufügen, Entfernen und Nachschlagen, aber AVL-Bäume haben schnellere Nachschlagen auf Kosten eines langsameren Hinzufügens / Entfernens. Der rot-schwarze Baum wird im Folgenden verwendet:
java.util.TreeMap
,java.util.TreeSet
quelle
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
ist nicht wahr.std:: map
und Freunde verwenden eine bestimmte Struktur. Das bleibt der Implementierung überlassen, obwohl libstdc ++ und Dinkumware zumindest rot-schwarze Bäume verwenden und es scheint, als ob Sie in der Praxis Recht haben.Versuchen Sie, diesen Artikel zu lesen
Es bietet einige gute Einblicke in Unterschiede, Ähnlichkeiten, Leistung usw.
Hier ist ein Zitat aus dem Artikel:
Nach meinem eigenen Verständnis sind AVL- und RB-Bäume in Bezug auf die Leistung nicht sehr weit entfernt. Ein RB-Baum ist einfach eine Variante eines B-Baums und das Balancing wird anders implementiert als ein AVL-Baum.
quelle
Unser Verständnis der Leistungsunterschiede hat sich im Laufe der Jahre verbessert, und jetzt besteht der Hauptgrund für die Verwendung von rot-schwarzen Bäumen über AVL darin, keinen Zugriff auf eine gute AVL-Implementierung zu haben, da diese möglicherweise etwas seltener sind, weil sie nicht in CLRS behandelt werden.
Beide Bäume werden heute als Formen von Bäumen mit ausgewogenem Rang betrachtet, aber rot-schwarze Bäume sind in realen Tests durchweg um etwa 20% langsamer . Oder sogar 30-40% langsamer, wenn sequentielle Daten eingefügt werden .
Menschen, die rot-schwarze Bäume, aber keine AVL-Bäume untersucht haben, tendieren dazu, rot-schwarze Bäume zu wählen. Die Hauptverwendungen für rot-schwarze Bäume sind im Wikipedia-Eintrag für sie aufgeführt .
quelle
Andere Antworten hier fassen die Vor- und Nachteile von RB- und AVL-Bäumen gut zusammen, aber ich fand diesen Unterschied besonders interessant:
Quelle: Mehlhorn & Sanders (2008) (Abschnitt 7.4)
Während sowohl RB- als auch AVL-Bäume O (log (N)) Worst-Case-Zeit für das Nachschlagen, Einfügen und Löschen garantieren, kann die Wiederherstellung der AVL / RB-Eigenschaft nach dem Einfügen oder Löschen eines Knotens in O (1) amortisierter Zeit für erfolgen rot-schwarze Bäume.
quelle
Programmierer möchten Speicher im Allgemeinen nicht dynamisch zuweisen. Das Problem mit dem avl-Baum ist, dass Sie für "n" Elemente mindestens log2 (log2 (n)) ... (height-> log2 (n)) Bits benötigen, um die Höhe des Baums zu speichern! Wenn Sie also enorme Daten verarbeiten, können Sie nicht sicher sein, wie viele Bits für die Speicherhöhe an jedem Knoten zugewiesen werden sollen.
Zum Beispiel, wenn Sie 4 Bytes int (32 Bit) zum Speichern der Höhe verwenden. Die maximale Höhe kann sein: 2 ^ 32 und daher beträgt die maximale Anzahl von Elementen, die Sie im Baum speichern können, 2 ^ (2 ^ 32) - (scheint sehr groß zu sein, aber in diesem Zeitalter der Daten ist wohl nichts zu groß). Wenn Sie diese Grenze überschreiten, müssen Sie dynamisch mehr Platz für die Speicherhöhe zuweisen.
Dies ist eine Antwort eines Professors an meiner Universität, die mir vernünftig erschien! Hoffe ich mache Sinn.
Bearbeitungen: Die AVL-Bäume sind im Vergleich zu rot-schwarzen Bäumen ausgeglichener, können jedoch beim Einfügen und Löschen mehr Rotationen verursachen. Wenn Ihre Anwendung viele häufige Einfügungen und Löschungen umfasst, sollten rot-schwarze Bäume bevorzugt werden. Und wenn die Einfügungen und Löschungen weniger häufig sind und die Suche häufiger ausgeführt wird, sollte der AVL-Baum dem roten schwarzen Baum vorgezogen werden. --Quelle GEEKSFORGEEKS.ORG
quelle
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
Ich brauche nicht die Höhe eines Knotens in einem AVL-Baum, um ihn zu implementieren. Sie benötigen eine zusätzliche Information für jeden Knoten ( ICH BIN DER GRÖSSTE (das Geschwister mit dem höchsten Teilbaum)). Es ist sowohl bequemer als auch konventionell, zwei zusätzliche Bits zu haben (Kind ist höher für links und rechts), wie von AV & L. vorgestelltDas Neuausgleichen des AVL-Baums sollte die folgende Eigenschaft erfüllen. (Wiki-Referenz - AVL-Baum )
Dies bedeutet also, dass die Gesamthöhe des AVL-Baums nicht verrückt werden kann, dh, die Suche mit AVL-Bäumen wird besser. Und da zusätzliche Operationen (Rotationen) durchgeführt werden sollen, um die Höhe nicht verrückt werden zu lassen, können die Baummodifikationsoperationen etwas kostspielig sein.
quelle