Übung Algorithmen I 3.6.15 Christoph Striecks [email protected] (Mit Folien von Julian Arz, Timo Bingmann und Sebastian Schlag.) Roadmap I Hinweise zur Übungsklausur I (Weitere) Traversierungen von Binärbäumen I Die Anzahl binärer Suchbäume I Rot-Schwarz-Bäume Organisation I Übungsklausur am Montag, dem 8.6.15, um 15.45, im Audimax I Freiwillig, keine Prüfungsleistung, aber zur Selbstkontrolle I Deckt den ersten Teil der Vorlesung und Übung (bis 27.5.15) ab I (Nicht vergessen: Neues Übungsblatt ab heute) (Weitere) Traversierungen von Binärbäumen Traversierungen von Binärbäumen Beispiel: n = 15 Knoten b = 8 Blätter c = 7 innere Knoten h = 3 Höhe Traversierungen von Binärbäumen 1 2 4 8 3 5 9 10 6 11 12 Beispiel: n = 15 Knoten b = 8 Blätter c = 7 innere Knoten h = 3 Höhe 7 13 (Level-order-Traversierung.) 14 15 Traversierungen von Binärbäumen 1 2 3 4 9 6 5 7 10 8 11 Beispiel: n = 15 Knoten b = 8 Blätter c = 7 innere Knoten h = 3 Höhe 13 12 (Pre-order-Traversierung.) 14 15 Traversierungen von Binärbäumen 8 4 2 1 12 6 3 5 10 7 9 (In-order-Traversierung.) Beispiel: n = 15 Knoten b = 8 Blätter c = 7 innere Knoten h = 3 Höhe 14 11 13 15 Traversierungen von Binärbäumen 15 7 3 1 14 6 2 4 10 5 8 Beispiel: n = 15 Knoten b = 8 Blätter c = 7 innere Knoten h = 3 Höhe 13 9 (Post-order-Traversierung.) 11 12 Die Anzahl binärer Suchbäume Binäre Suchbäume Wiederholung I In der Vorlesung: Daten nur an Blättern I Hier in der Übung: Daten in allen Knoten 8 4 18 3 1 7 2 6 12 8 11 25 15 24 Invariante: Für alle Knoten v : ∀w ∈ left(v ) : w ≤ v und ∀w ∈ right(v ) : w > v 49 Alle binäre Suchbäume mit n = 1, 2, 3: n = 1: n = 2: 1 1 2 2 1 n = 3: 1 1 2 2 3 3 2 1 3 3 3 1 2 2 1 Alle binäre Suchbäume mit n = 4: 1 1 1 2 2 2 3 4 4 3 4 1 4 4 2 1 2 4 2 1 4 3 2 4 4 3 3 3 1 4 1 2 3 3 2 4 1 2 3 3 4 4 3 2 3 1 4 3 2 1 1 3 1 2 2 1 Die Anzahl binärer Suchbäume Cn x <x >x Bekannte Startwerte: C0 = 0, C1 = 1, C2 = 2, C3 = 5, C4 = 14. Durch Partitionieren der sortieren Folge: Cn = C0 Cn−1 + C1 Cn−2 + · · · + Cn−2 C1 + Cn−1 C0 , Wende erzeugende Funktionen an: C (z) = ∞ X n=0 n Cz z = C (z) · zC (z) + 1 . n > 0. Cn heißen die Catalan-Zahlen. =⇒ 1 2n Cn = . n+1 n Balancierte binäre Suchbäume: Rot-Schwarz-Bäume Binäre Suchbäume Wiederholung 8 4 18 3 1 7 2 6 12 8 11 25 15 24 Invariante: Für alle Knoten v : ∀w ∈ left(v ) : w ≤ v und ∀w ∈ right(v ) : w > v 49 I Problem von binären Suchbäumen: können unbalanciert sein I Lösung der Vorlesung: (a, b)-Bäume I Weitere Lösung hier in der Übung: Rot-Schwarz-Bäume Warum balancierte Bäume? 1 2 3 4 5 Warum balancierte Bäume? 1 2 3 I Höhe: h ∈ O(n) I Suchen: O(n) im Worst Case I Löschen: O(n) im Worst Case I Einfügen: O(n) im Worst Case I Geht das besser? 4 Ja, Rot-Schwarz-Bäume garantieren Höhe von O(log n). 5 Rot-Schwarz-Bäume Rot-Schwarz-Bäume sind binäre Suchbäume mit folgenden Eigenschaften: I Jeder Knoten ist entweder rot oder schwarz. (1 Bit mehr an Information pro Knoten.) I Die Wurzel ist schwarz. I Jedes Blatt ist schwarz und enthält keine Werte. (Nur innere Knoten enthalten Werte.) I Ist ein Knoten rot, so sind beide Kinder schwarz. I Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Anzahl schwarzer Knoten. Rot-Schwarz-Bäume Rot-Schwarz-Bäume sind binäre Suchbäume mit folgenden Eigenschaften: I I I I I Jeder Knoten ist entweder rot oder schwarz. (1 Bit mehr an Information pro Knoten.) Die Wurzel ist schwarz. Jedes Blatt ist schwarz und enthält “keine Werte”. (Nur innere Knoten enthalten Werte.) Ist ein Knoten rot, so sind beide Kinder schwarz. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Anzahl schwarzer Knoten. 33 15 47 10 5 20 18 38 36 51 39 49 Höhe von Rot-Schwarz-Bäumen Satz: Ein Rot-Schwarz-Baum mit n inneren Knoten hat die Höhe h ≤ 2 log2 (n + 1). Beweis. I Betrachte Teilbaum tx an einem Knoten x I Sei sh(x) die Anzahl der schwarzen Knoten auf dem Pfad von x zu einem Blatt ohne x selbst (Schwarzhöhe) I Lemma: tx hat mindestens 2sh(x) − 1 innere Knoten. I Beweis. Induktion über Höhe h von tx I IA: h = 0 =⇒ sh(x) = 0 und 20 − 1 = 0 I IS: Aussage gilt für Kinder x1 , x2 von x mit h(x) > 0 I Wir bemerken: sh(xi ) ≥ sh(x) − 1 =⇒ txi hat mind. 2sh(x)−1 − 1 innere Knoten I Also hat tx mindestens 2(2sh(x)−1 − 1) + 1 = 2sh(x) − 1 innere Knoten √ Höhe von Rot-Schwarz-Bäumen Satz: Ein Rot-Schwarz-Baum mit n inneren Knoten hat die Höhe h ≤ 2 log2 (n + 1). I Weiter im Beweis . . . I Zur Erinnerung: 4. Ist ein Knoten rot, so sind beide Kinder schwarz. Lemma. tx hat mindestens 2sh(x) − 1 innere Knoten. I Nach Eigenschaft 4 eines Rot-Schwarz-Baumes sind auf allen Pfaden unterhalb der Wurzel mindestens die Hälfte der Knoten schwarz I Einsetzen in vorheriges Ergebnis ergibt n ≥ 2h/2 − 1 und damit h ≤ 2 log2 (n + 1) Höhe von Rot-Schwarz-Bäumen Anders ausgedrückt: Die Höhe eines Rot-Schwarz-Baums ist logarithmisch in der Anzahl der inneren Knoten, also h ≤ 2 log2 (n + 1). I Suchen offensichtlich in O(log n) möglich. I Einfügen, Löschen auch in O(log n), wenn Aufwand nur von der Höhe des Baums abhängt. Einfügen in Rot-Schwarz-Bäumen Zur Erinnerung: 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. Einfügen: I Einfügen wie in “normalen” binären Suchbäumen I Einfügen kann Rot-Schwarz-Eigenschaften verletzen. I Vorgehen: Roten Knoten in binären Suchbaum einfügen und danach Eigenschaften wieder herstellen I Herstellen der Eigenschaften durch zwei grundlegende Operationen: 1. Umfärbung von Knoten 2. Rotation von Teilbäumen Was ist eine Rotation? I Lokale Operation, die die binäre Suchbaumeigenschaft erhält I “Umhängen” einer konstanten Zahl an Pointern pro Teilbaum Linksrotation a b Rechtsrotation a b ≤a ∈ (a, b] >b >b ≤a ∈ (a, b] Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 3. Die Wurzel ist schwarz. 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. I Vorgehen: Roten Knoten in binären Suchbaum einfügen und danach Eigenschaften wieder herstellen I Kein Vorgänger −→ Neuer Knoten ist Wurzel N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 3. Die Wurzel ist schwarz. 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. I Vorgehen: Roten Knoten in binären Suchbaum einfügen und danach Eigenschaften wieder herstellen I Kein Vorgänger −→ Neuer Knoten ist Wurzel −→ Umfärben N Umfärben N √ Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 3. Ist ein Knoten rot, so sind beide Kinder schwarz. 4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. I Vorgehen: Roten Knoten in binären Suchbaum einfügen und danach Eigenschaften wieder herstellen I Schwarzer Vorgänger oder N N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 3. Ist ein Knoten rot, so sind beide Kinder schwarz. 4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. Vorgehen: Roten Knoten in binären Suchbaum einfügen und danach Eigenschaften wieder herstellen √ I Schwarzer Vorgänger −→ Nichts zu tun I oder N N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 3. Ist ein Knoten rot, so sind beide Kinder schwarz. 4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. I Vorgehen: Roten Knoten in binären Suchbaum einfügen und danach Eigenschaften wieder herstellen I Roter Vorgänger oder N oder N oder N N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 3. Ist ein Knoten rot, so sind beide Kinder schwarz. 4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. I Vorgehen: Roten Knoten in binären Suchbaum einfügen und danach Eigenschaften wieder herstellen I Roter Vorgänger −→ 4 mögliche Strukturen, aber: durch Spiegelung und max. eine Rotation identisch N N N N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 3. Ist ein Knoten rot, so sind beide Kinder schwarz. 4. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. I Vorgehen: Roten Knoten in binären Suchbaum einfügen und danach Eigenschaften wieder herstellen I Roter Vorgänger −→ 4 mögliche Strukturen, aber: durch Spiegelung und max. eine Rotation identisch N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. Umfärben N N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. Umfärben Rotieren N N N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. Umfärben N N Einfügen in Rot-Schwarz-Bäume Zur Erinnerung: 4. Ist ein Knoten rot, so sind beide Kinder schwarz. 5. Für alle Knoten v : Alle Pfade von v zu einem Blatt enthalten die gleiche Zahl schwarzer Knoten. Umfärben N N Rekursion N Rot-Schwarz-Bäume Aufwandsabschätzung Speicher: I 1 Bit pro Knoten für die Farbe I Parent-Pointer ist nötig Zeit: I Konstanter Aufwand pro Knoten (Färben und Rotieren) I Maximal O(log n) Rekursionstiefe Ziel erreicht: O(n) Platz und alle Operationen in O(log n). Datenstrukturen in der Wirklichkeit Datenstrukturen in der Wirklichkeit Java Collections C++ STL java.util.LinkedList<T> java.util.ArrayList<T> java.util.ArrayDeque<T> java.util.PriorityQueue<T,C> java.util.TreeMap<K,V> java.util.TreeSet<K> java.util.HashTable<K,V> java.util.HashMap<K,V> java.util.HashSet<K> std::list<T> std::vector<T> std::deque<T> std::priority_queue<T,C> std::map<K,V> std::set<K> std::unordered_map<K,V> std::unordered_set<K> Notizen zu (a, b)-Bäumen B-Bäume sind fast ( m2 , m)-Bäume mit m = B ein Festplatten-Block. Microsekunden pro Insert Insert-Geschwindigkeit (Integer, C++) Red-Black Tree verkettete Hashtabelle (2, 4)-Baum (16, 32)-Baum (32, 64)-Baum (64, 128)-Baum 1.5 1 0.5 0 26 28 210 212 214 216 218 220 Anzahl von Elementen 222 224 226 Locate-Geschwindigkeit (Integer, C++) Microsekunden pro Locate 1.5 Red-Black Tree verkettete Hashtabelle (2, 4)-Baum (16, 32)-Baum (32, 64)-Baum (64, 128)-Baum 1 0.5 0 26 28 210 212 214 216 218 220 Anzahl von Elementen 222 224 226