Rot-Schwarz-Bäume Informatik I Folgerung: Einführung • Die Operation suche, minimum, maximum, symmetrischer Nachfolger und symmetrischer Vorgänger benötigen O(log n) Zeit auf Rot-Schwarz-Bäumen Rainer Schrader • das gleiche gilt auch für füge_ein und lösche Zentrum für Angewandte Informatik Köln • allerdings können die bisherigen Realisierungen nicht garantieren, dass auch nachher noch ein Rot-Schwarz-Baum vorliegt. 20. Juni 2005 • Wir werden zeigen, dass wir auch dies in O(log n) Zeit erreichen können. 2 / 30 1 / 30 Rot-Schwarz-Bäume Rot-Schwarz-Bäume • Rotationen sind Hilfsoperationen, die helfen, nach Einfügen oder Leftrotate(T , x ) Entfernen eines Knotens in einem Rot-Schwarz-Baum die Eigenschaften 1–4 wieder herzustellen. (1) setze y = rightson(x ) • Rotationen ändern lokal die Zeigerstruktur unter Erhaltung der (2) setze rightson(x ) = leftson(y ) Suchbaum-Eigenschaft (3) setze Vater (leftson(y )) = x Links−Rotation leftrotate(T,x) (4) setze Vater (y ) = Vater (x ) Rechts−Rotation rightrotate(T,y) (5) ist x Wurzel von T , so mache y zur Wurzel von T (6) andernfalls: y (7) ist x linker Sohn seines Vaters, so mache y zum linken Sohn des Vaters von x x rightrotate(T,y) (8) ist x rechter Sohn seines Vaters, so mache y zum rechten Sohn des Vaters von x x (9) setze leftson(y ) = x y (10) setze Vater (x ) = y α γ leftrotate(T,x) α β β Rightrotate ist symmetrisch zu Leftrotate. γ Laufzeit: O(1) Bei Rechtsrotationen muss gelten x 6= NULL, entsprechend bei Linksrotationen. 3 / 30 4 / 30 Rot-Schwarz-Bäume Rot-Schwarz-Bäume Illustration: füge_ein(T , u) 7 (1) füge u wie in Suchbäumen als neuen Knoten mit zwei neuen Blättern ein x 4 (2) färbe die neuen Blätter schwarz und u rot. 11 y 3 6 9 (3) da wir einen schwarzen Knoten durch einen roten Knoten mit zwei schwarzen Söhnen ersetzen, kann lediglich Bedingung (iii) verletzt sein. 18 2 14 (4) ist u Wurzel oder w = Vater(u) schwarz, stop. (T ist zulässig gefärbt.) 19 12 17 (5) andernfalls: ist w Wurzel, so färbe w schwarz, stop. (T ist zulässig gefärbt.) 22 (6) sei x = Vater(w ). Dann ist x schwarz, da w rot. 20 (7) sei w rechter Sohn von x (der andere Fall folgt symmetrisch) (8) hat x nur rote Söhne, vertausche Farben, setze u := x und gehe zu (4) (Tx ist repariert, gehe höher im Baum) 7 y 4 18 r+1 x 3 6 11 9 14 r+1 r r 2 r+1 19 r+1 22 12 17 r 20 r r r Untersuchung der Ränge 5 / 30 6 / 30 Rot-Schwarz-Bäume Rot-Schwarz-Bäume (8) andernfalls: da w rot ist, muß der Bruder b von u wegen (iii) schwarz sein. Wir unterscheiden zwei Fälle (8a) u = Rightson(w ) : führe eine L-Rotation durch und färbe um r+1 r+1 r r Laufzeit r r • füge_ein: O(log n) r r r r r • Anzahl der Durchläufe von (4)-(7): O(log n). (immer nach oben) r r (8b) r • also insgesamt O(log n) (bei maximal zwei Rotationen). u = Leftson(w ) : führe zwei Rotationen durch und färbe um r+1 r+1 r+1 r r r r r r r r r r r r r r r r r r 7 / 30 8 / 30 Entfernung des Knotens z Rot-Schwarz-Bäume Illustration zum Entfernen: Entferne(T , x ) 15 v 5 16 3 u sei y der Knoten, der aus T entfernt wird • • • sei also y schwarz • • ist x rot, so färben wir x schwarz und erhalten einen Rot-Schwarz-Baum ist y rot, so bleibt T ein Rot-Schwarz-Baum: • der Rang (Schwarzhöhe) aller Knoten bleibt unverändert, • keine zwei roten Knoten sind benachbart. 20 12 10 • • 13 18 23 6 7 wenn y ein einziges Kind hat, sei x diese Kind, andernfalls sei x ein Blatt es können zwei Fehler auftreten: • x und Vater (y )(= Vater (x )) sind rot • die Pfade, die y enthielten, haben einen schwarzen Knoten weniger ist x schwarz, so ist Vater (x ) unbalanciert 9 / 30 10 / 30 Rot-Schwarz-Bäume Rot-Schwarz-Bäume Entferne(T , x ) • zum Ausgleich machen wir x „doppelt schwarz“. Entferne(T , x ) • dann stimmt die Farbbalance entlang von Pfaden • • • • • aber x ist falsch gefärbt • wir schieben die doppelte Farbe schrittweise nach oben bis wir a) einen roten Knoten erreichen: b) oder die Wurzel erreichen: c) oder geeignete Rotation und Umfärbungen machen können. sei x ein „doppelt schwarzer“ Knoten, der nicht schon die Wurzel ist wir betrachten den Fall „x ist linkes Kind“ (rechtes Kind symmetrisch). sei w der Bruder von x w ist nicht Blatt, da sonst Vater(x ) vor dem Löschen die Balance verletzt hätte ; färbe ihn schwarz ; entferne zusätzliches schwarz 11 / 30 12 / 30 Rot-Schwarz-Bäume • • • • • • Rot-Schwarz-Bäume • • • Fall 1: w ist rot dann sind die Söhne von w schwarz vertausche die Farben von w und Vater(x ) Fall 2: w ist schwarz, beide Söhne von w sind schwarz färbe x einfach schwarz und w rot schiebe schwarz zum Vater von x : • ist Vater (x ) rot, so färbe ihn schwarz, STOP • (wenn vorher Fall 1 eingetreten ist, ist Vater (x ) rot) • andernfalls haben wir die doppelte Färbung nach oben verschoben führe eine Linksrotation im Vater(x ) durch danach ist der Bruder von x schwarz ; Fall 2,3 oder 4 • setze x = Vater (x ) und iteriere r+1 r+1 B D Fall 1 x w r r A r D C r E r B E w A C w A r r−1 r r D A D E r−1 C r−1 r−2 r−1 r−1 D r−1 r−2 r−1 B Fall 2 x D x r−2 x B r r−1 C r−2 r−1 r−2 r−2 r−1 E r−2 r−2 13 / 30 14 / 30 Rot-Schwarz-Bäume • • • • • Rot-Schwarz-Bäume • • • • • Fall 3: w ist schwarz, der linke Sohn ist rot, der rechte ist schwarz vertausche die Farben von w und seinem linken Sohn führe eine Rechtsrotation an w aus danach ist der neue Bruder w von x schwarz mit einem roten rechten Sohn ; Fall 4 Fall 4: w ist schwarz, der rechte Sohn ist rot färbe w wie Vater (x ), Vater (x ) und den rechten Sohn von w schwarz, führe eine Linksrotation im Vater (x ) aus entferne die doppelte Färbung von x danach ist T ein Rot-Schwarz-Baum x B B Fall 3 B r w x A r−2 r r D A C r D C r−1 r−1 E r−1 r−2 r w A r−1 r r r−1 r−2 C E r−2 r−1 E r−1 r−1 r−2 r B D D r−1 D Fall 4 x r−1 x E D A r−1 w C r−1 r−1 r−2 Laufzeit: O(log n). 15 / 30 16 / 30 Zusammenfassung weitere Balancekonzepte Rot-Schwarz-Bäume bilden eine Datenstruktur, die die folgenden Operationen auf dynamischen Mengen unterstützt: • • • • • • • • Wir haben gesehen, dass rang-balancierte Bäume ebenfalls suche Rot-Schwarz-Bäume darstellen. bestimme das Minimum • Das gilt auch für ein weiteres Konzept von balancierten Bäumen. bestimme das Maximum bestimme den Vorgänger einer symmetrischen Durchmusterung AVL-Bäume (nach Adelson-Velskii und Landis) bestimme den Nachfolger einer symmetrischen Durchmusterung Ein binärer Baum heißt AVL-Baum, wenn sich in jedem Knoten die Höhen des rechten und des linken Teilbaums um höchstens 1 unterscheiden. füge ein lösche 17 / 30 18 / 30 weitere Balancekonzepte Eine Anwendung: Das Sichtbarkeitsproblem Lemma AVL-Bäume sind Rot-Schwarz-Bäume. Beweisskizze: 9 • färbe alle Knoten mit gerader Höhe (einschließlich der Blätter) schwarz • ein Knoten mit ungerader Höhe wird genau dann rot gefärbt, wenn die Chip (n Zellen) 8 A 7 6 Höhe seines Vater um genau 1 größer ist B D A A 2 2 3 B 0 1 J G D J E 1 H F F 2 G E E 1 B F 1 einhalten! 3 4 D C Mindestbestände 5 4 1 kompaktieren 1 H 0 19 / 30 1 2 3 4 5 6 7 8 9 10 11 12 20 / 30 Das Sichtbarkeitsproblem Das Sichtbarkeitsproblem 9 9 8 A 7 6 B 5 8 kompaktieren 7 Mindestbestände 5 einhalten! 4 3 E C Mindestbestände D einhalten! 2 F 1 E F 1 0 0 0 • kompaktieren B 3 2 • • Chip (n Zellen) A 6 C D 4 Chip (n Zellen) 1 2 3 4 5 6 7 8 9 10 11 12 0 Die relevanten Paare sind die, die sich „sehen“ können (A, D) (A, E ) (B, E ) (C, F ) (D, E ) 1 2 3 4 5 6 7 • Naives Verfahren: • Überprüfung aller • ; `n ´ S, S 0 formal: zwei Paare sind gegenseitig sichtbar, wenn es eine vertikale Linie gibt, die S und S 0 , aber kein Element zwischen S und S 0 schneidet 2 8 9 10 11 12 Paare auf vertikale (horizontale) Sichtbarkeit Ω(n 2 ) Laufzeit 21 / 30 22 / 30 Das Sichtbarkeitsproblem Das Sichtbarkeitsproblem Beobachtung: Beim vertikalen (horizontalen) Sichtbarkeitsproblem spielen die Höhen (Breiten) der Zellen keine Rolle. Weitere Beobachtung: Man kann alle Sichtbarkeiten durch vertikale Linien visualisieren, die sich gegenseitig nicht schneiden. Bei vertikaler Sichtbarkeit Reduktion auf südliche Grenzen: 9 8 A 7 6 B 5 D C 4 9 8 A 7 6 B 5 D C 4 2 E F 0 0 1 2 3 4 5 6 7 8 9 3 2 E 10 11 12 F 1 0 Vertikale Koordinaten: y (A) = 7 y (B) = 5 .. . 3 1 Horizontale Segmente, linke und rechte Koordinaten: (xl (A), xr (A)) = (1, 4) (xl (B), xr (B)) = (6, 8) . .. 0 1 2 3 4 5 6 7 8 9 10 11 12 Der korrespondierende Graph mit n Knoten ist planar, d.h. er kann ohne Kantenüberkreuzungen gezeichnet werden. 23 / 30 24 / 30 Das Sichtbarkeitsproblem Das Sichtbarkeitsproblem Idee eines Scanline-Ansatzes Satz (ohne Beweis) Ein planarer Graph mit n ≥ 3 Knoten hat höchstens 3n − 6 Kanten. ⇒ Es kann nur O(n) viele Sichtbarkeitspaare geben. Sei L eine Datenstruktur, die die Operationen unterstützt: • • • • füge_ein lösche Vorgänger • • • • wir fahren den Bereich von links nach rechts mit einer vertikalen Scan-Linie ab • während des Scannens verwalten wir dynamisch die Menge aller Segmente, die von der Scan-Linie geschnitten werden: • wird der Anfangspunkt eines Intervalls erreicht, so fügen wir das Intervall in die Menge ein • wird der Endpunkt eines Intervalls erreicht, so entfernen wir das Intervall aus der Menge • die Sichtbarkeitsrelation wird durch benachbarte Schlüsselwerte bestimmt Nachfolger dabei halten wir nur an Anfangs- oder Endpunkten von Segmenten dazu verwenden wir eine sortierte Liste aller x -Koordinaten dieser Punkte die y -Koordinaten der Segmente fassen wir als Schlüssel auf 25 / 30 26 / 30 Das Sichtbarkeitsproblem Skizze eines scan-line-Ansatzes (1) while Q 6= ∅ do Datenstrukturen • • • • • (2) entferne das nächste Element (x , S, e) aus Q (3) if (e = l ) do (4) füge (y (S), S) in T ein zu jedem Segment S existieren Angaben (xl , S, l ), (xr , S, r ) und (y , S) (5) sei (y 0 , S 0 ) Vorgänger in T sortiere die 2n Werte (xl , S, l ), (xr , S, r ) aufsteigend nach x -Koordinaten ; O(n log n) (6) falls S 0 existiert, gib (S, S 0 ) aus (7) sei (y 00 , S 00 ) Nachfolger in T sei Q eine Schlange, die diese Werte aufsteigend enthält (8) falls S 00 existiert, gib (S, S 00 ) aus sei T ein Rot-Schwarz-Baum, der die aktuellen Segmente aufnimmt (9) die Nachbarsegmente werden durch die Operationen „Nachfolger“ bzw. „Vorgänger“ in der symmetrischen Durchmusterung bestimmt else do // e = r (y 0 , S 0 ) (10) sei (11) sei (y 00 , S 00 ) Nachfolger in T (12) falls S 0 , S 00 existieren, gib (S 0 , S 00 ) aus (13) lösche (y (S), S) aus T (14) Vorgänger in T end if (15) end while 27 / 30 28 / 30 Scanline-Ansatz Das Sichtbarkeitsproblem im Beispiel: Anfang von Q (1, A, l ) (1, E , l ) (2, D, l ) (3, D, r ) (4, A, r ) (6, B, l ) (7, E , r ) (8, B, r ) (9, C, l ) (9, F , l ) (10, F , r ) (11, C, r ) ∅ Inhalt von L (7, A) (1, E ), (7, A) (1, E ), (4, D), (7, A) (1, E ), (7, A) (1, E ) (1, E ), (5, B) (5, B) ∅ (4, C) (1, F ), (4, C) (4, C) ∅ Ausgabe • inklusive Dupklikate werden O(n) Paare ausgegeben • implementiert man Q einfach als Array und sortiert etwa mit Heapsort, (E , A) (D, E ), (D, A) (E , A) so benötigt das Verfahren O(n log n) Zeit für die Erstellung von Q und O(1) Zeit für jedes Entfernen aus Q (B, E ) • im Rot-Schwarz-Baum T benötigen wir O(log n) Zeit für jede Operation • daraus ergibt eine Gesamtlaufzeit von O(n log n) (C, F ) • offensichtlich benötigt das Verfahren O(n) Speicherplatz. 29 / 30 30 / 30