Datenstrukturen und Algorithmen VO INF.02031UF Bäume [email protected] 1 Inhalt der Vorlesung 1. Motivation, Einführung, Grundlagen 2. Algorithmische Grundprinzipien 3. Sortierverfahren 4. Halden 5. Gestreute Speicherung 6. Suchen in linearen Feldern 7. Bäume Bäume [email protected] 2 In der letzten Vorlesung 1. Statische, kleine Menge: Feld als Datenstruktur • Ohne Vorsortierung, z.B. A=[34, 4, 99, 13, 42] – Sequentielle Suche – Selbstanordnende Felder • Mit Vorsortierung, z.B. A=[4, 13, 34, 42, 99] – – – – Binärsuche Interpolationssuche Quadratische Binärsuche Fastsearch Suchen in linearen Feldern [email protected] 3 In dieser Vorlesung 2. Dynamisch, große Menge , effiziente Zugriffe notwendig • z.B. große Produktdatenbanken, Suchmaschinen, … • Lösung: Baum als dynamische Datenstruktur (einfügen, löschen), organisiert als binärer Suchbaum. Suchen in O(h), wobei h die Baumhöhe ist. • Effizientes Suchen: Binärer Suchbaum, der eine möglichst geringe Höhe h garantiert. Sollte möglichst balanziert sein, z.B. 2-4 Baum, Rot-Schwarz Baum usw. Suchen in linearen Feldern [email protected] 4 Bäume • Definition: Ein Baum ist eine Menge, die durch eine sog. Nachfolgerrelation strukturiert ist. Elemente: Knoten • In einem Baum gilt: 1 – Knoten w ohne Parent(w) (w=Wurzel) 1 – Knoten k≠w Knotenfolge k0, k1, …, kt mit k0=k, kt=w und ki=Parent(ki-1) für i=1, 2, …, t. (Ast zwischen k und w, Länge t, t … Tiefe des Knotens k) Parent(x) Kind(k) Bäume [email protected] 5 Bäume • Ordnung eines Knotens: Anzahl seiner Kinder • Ordnung eines Baumes: maximale Ordnung aller Knoten • Höhe eines Baumes: Länge des längsten Astes. • Die Knoten eines Baumes sind entweder – Blätter (Knoten ohne Kinder, Ordnung 0) oder – Innere Knoten (Ordnung >0) • Jeder Knoten ist Wurzel eines Teilbaumes • Voller Baum der Ordnung k: Jeder Knoten hat genau k Kinder oder ist ein Blatt • Vollständiger Baum: Voller Baum, bei dem jedes Blatt gleiche Tiefe hat Bäume [email protected] Parent(k) Kind(k) 6 Bäume • Baumartige Strukturen treten häufig auf: – Hierarchische Strukturen: – Inklusionsstrukturen: Bäume [email protected] 7 Bäume Bäume [email protected] 8 Bäume • Anwendungen in der Informatik: – – – – – – Rekursionsbäume Entscheidungsbäume Suchbäume Haldenbäume Codebäume u.v.a. Hierarchisches Clustering von Daten / Beispiel (Syntaxbäume): Arithmetische Ausdrücke Blätter (= Knoten ohne Kinder) enthalten Zahlen, innere Knoten speichern Operatoren (+, -, *, /). * + 2 Bäume [email protected] + 3 4 3 5 9 Binärbäume • Jeder Knoten hat maximal zwei Nachfolger • Grundlegende Operationen: – – – – – Wurzel(B): Links(k): Rechts(k): Parent(k): Wert(k): Liefert den Wurzelknoten des Baumes B Liefert das linke Kind von Knoten k Liefert das rechte Kind von Knoten k Liefert Parent-knoten von Knoten k Liefert den in Knoten k gespeicherten Wert Parent Existiert ein Kind- oder ein Parent-knoten nicht, wird nil zurückgeliefert Bäume [email protected] 10 Binärbäume • Auslesereihenfolge der Knoten: – Symmetrische Reihenfolge (SR, inorder): linker Teilbaum in SR, Wurzel, rechter Teilbaum in SR Aufruf: SR(Wurzel(B)) T(n) = Θ(n) n…Anzahl der Knoten Beispiel: / * + 2 Bäume + 3 4 3 Infix-Notation 5 [email protected] 11 Binärbäume • Reihenfolge der Knoten: – Hauptreihenfolge (HR, preorder): Wurzel, linker Teilbaum in HR, rechter Teilbaum in HR – Nebenreihenfolge (NR, postorder): linker Teilbaum in NR, rechter Teilbaum in NR, Wurzel / * + (HR) + 3 4 3 (NR) 2 Bäume 5 Postfix-Notation [email protected] 12 Sortierte Binärbäume • Binäre Suchbäume sind in symmetrischer Reihenfolge sortiert Knoten im linken Teilbaum ≤ Wurzel ≤ Knoten im rechten Teilbaum Bäume [email protected] 13 Sortierte Binärbäume • Suchen (binäre Suche): b … gesuchter Wert k … Wurzel des Teilbaums Aufruf: SUCHE(b, Wurzel(B)) Suchzeit: O(h) h … Höhe des Baumes (= Länge des längsten Astes) Bäume [email protected] 14 Sortierte Binärbäume • Minimum und Maximum: BAUM_MINIMUM(k) 1: WHILE links(k)≠nil 2: k ← links(k) 3: RETURN wert(k) BAUM_MAXIMUM(k) 1: WHILE rechts(k)≠nil 2: k ← rechts(k) 3: RETURN wert(k) Bäume [email protected] k … Wurzel des Teilbaums Aufruf: BAUM_MINIMUM(Wurzel(B)) BAUM_MAXIMUM(Wurzel(B)) Laufzeit: jeweils O(h) 15 Sortierte Binärbäume • Einfügen: Wert suchen, Dann entsprechend als Blatt anhängen. Bäume [email protected] 16 Sortierte Binärbäume Laufzeit: O(h) • Einfügen: EINFÜGEN(B,k) 1: y ← nil; x ← wurzel(B) 2: WHILE x≠nil 3: y←x 4: IF wert(k) < wert(x) THEN 5: x ← links(x) 6: ELSE 7: x ← rechts(x) 8: parent(k) ← y 9: IF y=nil THEN 10: wurzel(B) ← k 11: ELSE IF wert(k) < wert(y) THEN 12: links(y) ← k 13: ELSE rechts(y) ← k Bäume Fügt den Knoten k in den Binärbaum B ein Simuliere eine Suche nach k, bis zu einer freien Stelle (x=nil). y…zukünftiger Parent Dort fügen wir das Element als Kind von y ein. Baum B war leer [email protected] 17 Sortierte Binärbäume • Aufbau eines sortierten Binärbaumes: – durch wiederholtes Einfügen (⇒ natürliche Bäume) – Binärbaum hängt von der Reihenfolge der Elemente ab T(n) = O(n*h) = Θ(n2), wenn h = Θ(n) Einige Reihenfolgen liefern entartete Bäume (= Listen) Fügt man randomisiert ein, ist 𝐸 ℎ = Θ log 𝑛 Bäume [email protected] 18 Sortierte Binärbäume • Entfernen: Suchen ⇒ Knoten k a) k ist Blatt: abhängen b) k hat nur ein Kind: Teilbaum von diesem Kind an Parent(k) anhängen c) Bäume k hat 2 Kinder: Finde k': nächster Knoten in der sortierten Knotenfolge (gehe einmal rechts, dann immer links) → k' hat kein linkes Kind! Setze WERT(k) = WERT(k' ) Entferne k'‚ (Fall a oder b) Laufzeit: O(h) [email protected] 19 Sortierte Binärbäume • Vorgänger und Nachfolger: Nachfolger von k: Nächster Knoten in der (nach Werten) sortierten Reihenfolge (= nächstgrößerer Wert im Baum oder gleicher Wert) NACHFOLGER(k) 1: IF rechts(k) ≠ nil 2: return BAUM_MINIMUM(rechts(k)) 3: y ← parent(k) 4: WHILE y ≠ nil AND k = rechts(y) 5: k←y 6: y ← parent(y) 7: return(y) Wenn ein rechtes Kind existiert, suche das Minimum in diesem Teilbaum, … … sonst suche den niedrigsten Knoten, bei dem sich k im linken Teilbaum befindet Laufzeit: O(h) Bäume [email protected] 20 Sortierte Binärbäume • Vorgänger und Nachfolger: Vorgänger von k: Vorgängerknoten in der (nach Werten) sortierten Reihenfolge VORGÄNGER(k) 1: IF links(k) ≠ nil 2: return BAUM_MAXIMUM(links(k)) 3: y ← parent(k) 4: WHILE y ≠ nil AND k = links(y) 5: k←y 6: y ← parent(y) 7: return(y) Wenn ein linkes Kind existiert, suche das Maximum in diesem Teilbaum, … … sonst suche den niedrigsten Knoten, bei dem sich k unter dem rechten Kind befindet Laufzeit: O(h) Bäume [email protected] 21 Sortierte Binärbäume • Zusammenfassung: – – – – – – – Minimum Maximum Vorgänger Nachfolger Einfügen Löschen Suchen Alle Operationen in O(h) Zeit h … Baumhöhe • Vorteil: dynamische Lösung des Wörterbuchproblems • Nachteil: Zeiten bis zu Θ(n) (bei entarteten Bäumen). Bäume [email protected] 22