Rev. 1, 05.05.2016 TU Ilmenau, Fakultät für Informatik und Automatisierung FG Komplexitätstheorie und Effiziente Algorithmen Univ.-Prof. Dr. M. Dietzfelbinger, Dr. C. Mattern, M.Sc. Stefan Walzer http://www.tu-ilmenau.de/iti/lehre/lehre-ss-2016/aud/ Algorithmen und Datenstrukturen SS 2016 – Übung 5 Besprechung: 19. Kalenderwoche (9. Mai - 13. Mai 2016) Aufgabe 1 (Prä-Order / Postorder-Konvertierung)1 Gibt man die Schlüssel aus einem binären Suchbaum T = (Tl , x, Tr ) in Präorder- bzw. Postorder-Reihenfolge aus, entstehen folgende Ausgaben: Präorder: Postorder: x Schlüssel aus Tl in Präorder Schlüssel aus Tl in Postorder Schlüssel aus Tr in Präorder Schlüssel aus Tr in Postorder x Letzte Woche haben Sie einen rekursiven Algorithmus implementiert, der eine Präorder-Reihenfolge in eine Postorder-Reihenfolge umwandelt. Diese Woche machen wir das nochmal, aber schlauer. (a) Implementieren Sie eine rekursive Prozedur pre2post-rec mit folgenden Eigenschaften: Eingabe: Array A[1..n] von Schlüsseln, Array B von Schlüsseln, Index i, Schlüssel s. Ausgabe: m := min({k | i ≤ k ≤ n, A[k] ≥ s} ∪ {n + 1}) Wirkung: Das Teilarray A[i, ..., m − 1] wird als Präorder-Reihenfolge eines binären Suchbaums interpretriert, und in Postorder-Reihenfolge konvertiert hinten an das Array B angefügt. Die von außen Nutzbare Methode pre2post(A) soll dann einfach wie folgt implementiert sein: pre2post(A[1..n]) 1 2 3 B ← empty() pre2post-rec(A, B, 1, ∞) return B Die Ausführung des Rumpfes von pre2post (ohne rekursive Aufrufe) soll konstante Kosten haben. (b) Was ist die Laufzeit von Ihrem Algorithmus? Begründen Sie ihre Antwort. Aufgabe 2 (Rot-Schwarz-Bäume) Ein (linksgeneigter) Rot-Schwarz-Baum ist ein binärer Suchbaum, in dem jede Kante mit der Farbe rot oder schwarz eingefärbt ist, wobei folgende Regeln eingehalten werden: (i) Kanten zu (leeren!) Blättern sind schwarz. 1 Hurrah! Jetzt in Linearzeit! 2 Algorithmen und Datenstrukturen SS 2016 – Übung 5 (ii) Auf keinem Weg im Baum folgen zwei rote Kanten aufeinander. (iii) Wenn ein Knoten nur eine rote Ausgangskante hat, so führt diese zum linken Kind. (iv) Auf jedem Weg von der Wurzel zu einem Blatt liegen gleich viele schwarze Kanten. Die Schwarz-Tiefe b(v) eines Knotens v in einem Rot-Schwarz-Baum T ist die Anzahl der schwarzen Kanten auf dem Weg von v zu einem Blatt; die Schwarz-Tiefe b(T ) des Baumes T ist die Schwarz-Tiefe der Wurzel von T . Zeigen Sie: (a) Ein Rot-Schwarz-Baum T mit Schwarz-Tiefe b(T ) hat mindestens 2b(T ) − 1 innere Knoten. (b) Die Tiefe d(T ) eines Rot-Schwarz-Baums T mit n inneren Knoten ist O(log n). Aufgabe 3 (Tiefe von 2-3-Bäumen) Zeigen Sie, dass folgende Aussagen für einen 2-3-Baum T der Tiefe h (Level 0, 1, . . . , h) gelten: (a) T besitzt mindestens 2h+1 − 1 Knoten und mindestens 2h+1 − 1 Schlüssel. (b) T besitzt höchstens 3h+1 −1 2 Knoten und höchstens 3h+1 − 1 Schlüssel. (c) Welche Aussagen über die Tiefe h im Zusammenhang mit der Knotenanzahl n können Sie ableiten? Aufgabe 4 (AVL-Bäume mit Größenzähler) Ein AVL-Baum habe in jedem Knoten v einen zusätzlichen Zähler size, der die Anzahl der Knoten in dem bei v gewurzelten Unterbaum angibt. • Implementieren sie die Operation AVL countLess(T, x), die für einen gegebenen Schlüssel x die Anzahl der im Baum T enthaltenen Schlüssel berechnet, die kleiner als x sind. Welche Laufzeit hat ihre Implementierung? • Erklären Sie, wie sie die Operationen insert und delete Anpassen müssen, wenn die Zähler aktuell gehalten werden soll. (Gehen Sie zunächst davon aus, dass keine Rotationen nötig sind um die Balance aufrecht zu erhalten.) • Implementieren Sie nun die Operation rotateR und rotateLR neu, sodass alle Zähler aktuell gehalten werden.