22.12.2012 Aufrufe

Rot-Schwarz-Baum

Rot-Schwarz-Baum

Rot-Schwarz-Baum

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!