14. Rot-Schwarz-Bäume Bislang: Wörterbuchoperationen bei binären Suchbäume effizient durchführbar, falls Höhe des Baums klein. Rot-Schwarz-Bäume spezielle Suchbäume. Rot-Schwarz-Baum mit n Knoten hat Höhe höchstens 2 log(n+1). Tree-Search, Tree-Minimum,… können unverändert bleiben. Tree-Insert, Tree-Delete müssen erweitert werden, um Rot-Schwarz-Bäume zu erhalten. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 1 Rot-Schwarz-Bäume - Überblick 1. Definition von Rot-Schwarz-Bäumen 2. Zeigen Rot-Schwarz-Baum mit n Knoten hat Höhe höchstens 2 log(n+1). 3. Definieren Rotationen, als wichtiges Hilfsmittel zur Erweiterung von Tree-Insert und Tree-Delete. 4. Beschreiben Erweiterungen von Tree-Insert (und Tree-Delete), so dass Rot-Schwarz-Bäume erhalten bleiben. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 2 Rot-Schwarz-Bäume – Definition (1) Rot-Schwarz-Bäume sind binäre Suchbäume mit zusätzlichem Feld color für jeden Knoten x. color ist entweder Rot oder Schwarz. Wenn ein Eltern oder ein Kind eines Knotens nicht vorhanden, dann wird entsprechendes Feld auf NIL gesetzt. NIL wird als Verweis auf spezielle, externe Knoten betrachtet. Diese Knoten speichern keine Schlüssel. Restliche Knoten sind interne Knoten. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 3 Rot-Schwarz-Bäume – Definition (2) Definition 14.1: Ein binärer Suchbaum heisst RotSchwarz-Baum, wenn folgende Bedingungen erfüllt sind: 1. Jeder Knoten ist entweder rot oder schwarz. 2. Die Wurzel ist schwarz. 3. Jedes Blatt (NIL-Knoten) ist schwarz. 4. Ist ein Knoten rot, so sind seine Kinder schwarz. 5. Für jeden Knoten x enthält jeder abwärts gerichteter Pfad zu einem Blatt die gleiche Anzahl von schwarzen Knoten. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 4 Illustration von Rot-Schwarz-Bäumen NIL 7 2 11 1 NIL 5 NIL NIL 14 NIL NIL 4 NIL SS 2006 8 NIL Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume NIL 15 NIL NIL 5 Vereinfachung durch nil[T] Vereinfachung durch Ersetzen der NIL-Knoten durch ein zusätzliches Objekt nil[T]. Verweise zu NIL-Knoten ersetzt durch Verweise auf nil[T]. 7 2 11 1 5 8 4 14 15 nil[T] SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 6 Vereinfachte Darstellung Verzichten bei Darstellung von Rot-Schwarz-Bäumen auf nil[T] und auf Kanten zu nil[T]: 7 2 11 1 5 8 4 SS 2006 14 15 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 7 Höhe von Rot-Schwarz-Bäumen (2) Satz 14.2: Ein Rot-Schwarz-Baum mit n inneren Knoten hat höchstens Höhe 2 log(n+1). Korollar 14.3: Bei einem Rot-Schwarz-Baum mit n Knoten erfordern die Algorithmen Tree-Search Tree-Minimum, Tree-Maximum Tree-Successor, Tree-Predecessor Tree-Insert, Tree-Delete Zeit O(log(n)). SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 8 Erhaltung der Rot-Schwarz-Eigenschaft Nach Anwendung von Tree-Insert, Tree-Delete bei Rot-Schwarz-Baum ist Rot-Schwarz-Eigenschaft nicht notwendigerweise mehr erfüllt. Tree-Insert, Tree-Delete garantieren damit nicht, dass alle Wörterbuchoperationen effizient unterstützt werden. Dazu müssen Tree-Delete, Tree-Insert so erweitert werden, dass sie Rot-Schwarz-Eigenschaft erhalten. Erhaltung durch Umfärben von Knoten und Änderung von Verweisen. Letzteres durch Rotationen. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 9 Illustration Rotationen Links-Rotation(T,x) y x α γ x y β SS 2006 Rechts-Rotation(T,y) γ α Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume β 10 Algorithmus Left-Rotate Left - Rotate(T, x ) LinksRotation(T,x) 1 y ← right [x ] 2 right [x ] ← left [y ] x 3 if left [y ] ≠ nil [T ] 4 then p[left [y ]] ← x 5 p[y ] ← p[x ] 6 if p[x ] = nil [T ] 7 8 9 10 y y x α γ β γ α β then root [T ] ← y else if x = left [p[ x ]] then left [p[x ]] ← y else right [p[x ]] ← y 11 left [y ] ← x 12 p[x ] ← y SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 11 Illustration Left-Rotate 7 x 2 y 11 1 5 8 4 14 15 Left-Rotate(T,x) y 11 x 2 7 14 8 15 5 1 4 SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 12 Eigenschaften der Rotationen Lemma 14.4: Left-Rotate und Right-Rotate benötigen Zeit O(1). Lemma 14.5: Left-Rotate und Right-Rotate erhalten die Suchbaum-Eigenschaft. D.h. ist T ein Suchbaum und x ein Knoten in T, dann ist auch der Baum der nach Anwendung von Left-Rotate(T,x) entsteht ein Suchbaum, und analog für Right-Rotate. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 13 Einfügen eines Elements Tree - Insert (T , z ) 1 y ← nil [T ] 2 x ← root [T ] 3 while x ≠ nil [T ] 4 do y ← x 5 if key [z ] < key [x ] 6 then x ← left [x ] 7 else x ← right [x ] 8 p[z ] ← y 9 if y = nil [T ] 10 then root [T ] ← z 11 else if key [z ] < key [y ] 12 then left [y ] ← z 13 else right [y ] ← z 14 left [z ] ← nil [T ] Änderungen zu Tree-Insert: 1. NIL ersetzt durch nil[T]. 2. Setzen von left[z],right[z] auf nil[T]. (Zeilen 14,15) 3. Färbung von z. (Zeile 16) 4. Aufruf von RB-Insert-Fixup. (Zeile 17) 15 right [z ] ← nil [T ] 16 color [z ] ← RED 17 RB - Insert - Fixup(T,z ) SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 14 Einfügen eines Elements - Illustration 11 2 14 1 7 15 5 8 Nach Einfügen von Knoten mit Schlüssel 4: 11 2 14 1 7 5 15 8 4 SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 15 Verletzungen der Rot-Schwarz-Eigenschaft nach Zeilen 1-16 von RB-Insert Rot-Schwarz-Eigenschaft: Rot-Schwarz-Eigenschaft nach RB-Insert: 1. Jeder Knoten ist entweder rot oder schwarz. 1. Erfüllt. 2. Die Wurzel ist schwarz. 2. Nicht erfüllt, wenn z Wurzel. 3. Jedes Blatt (nil[T]) ist schwarz. 3. Erfüllt. 4. Ist ein Knoten rot, so sind seine Kinder schwarz. 4. Nicht erfüllt, wenn Eltern von z bereits rot ist. 5. Für jeden Knoten x enthält jeder Pfad zu einem Blatt die gleiche Anzahl von schwarzen Knoten. 5. Erfüllt. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 16 Algorithmus RB-Insert-Fixup RB - Insert - Fixup(T,z ) 1 while color [p[z ]] = RED 2 do if p[z ] = left [p[p[z ]]] 3 then y ← right [p[p[z ]]] 4 if color [y ] = RED 5 then color [p[z ]] ← BLACK 6 color [y ] ← BLACK 7 8 9 10 11 12 13 color [p[p[z ]]] ← RED z ← p[p[z ]] else if z = right [p[z ]] then z ← p[z ] Left - Rotate (T,z ) color [p[z ]] ← BLACK color [p[p[z ]]] ← RED 14 Right - Rotate (T,p[p[z ]]) 15 else (wie then, nur mit left/right vertauscht ) 16 color [root [T ]] ← BLACK SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 17 Invariante für RB-Insert-Fixup Ziel: Nach Durchlauf von RB-Insert-Fixup soll T wieder ein Rot-Schwarz-Baum sein. Invariante für while-Schleife: a. Knoten z ist rot. b. Ist p[z] die Wurzel, dann ist p[z] schwarz. c. Gibt es eine Verletzung der Rot-Eigenschaft, so ist Eigenschaft 2. und Eigenschaft 4. verletzt. Ist Eigenschaft 2. verletzt, dann nur weil z Wurzel und rot ist. Ist Eigenschaft 4. verletzt, dann nur weil z und p[z] rot sind. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 18 Initialisierung der Invariante Starten mit Rot-Schwarz-Baum, in den Knoten z eingefügt wurde. a. Eingefügter Knoten z ist rot. b. Ist p[z] Wurzel, so war p[z] schwarz. RB-Insert ändert Farbe von p[z] nicht. c. Haben gesehen, dass 1., 3., 5., auch nach Tree-Insert gelten. Verletzung von 2. und 4. kann nur durch Knoten z herbeigeführt werden. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 19 Verletzungen der Rot-Schwarz-Eigenschaft nach Zeilen 1-16 von RB-Insert Rot-Schwarz-Eigenschaft: Rot-Schwarz-Eigenschaft nach RB-Insert: 1. Jeder Knoten ist entweder rot oder schwarz. 1. Erfüllt. 2. Die Wurzel ist schwarz. 2. Nicht erfüllt, wenn z Wurzel. 3. Jedes Blatt (nil[T]) ist schwarz. 3. Erfüllt. 4. Ist ein Knoten rot, so sind seine Kinder schwarz. 4. Nicht erfüllt, wenn Eltern von z bereits rot ist. 5. Für jeden Knoten x enthält jeder Pfad zu einem Blatt die gleiche Anzahl von schwarzen Knoten. 5. Erfüllt. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 20 Terminierung der Invariante Nach Invariante kann Rot-Schwarz-Eigenschaft nur bei 2. und 4. verletzt sein. Bei Terminierung ist p[z] schwarz. Da Verletzung von 4. nur bei p[z] und z auftreten kann, ist 4. erfüllt. Nur noch 2. kann verletzt sein. Zeile 16 stellt sicher, dass 2. erfüllt ist. Zeile 16 kann nicht zur Verletzung anderer Eigenschaften führen. Alle 5 Eigenschaften erfüllt, damit T nach Durchlauf von RB-Insert-Fixup wieder Rot-Schwarz-Baum. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 21 Erhaltung der Invariante (1) Müssen bei Erhaltung 6 Fälle betrachten: 1) p[z] ist linkes Kind von p[p[z]] und Onkel y von z ist rot. 4) p[z] ist rechtes Kind von p[p[z]] und Onkel y von z ist rot. 2) p[z] ist linkes Kind von p[p[z]] Onkel y von z ist schwarz und z ist rechtes Kind. 5) p[z] ist rechtes Kind von p[p[z]] Onkel y von z ist schwarz und z ist rechtes Kind. 3) p[z] ist linkes Kind von p[p[z]] Onkel y von z ist schwarz und z ist linkes Kind. 6) p[z] ist rechtes Kind von p[p[z]] Onkel y von z ist schwarz und z ist linkes Kind. Fälle 1),2),3) symmetrisch zu Fällen 4),5),6). Deshalb nur 1),2),3). Wie auch schon in RB-Insert-Fixup. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 22 Illustration Fall 1) und 2) Fall 1) 11 2 14 1 7 15 5 z 8 y 4 Fall 2) 11 y 2 14 1 7 5 z 15 8 4 SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 23 Illustration Fall 3) Fall 3) 11 y 14 7 z 2 8 1 15 5 4 SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 24 Algorithmus RB-Insert-Fixup RB - Insert - Fixup(T,z ) 1 while color [p[z ]] = RED do if p[z ] = left [p[p[z ]]] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 then y ← right [p[p[z ]]] if color [y ] = RED then color [p[z ]] ← BLACK • Fall 1) Zeilen 5 – 8 • Fall 2) Zeilen10-11 • Fall 3) Zeilen 12-14 color [y ] ← BLACK color [p[p[z ]]] ← RED z ← p[p[z ]] else if z = right [p[z ]] then z ← p[z ] Left - Rotate(T,z ) color [p[z ]] ← BLACK color [p[p[z ]]] ← RED Right - Rotate(T,p[p[z ]]) else (wie then, nur mit left/right vertauscht ) 16 color [root [T ]] ← BLACK SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 25 RB-Insert-Fixup in Fall 1) then color [p[z ]] ← BLACK color [y ] ← BLACK color [p[p[z ]]] ← RED z ← p[p[z ]] 5 6 7 8 neues z C C D y A α B β z δ γ ε A D α B β δ ε γ Wurzeln der Teilbäume α,β,γ,δ,ε jeweils schwarz. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 26 RB-Insert-Fixup in Fall 2) z ← p[z ] Left - Rotate(T,z ) 10 11 C C δ y A α B β z z γ δ B α A y γ β Wurzeln der Teilbäume α,β,γ,δ,ε jeweils schwarz. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 27 RB-Insert-Fixup in Fall 3) color [p[z ]] ← BLACK color [p[p[z ]]] ← RED Right - Rotate (T,p[p[z ]]) 12 13 14 C δ B z A α B y γ z α A C β γ δ β Wurzeln der Teilbäume α,β,γ,δ,ε jeweils schwarz. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 28 Illustration von RB-Insert-Fixup Fall 1) 11 2 14 1 2 7 15 5 z 11 8 14 1 7 5 y 4 z y 15 8 4 Fall 2) Fall 3) 7 z 2 11 11 7 z 1 5 4 SS 2006 8 14 2 1 15 14 y 8 15 5 4 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 29 Laufzeitanalyse RB-Insert hat wie Tree-Insert Laufzeit proportional zur Höhe des Baumes. Bei einem Rot-Schwarz-Baum mit n Knoten also Laufzeit O(log(n)). Fälle 2) und 3) von RB-Insert-Fixup werden jeweils höchstens einmal ausgeführt. Nach 2) kommt immer 3) und in 3) wird die Verletzung von 4. beseitigt ohne neue Verletzungen einzuführen. In Fall 1) wird die Verletzung von Knoten z auf Knoten p[p[z]] übertragen. Damit kann Fall 1) höchstens O(log(n)) auftreten. Laufzeit von RB-Insert-Fixup somit O(log(n)). SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 30 Tree-Delete und Zusammenfassung Tree-Delete führt wie Tree-Insert zu Problemen: Nach Anwendung auf Rot-Schwarz-Baum sind Rot-SchwarzEigenschaften nicht mehr erfüllt. Erweiterung von Tree-Delete mit Hilfe von RB-DeleteFixup. Zusammen Laufzeit O(log(n)) und erhalten Rot-SchwarzEigenschaften bei Entfernen von Knoten. Insgesamt können also durch Rot-Schwarz-Bäume alle Wörterbuchoperationen effizient nämlich in Zeit O(log(n)) unterstützt werden. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 31 Alternativen zu Rot-Schwarz-Bäumen Neben Rot-Schwarz-Bäumen gibt es noch andere Varianten von Suchbäumen, die Wörterbücher effizient implementieren. Hierzu gehören u.a. 1. AVL-Bäume 2. 2-3-4-Bäume 3. Zufällige Suchbäume (randomized search trees (RST)) 4. B-Bäume (besonders gut für Sekundärspeicher geeignet) Als Alternative zu Hashing und Suchbäumen gibt es noch Skip-Listen. Diese sind Erweiterungen von verketteten Listen. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 32 Zusammenfassung Datenstrukturen Dynamische Menge/abstrakten Datentypen sind Mengen mit Operationen, die effizient ausgeführt werden sollen, z.B. Wörterbücher, Warteschlangen,…. Dabei kann die Menge durch Einfügen/Entfernen von Objekte geändert werden. Nützlich, wenn bestimmte Operationen immer wieder durchgeführt werden müssen, z.B. Maximumbestimmung bei Heap-Sort. Datenstrukturen als Implementierungen von dynamischen Mengen. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 33 Geometrische Datenstrukturen Kennen gelernt: 1. Stacks, Queues, Listen 2. Hashing 3. Binäre Suchbäume, speziell Rot-SchwarzBäume Datenstrukturen werden häufig auch in geometrischen Anwendungen (Computer Graphik, Geographische Informationssysteme (GIS)) benutzt. Dynamische Menge S definiert durch Punkte in der Ebene und so genannte Bereichsabfragen. SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 34 Geometrische Datenstrukturen Bereichsabfragen: Gegeben ein geometrisches Objekt eines bestimmten Typs, sollen alle Elemente aus S berechnet werden, die im Objekt enthalten sind. Typen von Objekten können z.B. sein Halbebenen Kreise Rechtecke SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 35 Geometrische Datenstrukturen - Beispiel Kreisabfrage: SS 2006 Datenstrukturen und Algorithmen 14. Rot-Schwarz-Bäume 36