Rot-Schwarz-Bäume Algorithmen und Datenstrukturen I Abstrakte Datentypen VI: Rot-Schwarz-Bäume D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c Winter 2009/10, 17. Dezember 2009, 2009/10 D.Rösner D. Rösner AuD I 2009/10 . . . 1 Rot-Schwarz-Bäume Gliederung 1 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation D. Rösner AuD I 2009/10 . . . 2 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: Rot-Schwarz-Bäume Rot-Schwarz-Bäume (engl. red-black trees) sind binäre Suchbäume, bei denen die Balanziertheit durch folgende Bedingungen erzwungen wird (vgl. [Oka98]): Jeder Knoten ist entweder rot oder schwarz gefärbt. Kein roter Knoten hat ein rotes Kind. Jeder Pfad von der Wurzel bis zu einem leeren Knoten enthält die gleiche Anzahl schwarzer Knoten. Bemerkungen: Leere Knoten gelten immer als schwarz gefärbt. Manchmal wird auch gefordert (vgl. [GT01], [Wei98]), dass der Wurzelknoten immer schwarz sein soll. (Warum ist das keine wirkliche Einschränkung im Hinblick auf mögliche Formen der Bäume?) D. Rösner AuD I 2009/10 . . . 4 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Bäume: AVL-Bäume 5 2 1 7 3 6 8 4 Abbildung: Ein AVL-Baum (vgl. [RL99], Fig. 5.6 (a)) D. Rösner AuD I 2009/10 . . . 5 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Bäume: AVL-Bäume 5 2 1 7 3 6 8 4 Abbildung: Ein AVL-Baum interpretiert als Rot-Schwarz-Baum (vgl. [RL99], Fig. 5.6 (a)) D. Rösner AuD I 2009/10 . . . 6 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Bäume: AVL-Bäume 4 2 6 3 5 8 9 Abbildung: Ein AVL-Baum (vgl. [RL99], Fig. 5.6 (b)) D. Rösner AuD I 2009/10 . . . 7 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Bäume: AVL-Bäume 4 6 2 3 5 8 9 Abbildung: Ein AVL-Baum interpretiert als Rot-Schwarz-Baum (vgl. [RL99], Fig. 5.6 (b)) D. Rösner AuD I 2009/10 . . . 8 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Bäume: AVL-Bäume 6 3 2 7 4 1 Abbildung: Binärer Baum ohne AVL-Eigenschaft (vgl. [RL99], Fig. 5.6 (c)) D. Rösner AuD I 2009/10 . . . 9 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Bäume: AVL-Bäume 6 3 2 7 4 1 Abbildung: Binärer Baum ohne AVL-Eigenschaft: Wie als Rot-Schwarz-Baum interpretierbar? (vgl. [RL99], Fig. 5.6 (c)) D. Rösner AuD I 2009/10 . . . 10 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Suchbäume 5 2 6 4 3 8 9 Abbildung: Binärer Suchbaum: als Rot-Schwarz-Baum interpretierbar? (vgl. [RL99], Ch. 5.7, Fig. 5.2 (a)) D. Rösner AuD I 2009/10 . . . 11 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Suchbäume 5 3 2 8 4 6 9 Abbildung: Binärer Suchbaum Variante: als Rot-Schwarz-Baum interpretierbar? (vgl. [RL99], Fig. 5.2 (b)) D. Rösner AuD I 2009/10 . . . 12 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Suchbäume 5 3 2 8 4 6 9 Abbildung: Binärer Suchbaum Variante 1 als Rot-Schwarz-Baum (vgl. [RL99], Fig. 5.2 (b)) D. Rösner AuD I 2009/10 . . . 13 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Suchbäume 5 3 2 8 4 6 9 Abbildung: Binärer Suchbaum Variante 2 als Rot-Schwarz-Baum (vgl. [RL99], Fig. 5.2 (b)) D. Rösner AuD I 2009/10 . . . 14 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Suchbäume 5 3 2 8 4 6 9 Abbildung: Binärer Suchbaum Variante 3 als Rot-Schwarz-Baum (vgl. [RL99], Fig. 5.2 (b)) D. Rösner AuD I 2009/10 . . . 15 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: Rot-Schwarz-Bäume Welche unterschiedlichen Pfadlängen sind in einem Rot-Schwarz-Baum möglich? Antwort: .............................................. .............................................. Wenn jeder Pfad eines Rot-Schwarz-Baums genau B schwarze Knoten enthält, wieviel Knoten muss der Baum dann mindestens haben? Wieviele Knoten kann er höchstens enthalten? Antwort: .............................................. .............................................. D. Rösner AuD I 2009/10 . . . 17 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: Rot-Schwarz-Bäume Was ist dann die maximale Höhe eines Rot-Schwarz-Baums mit N Elementen? Antwort: .............................................. .............................................. .............................................. .............................................. .............................................. D. Rösner AuD I 2009/10 . . . 18 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: Rot-Schwarz-Bäume Wenn in einen Rot-Schwarz-Baum ein Element eingefügt wird, dann: der neue Knoten wird rot gefärbt, denn dann bleibt die Anzahl schwarzer Knoten in dem betroffenen Pfad gleich Aber: der Elternknoten des neuen Knotens könnte rot sein und somit ein sog. Rot-Rot-Verstoss (engl. red-red violation) entstanden sein. Dafür gibt es vier mögliche Konfigurationen (welche?). Alle solchen Rot-Rot-Verstösse lassen sich lokal auf analoge Weise beheben: der jeweilige schwarz-rot-rot-Teilpfad wird transformiert in einen Teilbaum mit rotem Wurzelknoten und zwei schwarzen Kindern D. Rösner AuD I 2009/10 . . . 20 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: Rot-Schwarz-Bäume . . . Einfügen eines Elements fortgesetzt: da der nun rot gefärbte Wurzelknoten des Teilbaums selbst wieder Anlass zu einem Rot-Rot-Verstoss in Bezug auf seinen Elternknoten sein kann, muss ggf. rekursiv dieselbe Operation erneut bis zum Erreichen der (globalen) Wurzel wiederholt werden ein möglicher Rot-Rot-Verstoss in der (globalen) Wurzel schliesslich wird dadurch behoben, dass diese dann immer schwarz eingefärbt wird D. Rösner AuD I 2009/10 . . . 21 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: Rot-Schwarz-Bäume z y x a d c b Abbildung: Variante 1: Rot-Rot-Verstoss (vgl. [Oka98], Fig. 3.5) D. Rösner AuD I 2009/10 . . . 22 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: Rot-Schwarz-Bäume z x a d y b c Abbildung: Variante 2: Rot-Rot-Verstoss (vgl. [Oka98], Fig. 3.5) D. Rösner AuD I 2009/10 . . . 23 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Bäume: Rot-Schwarz-Bäume x y a b z c d Abbildung: Variante 3: Rot-Rot-Verstoss (vgl. [Oka98], Fig. 3.5) D. Rösner AuD I 2009/10 . . . 24 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: Rot-Schwarz-Bäume x z a y b d c Abbildung: Variante 4: Rot-Rot-Verstoss (vgl. [Oka98], Fig. 3.5) D. Rösner AuD I 2009/10 . . . 25 Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume Binäre Bäume: Rot-Schwarz-Bäume y x a z b c d Abbildung: Zielstruktur zur lokalen Behebung für alle vier Varianten eines Rot-Rot-Verstoss (vgl. [Oka98], Fig. 3.5) D. Rösner AuD I 2009/10 . . . 26 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: AVL-Bäume z y x a d c y b x z Abbildung: Variante 1: Rot-Rot-Verstoss a b c d Abbildung: Zielstruktur durch Linksrotation D. Rösner AuD I 2009/10 . . . 27 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: AVL-Bäume z x d y a b y c x z Abbildung: Variante 2: Rot-Rot-Verstoss a b c d Abbildung: Zielstruktur durch Links-Rechts-Rotation D. Rösner AuD I 2009/10 . . . 28 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: AVL-Bäume x a y b z c y d x z Abbildung: Variante 3: Rot-Rot-Verstoss a b c d Abbildung: Zielstruktur durch Rechts-Rotation D. Rösner AuD I 2009/10 . . . 29 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Binäre Bäume: AVL-Bäume x a z d y b y c x z Abbildung: Variante 4: Rot-Rot-Verstoss a b c d Abbildung: Zielstruktur durch Rechts-Links-Rotation D. Rösner AuD I 2009/10 . . . 30 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume: Implementierung die folgende Implementierung in Haskell kombiniert Code aus [Oka98] mit allgemeinem Code für binäre Suchbäume aus [RL99] Java-Implementationen für Rot-Schwarz-Bäume liefern z.B. [GT01] und [Wei98] D. Rösner AuD I 2009/10 . . . 32 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume: Implementierung Implementierung in Haskell Modul module RBTree (RBTree,emptyTree,inTree,addTree ,delTree ,buildTree, buildTree’ ,inorder ) where ... D. Rösner AuD I 2009/10 . . . 33 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume: Implementierung Datentypen data Color = R|B deriving Show data (Ord a) => RBTree a = E | T Color (RBTree a) a (RBTree a) deriving Show emptyTree = E D. Rösner AuD I 2009/10 . . . 34 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume: Implementierung Test auf Enthaltensein entspricht (abgesehen von Wildcard für Farbe) dem inTree bei binären Suchbäumen inTree v’ E = inTree v’ (T _ lf v rt) | v==v’ = | v’<v = | v’>v = False True inTree v’ lf inTree v’ rt D. Rösner AuD I 2009/10 . . . 35 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume: Implementierung Einfügen in Baum verwendet rekursive lokale Hilfsfunktion ins diese wiederum ruft Hilfsfunktion balance auf für den Umgang mit möglichen Rot-Rot-Verstößen addTree x s = T B a y b where ins E = T R E x E ins s@(T color a y b) = if x < y then balance color (ins a) y b else if x > y then balance color a y (ins b) else s T _ a y b = ins s D. Rösner AuD I 2009/10 . . . 36 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume: Implementierung Einfügen in Baum . . . : Bemerkungen ein neu kreierter Knoten wird immer rot gefärbt ... ins E = T R E x E der oberste Wurzelknoten wird – unabhängig vom Ergebnis von ins s – immer schwarz gefärbt addTree x s = T B a y b where ... T _ a y b = ins s D. Rösner AuD I 2009/10 . . . 37 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume: Implementierung Einfügen in Baum . . . : balance wbalance überprüft auf die vier möglichen Fälle für durch Einfügen eines einzelnen Elements verursachte Rot-Rot-Verstöße und behebt diese (auf jeweils identische Weise) in allen anderen Fällen wird der Konstruktor T aufgerufen D. Rösner AuD I 2009/10 . . . 38 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Rot-Schwarz-Bäume: Implementierung Einfügen in Baum . . . : balance balance B (T R (T R a x b) y c) z d = T R (T B a x b) y (T B c z d) balance B (T R a x (T R b y c)) z d = T R (T B a x b) y (T B c z d) balance B a x (T R (T R b y c) z d) = T R (T B a x b) y (T B c z d) balance B a x (T R b y (T R c z d)) = T R (T B a x b) y (T B c z d) balance color a x b = T color a x b D. Rösner AuD I 2009/10 . . . 39 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Literatur: I Michael T. Goodrich and Roberto Tamassia. Data Structures and Algorithms in Java. John Wiley & Sons, New York, 2001. ISBN 0-471-38367-8; 2nd edition. Chris Okasaki. Purely Functional Data Structures. Cambridge University Press, Cambridge, UK, 1998. ISBN 0 521 63124 6. Fethi Rabhi and Guy Lapalme. Algorithms – A Functional Programming Approach. Pearson Education Ltd., Essex, 1999. 2nd edition, ISBN 0-201-59604-0. D. Rösner AuD I 2009/10 . . . 40 Rot-Schwarz-Bäume Einleitung Eigenschaften Einfügen Implementation Literatur: II Mark Allen Weiss. Data Structures and Problem Solving using Java. Addison Wesley Longman, Inc., Reading, Mass. USA, 1998. ISBN 0-201-54991-3;reprinted with corrections, 1999. D. Rösner AuD I 2009/10 . . . 41