Übersicht Rot-schwarz Bäume • Eigenschaften • Einfügen Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2009 2 Rot-schwarz Bäume Rot-schwarz Bäume • Binäre Suchbäume sind nur effizient wenn Höhe des Baumes klein • Binäre Suchbäume mit einem Bit Zusatzinformation pro Knoten • Rot-schwarz Bäume garantieren, dass Höhe im Worst Case O(lg n) statt O(n) wie vorher • Alle Blätter sind nil und schwarz – Farbe des Knotens rot oder schwarz – All Alle Operationen O i sind i d O(lg O(l n)) – Eine von vielen Varianten von balancierten Suchbäumen – Ein Wächter Element nil für ganzen Baum – color[nil[T]] ist schwarz – Vater von Wurzel zeight auch auf nil[T] • Andere Eigenschaften wie binäre Suchbäume (key, left, right, p) 3 Eigenschaften 4 Beispiel 5 6 1 Höhe von rot-schwarz Bäumen Beispiel • Höhe eines Knotens – Länge des längsten Pfades vom Knoten zu einem Blatt • Schwarz-Höhe eine Knotens bh(x) – A Anzahl hl Schwarzer S h K Knoten t auff d dem Pf Pfad d von x zu irgendeinem Blatt – x selbst nicht gezählt – Blatt nil[T] mitgezählt – Wegen Eigenschaft 5 wohldefiniert 7 8 Höhe von rot-schwarz Bäumen Höhe von rot-schwarz Bäumen • Ziel: zeige, dass Eigenschaften von rotschwarz Bäumen garantieren, dass Höhe des Baumes h = O(lg n) • Ziel: zeige, dass Eigenschaften von rotschwarz Bäumen garantieren, dass Höhe des Baumes h = O(lg n) 1. Behauptung: Knoten mit Höhe h hat Schwarz-Höhe Schwarz Höhe bh mindestens h/2 • Beweis: Eigenschaft 4 – Höchstens h/2 rote Knoten auf einem Pfad von Knoten zu jedem Blatt – Mindestens h/2 Schwarze Knoten 9 10 Höhe von rot-schwarz Bäumen Höhe von rot-schwarz Bäumen 2. Behauptung: Unterbaum von jedem Knoten x hat ≥ 2bh(x) − 1 interne Knoten • Zusammenfassend 1. Knoten mit Höhe h hat Schwarz-Höhe ≥ h/2 2. Für jeder Knoten x, Unterbaum hat interne Knoten ≥ 2bh(x) − 1 • Sei b Schwarz Schwarz-Höhe Höhe der Wurzel, Wurzel n Anzahl Knoten im ganzen Baum 11 12 2 Operationen Vorbereitung: Rotationen • Nicht-modifizierende Operationen (Suchen, Vorgänger, Nachfolger, Minimum, Maximum) gleich wie binäre Suchbäume • Grundsätzliche Operation um Baumstruktur zu verändern • Benötigt um rot-schwarz BaumEigenschaften zu erhalten – Aufwand O(lg n) • Einfügen und Löschen sind komplizierter • Umhängen von Zeigern – Was ist Farbe von eingefügten Knoten? • Rot: kann Eigenschaft 4 verletzen • Schwarz: kann Eigenschaft 5 verletzen • Bewahrt binäre Suchbaum-Eigenschaft • Es gibt Links- und Rechtsrotationen – Löschen • Rote Knoten kein Problem • Schwarze Knoten: kann Eigenschaften 2, 4, oder 5 verletzen – Inverse voneinander 13 Rotationen 14 Beispiel 15 Rotationen 16 Einfügen • Aufwand konstant, da eine konstante Anzahl Zeiger verändert werden • Rotationen werden also in anderen Suchbäumen verwendet – AVL Bäume, Bä SSplay l Bä Bäume 18 3 Eigenschaften Wiederherstellen der Eigenschaften 1. Ok 2. Verletzt falls z die Wurzel ist, sonst Ok 3. Ok 4. Verletzt falls p[z] rot ist: sowohl z wie auch p[z] sind rot 5. Ok 19 20 Schleifeninvariante Schleifeninvariante • Zu Beginn jeder Iteration der whileSchleife gilt • Initialisierung: a. z ist rot b. Es gibt höchstens eine rot-schwarz Ve let u g Verletzung • Terminierung: – Folgt aus Zustand nach Einfügen – Schleife endet weil p[z] schwarz ist, also ist Ei Eigenschaft h ft 4 ok k – Letzte Zeile garantiert Eigenschaft 2 • Eigenschaft 2: z is die Wurzel und rot • Eigenschaft 4: sowohl z wie auch p[z] sind rot • Fortsetzung – Falls z die Wurzel ist, ist p[z] der Wächter und schwarz, und die Schleife endet – Zu Beginn ist nur Eigenschaft 4 verletzt 21 Schleifeninvariante 22 Fall 1: y ist rot • 6 Fälle, 3 symmetrisch zu den anderen 3 – p[z] ist entweder rechtes oder linkes Kind – Annahme: p[z] ist linkes Kind – y bezeichnet den Onkel von z, also den Bruder von p[z] • Fälle schliessen sich gegenseitig nicht aus • p[p[z]] muss schwarz sein, weil sowohl z wie p[z] rot sind, aber es nur eine Verletzung von Eigenschaft 4 gibt • Mache p[z] und y schwarz => Eigenschaft 4 ok, aber Eigenschaft 5 kann verletzt sein • Mache p[p[z]] rot => Eigenschaft 5 ok 23 • Nächste Iteration hat p[p[z]] als neues z 24 4 Fall 2: y ist schwarz, z ist rechtes Kind Fall 3: y ist schwarz, z ist linkes Kind • Mache p[z] schwarz und p[p[z]] rot • Rechtsrotation um p[p[z]] • Eigenschaft 4 ok: nicht mehr zwei aufeinanderfolgende rote Knoten • Linksrotation um p[z] => > z ist nun linkes Kind, und z und p[z] sind rot • p[z] ist jetzt Schwarz => keine weiteren Iterationen • Sind nun in Fall 3 25 Analyse 26 Löschen • O(lg n) für RB-Insert • Für RB-Insert-Fixup – Jede Iteration ist O(1) – Jede Iteration ist entweder die letzte (Fälle 2 und d 3) oder d b bewegtt z zweii St Stufen f nach h oben b (Fall 1) – O(lg n) Stufen => O(lg n) Zeit – Höchstens 2 Rotationen insgesamt! • Total: Einfügen in rot-schwarz Baum ist O(lg n) 27 28 Löschen Rot-schwarz Verletzungen • y wurde ausgeschnitten • Falls y rot, keine Verletzungen – – • x ist entweder – y‘s einziges Kind bevor y ausgeschnitten wurde – oder der Wächter, falls y keine Kinder hatte Keine Veränderung der Schwarz-Höhen Keine neuen roten Knoten • Falls y schwarz, mögliche Verletzungen 1. Ok 1 2. Falls y die Wurzel und x rot ist, dann wurde Wurzel rot 3. Ok 4. Verletzt falls p[y] und x rot sind 5. Jeder Pfad, der y enthält, hat jetzt einen schwarzen Knoten weniger • p[x] zweigt auf Knoten, der vorher y‘s Vater war 29 30 5 Rot-schwarz Verletzungen Reparatur • Idee zur Reparatur: x bekommt ein „zusätzliches“ Schwarz • Interpretation – Der Knoten, auf den x zeigt, hat ein zusätzliches („gedachtes“) Schwarz, aber sein Farbattribut wird nicht geändert • Alle Pfade, die x enthalten, erhalten +1 schwarz • Idee: dee: bewege x im Baum au nach ac obe oben,, b biss • Eigenschaft 5 repariert, aber Eigenschaft 1 verletzt – x zeigt auf einen rot & schwarzen Knoten => mache x schwarz – x zeigt auf die Wurzel => zusätzliches Schwarz wird einfach entfernt – Geeignete Rotationen und Umfärbungen durchgeführt werden können – x ist doppelt schwarz oder rot & schwarz 31 Reparatur 32 Reparatur • In der while Schleife – Zeigt x immer auf einen nicht-Wurzel, doppelt schwarzen Knoten – w ist der Bruder von x – w kann nicht nil[T] sein, weil das Eigenschaft 5 am Knoten p[x] [ ] verletzen verlet en würde • 8 Fälle, je 4 symmetrisch – Hier: betrachten Fälle wo x ein linkes Kind ist – Fälle schliessen sich gegenseitig nicht aus • Idee: jede Transformation erhält Eigenschaft 5 33 34 Fall 1 Fall 2 Bruder w von x ist rot w ist schwarz und w‘s Kinder sind schwarz • w muss schwarze Kinder haben • Mache w schwarz und p[x] rot • Entferne 1 Schwarz von x (=> einfach schwarz) und 1 von w (=> rot) • Linksrotation auf p[x] • Bewege Schwarz zu p[x] • Neuer Bruder von x war Kind von w bevor Rotation => muss schwarz sein • Nächste Iteration mit p[x] als neuem x • Gehe zu Fall 2, 3 oder 4 35 • Falls vorher Fall 1, dann war p[x] rot => neues x ist rot & schwarz => Farbattribut von neuem x ist rot => Schleife terminiert, neues x wird schwarz in letzter Zeile 36 6 Fall 3 Fall 4 w ist schwarz, linkes Kind rot, rechtes schwarz w ist schwarz, w‘s linkes Kind schwarz, rechtes rot p[ ] • Mache w die Farbe von p[x] • Mache w rot und w‘s linkes Kind schwarz • Mache p[x] schwarz und w‘s rechtes Kind schwarz • Rechtsrotation auf w • Linksrotation auf p[x] • Neuer Bruder w von x ist schwarz mit rotem Kind => Fall 4 • Entferne extra schwarz auf x (=> x jetzt einfach schwarz) ohne rot-schwarz Eigenschaften zu verletzen • Fertig. Lass x auf Wurzel zeigen, Schleife terminiert 37 38 Analyse Nächstes Mal • RB-Delete ist O(lg n) • Ferienwoche • RB-Delete-Fixup • Nachher: dynamisches Programmieren – Nur Fall 2 erfordert mehr Iterationen • x bewegt sich eine Stufe nach oben • O(lg O(l n)) Iterationen It ti – Fälle 1, 3 und 4 haben eine Rotation => höchstens 3 Rotationen total – Total O(lg n) 39 40 7