Datenstrukturen und Algorithmen SS07 Datum: 25.4.2007 Michael Belfrage [email protected] belfrage.net/eth Programm von Heute • Nachbesprechung Serie 4 • Challenge der Woche • Traversierung von Bäumen – Pre-, In-, Postorder – Breadth-, Depth-First • AVL-Bäume • Aufgabe 5.4 Aufgabe 4.3 • Double Hashing: – h(k) = k mod 11 – h‘(k) = 1 + k mod 9 – falls nun k = 11, dann gilt: • h(11) = 11 mod 11 = 0 • h‘(11) = 1 + 11 mod 9 = 3 – Und folglich: • h(k) – h‘(k) = 0 – 3 = -3 =11 8 als erste Sondierung. The Challenge • Gegeben ist: – ein Array A bestehend aus n Zahlen • Bestimme das zusammenhängende Teilarray mit der grössten Summe. • Und gebe diese Summe aus. • Natürlich möglichst effizient :) • Beispiel: – Input: • A := [29,-43,57,24,-55,56,95,-95,-25,86] – Output: • 177 = (57+24+(-55)+56+95) Traversierung von Bäumen - Preorder 1. 2. 3. Wurzel Linker Teilbaum Rechter Teilbaum - Inorder 1. 2. 3. Linker Teilbaum Wurzel Rechter Teilbaum - Postorder 1. 2. 3. Linker Teilbaum Rechter Teilbaum Wurzel Traversierung von Bäumen • Preorder Beispiel: Lösung: 17,8,2,14,9,16,26,19,22,34 17 8 26 2 14 9 19 16 34 22 Traversierung von Bäumen • Inorder Beispiel: Lösung: 2,8,9,14,16,17,19,22,26,34 17 8 26 2 14 9 19 16 34 22 Traversierung von Bäumen • Postorder Beispiel: Lösung: 2,9,16,14,8,22,19,34,26,17 17 8 26 2 14 9 19 16 34 22 Traversierung von Bäumen • Breadth-First – Zuerst in die Breite – Siehe auch Breitensuche • Depth-First – Zuerst in die Tiefe – Siehe auch Tiefensuche Traversierung von Bäumen • Breadth-First Beispiel: Lösung: 17,8,26,2,14,19,34,9,16,22 17 8 26 2 14 9 19 16 34 22 Traversierung von Bäumen • Depth-First Beispiel: Lösung: 17,8,2,14,9,16,26,19,22,34 17 8 26 2 14 9 19 16 34 22 AV L – Baum • Entwickelt um 1962 von G.M. Adelson-Velsky (Г.М. Адельсо н-Ве льский) und E.M. Landis (Е.М. Ландис) • Balancierter binärer Suchbaum • Einfügen, Löschen und Suchen eines Knoten in O(log n) AV L – Baum • Balancierter Binärbaum: – Sei Tb = Teilbaum – Für jeden Knoten muss gelten: • Höhe(rechter Tb) – Höhe(linker Tb) ∈ {−1, 0, +1} -1 h 0 h-1 h +1 h h-1 h AV L – Baum • Balancierter Binärbaum: 3-3=0 17 2 – 1 = +1 1 – 2 = -1 8 0 1 – 0 = +1 1–1=0 2 14 9 0–0=0 19 0 0 34 0 16 26 22 AV L – Baum • KEIN balancierter Binärbaum: 3-3=0 17 2 – 1 = +1 0 – 2 = -2 8 0 1 – 0 = +1 1–1=0 2 14 19 0 0 9 0 16 22 26 AV L – Baum (Suchen) • Die Suche ist analog wie beim normalen binären Suchbaum: Suche nach x im AV L-Baum T : – Abbruchbedingung: • Falls T keine Wurzel hat (d.h. T ist ein Blatt), dann ist x nicht in T drin – Sonst: [Wurzel von T] = x ? • Falls ja, sind wir fertig (x wurde gefunden) • Falls nein, dann – Wenn [Wurzel von T] < x , dann suche rekursiv im linken Teilbaum weiter – Sonst ist [Wurzel von T] > x , suche rekursiv im rechten Teilbaum weiter AV L – Baum (Suchen) • Beispiel: Suche nach x=22 17 8 26 2 14 9 19 16 34 22 AV L – Baum (Suchen) • Beispiel: Suche nach x=4 17 8 26 2 14 9 19 16 34 22 AV L – Baum (Einfügen) • Das Einfügen ist beim AV L – Baum komplexer als beim binären Suchbaum • Zur Erinnerung: – Einfügen beim binären Suchbaum: • Suche nach dem einzufügenden Knoten • Falls nicht gefunden, dann füge dort (bei dem Blatt) ein wo Suche endete AV L – Baum (Einfügen) • Einfügen von x=43 18 8 26 2 14 9 19 16 34 22 AV L – Baum (Einfügen) • Einfügen von x=43 18 8 26 2 14 9 19 16 34 22 43 AV L – Baum (Einfügen) • Einfügen von x=17 18 8 26 2 14 9 19 16 34 22 43 AV L – Baum (Einfügen) • Einfügen von x=17 18 8 26 2 14 9 19 16 34 22 17 43 AV L – Baum (Einfügen) • Baum ist unbalanciert ! 18 8 26 2 14 9 19 16 34 22 17 43 AV L – Baum (Einfügen) • Unternimmt man nichts, sieht er möglicherweise bald so aus: 18 8 26 2 14 9 19 16 34 22 17 43 47 58 61 AV L – Baum (Einfügen) • Was tun also, damit er wieder balanciert ist? • Ansatz vom AV L – Baum : – Solange von unten nach oben rotieren, bis wieder balanciert: • Mittels Einfach- und Doppelrotation. AV L – Baum (Einfügen) • Einfache Rotation: 18 8 26 2 14 9 19 16 34 22 17 43 AV L – Baum (Einfügen) • Einfache Rotation: 18 14 8 2 26 16 9 19 17 34 22 43 AV L – Baum (Einfügen) • Doppel-Rotation: 18 8 26 2 1 14 6 11 9 19 16 34 AV L – Baum (Einfügen) • Doppel-Rotation: 14 8 18 2 1 11 6 9 16 26 19 34 AV L – Baum (Löschen) • Suchen des Knotens • Falls gefunden, dann löschen und mit dem symmetrischen Vor- oder Nachfolger ersetzen. • Von der Position aus wo dieser war wieder rebalancieren mittels Einfach- und Doppelrotationen. AV L – Baum (Löschen) • Beispiel: x=14 löschen 14 8 18 2 1 11 6 9 16 26 19 34 AV L – Baum (Löschen) • Mit symm. Nachfolger ersetzen 16 8 18 2 1 11 6 9 26 19 34 AV L – Baum (Löschen) • Einfache Rotation durchführen 16 8 26 2 1 11 6 9 18 34 19 AV L – Baum • Übung: Einfügen von Schlüssel 6. 8 3 10 2 1 5 4 9 7 11 AV L – Baum • Lösung: 5 3 2 1 8 4 7 6 10 9 11 AV L – Baum • Übung: Löschen von Schlüssel 9. 11 7 14 3 1 9 8 4 6 12 17 15 AV L – Baum • Lösung: 11 4 14 3 1 7 6 12 8 17 15 Aufgabe 5.4 (Yahoogle) • Verzeichnis, welches für jeden Mitarbeiter den ausbezahlten Bonus sowie das Alter speichert • Folgende Operationen möglichst effizient im worst-case implementieren: – Einfügen eines Mitarbeiters mit Alter a und Bonus b – Löschen eines Mitarbeiters mit Alter a – Löschen eines Mitarbeiters mit Bonus b – Suchen nach einem Mitarbeiter mit Alter a – Suchen nach einem Mitarbeiter mit Bonus b • Nehme an jedes Alter und jeder Bonus identifiziert einen Mitarbeiter eindeutig. Ende der Stunde. Questions?