Rot-Schwarz-Baum
Rot-Schwarz-Baum
Rot-Schwarz-Baum
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
8.4 <strong>Rot</strong>-<strong>Schwarz</strong>-Bäume<br />
Effiziente Algorithmen<br />
� <strong>Rot</strong>-<strong>Schwarz</strong>-Bäume (red-black trees) sind erstmals von Guibas &<br />
Sedgewick 1978 vorgestellt worden.<br />
– <strong>Rot</strong>-<strong>Schwarz</strong>-Bäume stellen eine Art “abstrakte Klasse” dar, die<br />
genutzt werden kann, um verschiedene binäre Suchbäume einfach zu<br />
implementieren<br />
implementieren.<br />
� Die in diesem Abschnitt vorgestellte Variante der <strong>Rot</strong>-<strong>Schwarz</strong>-Bäume ist<br />
in der Java API (java.util.TreeMap) implementiert.<br />
– Sie entspricht den symmetrischen binären B-Bäumen, die bereits 1972<br />
von Rudolf Bayer entwickelt wurden.<br />
– Eine detaillierte Beschreibung der Datenstruktur findet man in dem<br />
Buch von Cormen et al.<br />
Seite 217
2-4-Bäume<br />
Effiziente Algorithmen<br />
2-4-Bäume<br />
� Ein 2-4-<strong>Baum</strong> ist ein a-b-<strong>Baum</strong> mit a = 2 und b = 4. In der Literatur spricht p<br />
man auch von 2-3-4-Bäumen.<br />
Lemma:<br />
� Alle Knoten eines 2-4-<strong>Baum</strong>s lassen sich in Form eines AVL-<strong>Baum</strong>s<br />
darstellen.<br />
Beweis:<br />
a) binäre Knoten b) tenäre Knoten c) Konten mit 4 Kinder<br />
Seite 218
Effiziente Algorithmen<br />
<strong>Rot</strong>-<strong>Schwarz</strong>-<strong>Baum</strong> (RS-<strong>Baum</strong>) ( )<br />
Einfärbung der Knoten in einem AVL-<strong>Baum</strong>:<br />
� Die Wurzel eines AVL-<strong>Baum</strong>s wird schwarz eingefärbt. g<br />
– Blattknoten sind per Definition schwarz.<br />
� Die anderen Knoten werden rot eingefärbt.<br />
k 2 k 2 k 1<br />
k 1<br />
Für den aus dem 2-4-<strong>Baum</strong> äquivalenten binären <strong>Baum</strong> gilt:<br />
1. Die Wurzel des binären <strong>Baum</strong>s ist schwarz.<br />
2. Die Kinder eines roten Knotens sind schwarz.<br />
3. Jeder Pfad von der Wurzel zu einem Blatt besitzt die gleiche Anzahl von<br />
schwarzen Knoten. Knoten Diese Anzahl bezeichnen wir als S-Höhe. S Höhe.<br />
k 2<br />
k 1<br />
k 2<br />
k 3<br />
Seite 219
Eigenschaften<br />
g<br />
� Ein <strong>Rot</strong>-<strong>Schwarz</strong>-<strong>Baum</strong> ist ein binärer Suchbaum.<br />
� Der Suchalgorithmus g ist identisch zu binären Suchbäumen.<br />
Effiziente Algorithmen<br />
� Da die Höhe der 2-4-Bäume logarithmisch beschränkt ist, folgt sofort auch,<br />
dass die Höhe eines <strong>Rot</strong>-<strong>Schwarz</strong>-<strong>Baum</strong>s O(log n) beträgt.<br />
�� Die i Länge zweier i Pfade f d in i einem i RS-<strong>Baum</strong> unterscheidet hid sich ihh höchstens h<br />
um den Faktor 2<br />
Seite 220
Einfügen g und Löschen<br />
Effiziente Algorithmen<br />
� Einfügen und Löschen unterscheiden sich aber jetzt von natürlichen<br />
Suchbäumen.<br />
� Einfügen<br />
– Zunächst wird wie beim natürlichen Suchbaum durch eine Suche die<br />
Einfügeposition bestimmt und ein neuer roter Knoten eingefügt eingefügt.<br />
– Problem: Vaterknoten existiert nicht oder ist rot!<br />
� Löschen<br />
– Zunächst wird wie beim natürlichen Suchbaum der Schlüssel entfernt<br />
(ggf. durch Bestimmung des sym. Nachfolgers).<br />
�� Dadurch ist garantiert, garantiert dass ein Eintrag aus einem Knoten<br />
über den leeren Blättern gelöscht wird.<br />
– Problem: Der zu entfernende Knoten ist schwarz!<br />
Seite 221
Effiziente Algorithmen<br />
Einfügen g (Fall ( 1: kein Elternknoten) )<br />
� Wir betrachten zunächst den einfachen Fall, dass ein roter Knoten<br />
eingefügt wurde, aber kein Wurzelknoten vorhanden ist.<br />
– Wir färben dann den Knoten schwarz. Der Knoten wird dann zur neuen<br />
Wurzel des RB-<strong>Baum</strong>s.<br />
k k<br />
Seite 222
Effiziente Algorithmen<br />
Einfügen g (Fall ( 2: Elternknoten ist rot) )<br />
� Im Rest der Diskussion nehmen wir an, dass der Vaterknoten des neuen<br />
Knotens auch rot gefärbt ist.<br />
k<br />
k 1<br />
�� Zudem nutzen wir aus, aus dass ein RB-<strong>Baum</strong> auch als 2-4-<strong>Baum</strong> gesehen<br />
werden kann. Dies vereinfacht die Fallbetrachtungen!<br />
– Im Wesentlichen müssen (abgesehen von Symmetrien) nur zwei Fälle<br />
bbetrachtet h werden. d<br />
a) Der Schlüssel k wird in ein Knoten des 2-4-<strong>Baum</strong>s eingefügt, der<br />
bereits voll ist.<br />
b) Der Schlüssel k wird in ein ternären Knoten des 2-4-<strong>Baum</strong>s<br />
eingefügt, der noch Platz hat.<br />
– MMan bbeachte, h ddass wir i dden FFall ll eines i binären bi ä Knotens K überhaupt üb h nicht i h<br />
betrachten müssen.<br />
Seite 223
T 1<br />
T 1<br />
k<br />
k<br />
k 1<br />
T 2<br />
Effiziente Algorithmen<br />
Fall 2a: Knoten des 2-4-<strong>Baum</strong>s ist voll<br />
T 3<br />
k 2<br />
T 4<br />
k 3<br />
T 5<br />
� Ausgangslage<br />
– Farbinvariante ist verletzt<br />
– 2-4-Knoten ist zu voll<br />
– T1,…,T5 sind RB-<strong>Baum</strong> mit gleicher<br />
S-Höhe h<br />
Lösung<br />
� Überlaufbehandlung<br />
k2 – Erzeuge zwei neue 2-4-Knoten und<br />
färbe die Knoten so, dass die<br />
k 1<br />
k 3<br />
Farbinvariante erfüllt ist ist.<br />
– Färbe die ursprüngliche Wurzel rot<br />
und füge sie in den Vaterknoten ein.<br />
� rekursive Vorgehensweise<br />
T 2<br />
T 3<br />
T 4<br />
T 5<br />
Seite 224
T 1<br />
T 1<br />
k<br />
Effiziente Algorithmen<br />
Fall 2b: Knoten des 2-4-<strong>Baum</strong>s ist nicht voll<br />
k 1<br />
T 2<br />
T 3<br />
k 1<br />
k 2<br />
T 4<br />
k k 2 Knotens.<br />
k k 2<br />
T 2<br />
T 3<br />
T 4<br />
� Ausgangslage<br />
– Farbinvariante ist verletzt<br />
– 2-4-Knoten ist nicht zu voll<br />
– Teilbäume T1,…,T4 sind RB-<br />
Bäume mit igleicher lih S-Höhe h<br />
Lösung<br />
� Rechtsrotation im 2-4-Knoten<br />
– Binärknoten mit Schlüssel k1<br />
wird zur Wurzel des 2-4-<br />
Knotens<br />
– Umfärbung der Binärknoten<br />
� FERTIG<br />
Seite 225
T 1<br />
T 1<br />
k 1<br />
T 2<br />
k 1<br />
Effiziente Algorithmen<br />
Haben wir nicht diesen Fall vergessen? g<br />
k<br />
� Ausgangslage<br />
– Wie auf der letzten Folie, aber<br />
der neue Knoten ist jetzt das<br />
rechte Kind<br />
k 2 ,<br />
T 3<br />
T 4<br />
k Lösung:<br />
2<br />
� Durch eine Linksrotation<br />
k<br />
überführen wir diesen Fall in den<br />
bereits zuvor behandelten Fall.<br />
T 2<br />
T 3<br />
T 4<br />
Seite 226
Laufzeit<br />
Effiziente Algorithmen<br />
Satz<br />
� Das Einfügen g in einem <strong>Rot</strong>-<strong>Schwarz</strong>-<strong>Baum</strong> mit n Elementen hat Aufwand<br />
O(log n). Es werden höchstens zwei <strong>Rot</strong>ationen pro Einfügeoperation<br />
benötigt.<br />
Beweis<br />
� Die (S-)Höhe ( ) des RB-<strong>Baum</strong>s ist log g n.<br />
� Die Suche ist auf einen Pfad beschränkt.<br />
� Die globale Reparatur des <strong>Baum</strong>s läuft auf den Suchpfad rückwärts in<br />
Ri Richtung h Wurzel W l und d führt f h lokale l k l Reorganisationen R i i aus.<br />
– Wird dabei rotiert (maximal 2x), ist die Reparatur abgeschlossen.<br />
– Eine lokale Reorganisation benötigt konstante Zeit. Zeit<br />
– Gegebenenfalls wird noch eine neue Wurzel für den RB-<strong>Baum</strong><br />
erzeugt.<br />
� Die Kosten sind somit O(log n) und die Anzahl der <strong>Rot</strong>ation beträgt<br />
höchstens 2<br />
Seite 227
Löschen<br />
Effiziente Algorithmen<br />
� Fall der zu löschende Knoten rot gefärbt ist, wird keine Reorganisation<br />
benötigt und die Struktur des RB-<strong>Baum</strong>s bleibt unverändert.<br />
� Wird ein schwarzer Knoten in einem ternären Knoten gelöscht, so kann das<br />
Kind zur Wurzel des 2-4-Knotens gemacht werden.<br />
�� Auch in diesem Fall bleibt die Struktur des RB-<strong>Baum</strong>s RB <strong>Baum</strong>s unverändert.<br />
unverändert<br />
k k 1<br />
k 1<br />
� Wir brauchen also nur den Fall eines binären 2-4-Knotens zu betrachten.<br />
k<br />
– Sonderfall: Binärer Knoten ist die Wurzel des RB-<strong>Baum</strong>s<br />
• Dann ist der <strong>Baum</strong> nach dem Löschen leer!<br />
– Wie beim 2-3-<strong>Baum</strong> betrachten wir den Elternknoten P und den<br />
Geschwisterknoten R Seite 228
P<br />
R<br />
k 2<br />
k 1<br />
k 3<br />
Effiziente Algorithmen<br />
Fall 1: Elternknoten nicht binär<br />
B<br />
� Elternknoten P ternär<br />
� Es gibt g ein 2-4-Geschwisterknoten<br />
R, der nicht voll ist.<br />
– Durch eine <strong>Rot</strong>ation im<br />
Elternknoten P kann man sich<br />
ein Knoten R erzeugen.<br />
� B ist leer und hat keinen<br />
schwarzen Binärknoten.<br />
P<br />
k1 Lösung:<br />
� Nimm den binären Knoten aus der<br />
Wurzel und erzeuge mit den<br />
k3 Binärknoten aus R und dem<br />
k2 Verweis aus B einen neuen 2-4-<br />
Knoten.<br />
– Ggf. muss man hier rotieren<br />
FERTIG<br />
Seite 229
P<br />
R<br />
k 2<br />
k 3<br />
k 1<br />
k 4<br />
k 5<br />
Effiziente Algorithmen<br />
Fall 1: Elternknoten nicht binär<br />
B<br />
� Elternknoten P ternär<br />
� Es gibt g ein 2-4-Geschwisterknoten<br />
R, der voll ist.<br />
� B ist leer und hat keinen schwarzen<br />
Binärknoten Binärknoten.<br />
Lösung:<br />
� Durch maximal 2 <strong>Rot</strong>ationen<br />
können nun die Binärknoten<br />
umverteilt werden, so dass B<br />
wieder einen schwarzen Knoten<br />
bekommt bekommt.<br />
Seite 230
R<br />
P<br />
k 1<br />
P<br />
k k1 k 2<br />
k 2<br />
Fall 2: Elternknoten binär<br />
B<br />
� P binär, R binär<br />
� B ist leer<br />
Effiziente Algorithmen<br />
Lösung<br />
� Nimm Binärknoten aus P und<br />
verschmelz diesen mit dem<br />
Knoten aus R.<br />
�� P hat keinen schwarzen Knoten<br />
mehr.<br />
� Rekursive Vorgehensweise<br />
Seite 231
R<br />
R<br />
P<br />
k 1<br />
P<br />
k 2<br />
k 1<br />
k 3<br />
k 2<br />
Fall 2: Elternknoten binär<br />
k 3<br />
B<br />
B<br />
� P binär, R ist nicht binär<br />
� B ist leer<br />
Lösungg<br />
Effiziente Algorithmen<br />
� Durch <strong>Rot</strong>ation können die<br />
Binärknoten über die 2-4 Knoten<br />
wieder verteilt werden, werden so dass alle<br />
Invarianten erfüllt sind.<br />
FERTIG<br />
Seite 232
Laufzeit<br />
Effiziente Algorithmen<br />
Satz:<br />
� Das Löschen in einem <strong>Rot</strong>-<strong>Schwarz</strong>-<strong>Baum</strong> mit n Elementen hat Aufwand<br />
O(log n). Es werden höchstens drei <strong>Rot</strong>ationen pro Löschoperation<br />
benötigt.<br />
Beweis<br />
� Die (S-)Höhe ( ) des RB-<strong>Baum</strong>s ist log g n.<br />
� Die Suche ist auf einen Pfad beschränkt.<br />
� Die globale Reparatur des <strong>Baum</strong>s läuft auf den Suchpfad rückwärts in<br />
Ri Richtung h Wurzel W l und d führt f h lokale l k l Reorganisationen R i i aus.<br />
– Wird dabei rotiert (höchstens 3x), ist die Reparatur abgeschlossen.<br />
– Eine lokale Reorganisation benötigt konstante Zeit. Zeit<br />
– Gegebenenfalls wird die Wurzel des RB-<strong>Baum</strong> gelöscht (und das<br />
einzige Kind zur neuen Wurzel gemacht).<br />
� Die Kosten sind somit O(log n) und die Anzahl der <strong>Rot</strong>ation beträgt<br />
höchstens 3.<br />
Seite 233
Problem:<br />
� Gegeben: g<br />
Effiziente Algorithmen<br />
8.5 Optimale p binäre Suchbäume<br />
– eine Menge von Datensätzen {r1,…rn} – Zugriffswahrscheinlichkeit pi für den Datensatz ri, 1 � i � n.<br />
– Sei ein Suchbaum B für die n Datensätze gegeben und sei di die Tiefe<br />
des Knotens, wo der Datensatz ri platziert ist. Dann betragen die<br />
erwarteten Zugriffskosten g :<br />
� Gesucht:<br />
– Suchbaum B Bmin mit<br />
n<br />
�<br />
i�1<br />
�<br />
� � p B EC ) 1 ( ) (<br />
i i d i i<br />
EC B ) � min B<br />
( min<br />
EC(<br />
B)<br />
Seite 234
Beispiel p<br />
� Wir betrachten ein Beispiel bestehend aus folgenden 7 Datensätzen<br />
(Wörtern):<br />
Datensatz Wahrscheinlichkeit<br />
ab 0,22<br />
am 018 0,18<br />
an 0,2<br />
es 0,05<br />
in 0,25<br />
so 0,02<br />
zu 008 0,08<br />
� Lösungen<br />
– GGreedy-Algorithmus d Al i h<br />
• Element mit höchster Wahrscheinlichkeit in der Wurzel<br />
– Perfekt balancierter <strong>Baum</strong><br />
• Mittleres Element (Median) in die Wurzel<br />
Effiziente Algorithmen<br />
Seite 235
in<br />
Beispiel p ( (2) )<br />
es<br />
Effiziente Algorithmen<br />
abb zu am<br />
so abb<br />
iin<br />
an so<br />
ab an<br />
in zu<br />
an<br />
am es zu<br />
am es so<br />
Greedy-<strong>Baum</strong><br />
Kosten: 2,43<br />
Balancierter <strong>Baum</strong><br />
Kosten: 2,7<br />
Optimaler Suchbaum<br />
Kosten: 2,15<br />
Bemerkung<br />
� Greedy-Verfahren führt nicht zur optimalen Lösung. Gründe hierfür sind:<br />
– Der binäre <strong>Baum</strong> besitzt nicht nur die Daten in den Blattknoten<br />
– Der binäre <strong>Baum</strong> muss noch die Eigenschaft eines Suchbaums erfüllen.<br />
� Und jetzt? j<br />
Seite 236
Lösungsidee g<br />
Effiziente Algorithmen<br />
� Sei r L, r L+1, …, r R eine aufsteigend sortierte Folge von Datensätzen, die wir<br />
in einem Suchbaum speichern möchten. Nehmen wir nun an, daß r i die<br />
Wurzel des optimalen Suchbaums sei, L � i � R. Dann gilt:<br />
R<br />
��<br />
j� L<br />
EC(<br />
T ) pi<br />
� EC(<br />
T1)<br />
� EC(<br />
T2<br />
)<br />
� Offensichtlich kann EC(T) nur dadurch minimiert<br />
werden, wenn T1 und T2 wiederum optimale<br />
binäre Suchbäume sind.<br />
� Aus den R-L Möglichkeiten der Erzeugung<br />
optimaler Paare von Teilbäumen, Teilbäumen wählen wir<br />
uns das Paar, das die Gesamtkosten<br />
T1 minimiert.<br />
�� Wlh Welches Verarbeitungsparadigma V bi di soll llangewendet d werden? d ?<br />
r i<br />
T 2<br />
Seite 237
Analyse y<br />
Effiziente Algorithmen<br />
� Algorithmus<br />
– Wir erzeugen g uns mittels dynamischen y Programmierens g alle optimalen p<br />
Suchbäume Tij mit j ≥ i, die genau die Elemente ri,..,rj enthalten.<br />
• Genauer gesagt berechnen wir zunächst die minimalen Kosten und<br />
merken uns noch den „Splitwert“. Splitwert“<br />
– Die Berechnung erfolgt Bottom-up:<br />
• Die Kosten für T11,…,T 11, , nn sind durch p p1,…,p 1, ,p n gegeben. gg<br />
• Danach erzeugen wir uns durch Anwendung der rekursiven<br />
Gleichung (siehe oben) die optimalen BäumeTi i+j, die eine<br />
Teilfolge von j+1 Datensätzen enthalten, enthalten j=1,…,n-1. j=1 n 1<br />
Satz<br />
� Der optimale Suchbaum kann in O(n3 ) Zeit und O(n2 ) Speicherplatz<br />
berechnet werden.<br />
Seite 238