Ankündigung Mentoring Kap. 4.2: Binäre Suchbäume Professor Dr. Petra Mutzel / Carsten Gutwenger Lehrstuhl für Algorithm Engineering, LS11 Fakultät für Informatik, TU Dortmund 11. VO DAP2 SS 2008 Petra Mutzel 20. Mai 2008 DAP2 SS08 1 Motivation Mi, 21. Mai, ab 12:30 Uhr, in E23 (OH14) • Vorstellung Nebenfach Rehabilitationstechnologie (Schaten) • Wirtschaftswissenschaften als Anwendungs- und Nebenfach (Donato) • Dann ab 14:30 Uhr: Studentische Studienberatung (3x30 Minuten pro Studierende/r, jedes NB ein Raum, also 3 NF/Stud. machbar) • bei Überschneidung mit DAP2-Übungsgruppe: nach vorheriger Email an ÜG-Leiter/in befreit Binäre Suchbäume „Warum soll ich heute hier bleiben?“ • Datenstruktur zur Unterstützung der Operationen des ADT Dictionary: Binäre Suchbäume begegnen Ihnen ständig! „Warum soll mich das interessieren?“ Beliebte Klausuraufgaben! Petra Mutzel DAP2 SS08 3 • INSERT(K k,V v) – Falls k nicht schon in D ist, dann wird ein neuer Schlüssel k mit Wert v in D eingefügt, andernfalls wird der Wert des Schlüssels k auf v geändert. 4 • MINIMUM (MAXIMUM) – Sucht den Schlüssel mit kleinstem (größtem) Wert. • DELETE(K k) – Entfernt Schlüssel k mit Wert aus D (falls k in D) • PREDECESSOR (SUCCESSOR) – Ausgehend von einem gegebenen Element suchen wir das Element mit dem nächstkleineren (nächstgrößeren) Schlüssel. • SEARCH(K k): V – Gibt den bei Schlüssel k gespeicherten Wert zurück (falls k in D) DAP2 SS08 DAP2 SS08 Zusätzliche Operationen der Binären Suchbäume Operationen des ADT Dictionary Petra Mutzel Petra Mutzel 5 Petra Mutzel DAP2 SS08 6 1 Worst CaseDefinitionen Analyse von BinarySearch Überblick • Gewurzelter Baum (rekursiv): – entweder leer oder • Bezeichnungen – Knoten (Wurzel) mit Verweisen auf mehrere gewurzelte Bäume (Teilbäume) • Traversierungen für binäre Bäume • Implementierungen • Analyse Petra Mutzel DAP2 SS08 • Kind von Knoten v: Wurzelknoten eines nichtleeren Teilbaums von v • Blatt: Knoten ohne Kinder 7 Petra Mutzel Worst Case Analyse von BinarySearch Bezeichnungen: Gewurzelte Bäume linker Unterbaum von 5 • 3 7 4 2 Wurzel Kanten 5 innere Knoten Knoten 8 linker Unterbaum von 5 Blätter: Knoten ohne Kinder Tiefe d(v): # der Elter-Knoten bis Wurzel (inkl.) • 3 ist Wurzel des linken Unterbaums von 5 • 3 ist Elter von 2, 3 ist Elter von 4 • 2 ist linkes Kind von 3, 4 ist rechtes Kind von 3 • Wurzel linker Unterbaum von 5 5 3 2 4 h(T3)=1 d(3)=1 h(T8)=0 d(8)=2 7 d(Wurzel)=0 h(TWurzel)=2 8 Blätter: Knoten ohne Kinder Nachfolger(v): Menge aller Knoten im Unterbaum mit Wurzel v Höhe h(Tr) eines (Teil-)baumes Tr mit Wurzel r: max { d(v): v ist Knoten in Tr } 5 3 2 4 d(3)=1 d(8)=2 7 d(Wurzel)=0 8 Blätter: Knoten ohne Kinder Tiefe d(v): # der Elter-Knoten bis Wurzel (inkl.) Ebene: Menge aller Knoten mit gleicher Tiefe Worst Case Analyse von BinarySearch Bezeichnungen innere Knoten 8 Worst Case Analyse von BinarySearch Bezeichnungen Wurzel innere Knoten DAP2 SS08 WorstWeitere Case Analyse von BinarySearch Definitionen • Ein gewurzelter Baum heißt geordnet, wenn die Reihenfolge der Kinder festgelegt ist • Ein binärer gewurzelter Baum ist ein gewurzelter Baum, bei dem jeder Knoten genau zwei Kindzeiger hat. • Ein geordneter gewurzelter binärer Baum unterscheidet also zwischen linkem und rechtem Kind bzw. linkem und rechtem Unterbaum. • Ein binärer Baum heißt vollständig, wenn alle Blätter die gleiche Tiefe haben. Petra Mutzel DAP2 SS08 12 2 Worst CaseBinärer Analyse von BinarySearch Def. Suchbaum • Ein binärer Suchbaum ist ein binärer geordneter Baum, dessen Knoten einen Suchschlüssel als Datum enthalten, und der die Suchbaumeigenschaft erfüllt: • Suchbaumeigenschaft: Enthält ein Knoten den Schlüssel x, so sind alle Schlüssel in seinem linken Unterbaum kleiner als x und alle Schlüssel im rechten Unterbaum größer als x. Worst Case Analyse von BinarySearch Implementierung binärer Bäume • • Achtung: alle Schlüssel verschieden Petra Mutzel DAP2 SS08 • • DAP2 SS08 Ausgabe von p (5) INORDER(p.right) Level-Order-Traversierung: Durchsuche zunächst alle Ebenen von links nach rechts, wobei die Ebenen von oben nach unten besucht werden. • Die wichtigste Traversierungsordnung für binäre Suchbäume ist die InorderTraversierung, weil dabei die Schlüssel aufsteigend sortiert durchlaufen werden. Petra Mutzel • • • • • • • • (2) if p ≠ NULL { (4) 14 DAP2 SS08 16 Worst Casefür Analyse von BinarySearch Beispiel INORDER-Aufruf (1) Procedure INORDER(p) INORDER(p.left) DAP2 SS08 • 15 Inorder-Traversierung (3) Petra Mutzel Worst Case Analyse vonbinäre BinarySearch Traversierungen für Bäume Inorder-Traversierung: Durchsuche rekursiv zunächst den linken Unterbaum, dann die Wurzel, durchsuche dann den rechten Unterbaum. Preorder-Traversierung: Besuche zuerst die Wurzel, durchsuche dann rekursiv den linken Unterbaum, dann den rechten. Postorder-Traversierung: Durchsuche rekursiv zunächst den linken Unterbaum, durchsuche dann rekursiv den rechten Unterbaum, besuche dann die Wurzel. Petra Mutzel Zugriff auf den Baum erfolgt über seinen Wurzelknoten root 13 Worst Case Analysefür vonbinäre BinarySearch Traversierungen Bäume • Realisierung als verallgemeinerte Listen mit bis zu zwei Nachfolgern: – x.key: Schlüssel von Knoten x – x.info: zum Schlüssel zu speichernde Daten – x.parent: Elter von Knoten x – x.left: linkes Kind von Knoten x – x.right: rechtes Kind von Knoten x (6) } INORDER(5) INORDER(2) Ausgabe von „2“ INORDER(1) Ausgabe von „1“ Ausgabe von „5“ INORDER(3) Ausgabe von „3“ 5 2 3 1 Aufruf: INORDER(root) Inorder: 2,1,5,3 Beispiel Inorder-Traversierung (s. Skript) Petra Mutzel DAP2 SS08 17 Petra Mutzel DAP2 SS08 18 3 Inorder-Traversierung Pre Inorder-Traversierung Post (1) Procedure INORDER(p) PREORDER(p) (1) Procedure INORDER(p) POSTORDER(p) (2) if p ≠ NULL { (2) if p ≠ NULL { (3) INORDER(p.left) INORDER(p.left) (3) INORDER(p.left) POSTORDER(p.left) (4) Ausgabe PREORDER(p.left) Ausgabe von von pp (4) Ausgabe von p p Ausgabe POSTORDER(p.right) von (5) INORDER(p.right) PREORDER(p.right) (5) INORDER(p.right) INORDER(p.right) (6) } (6) } Petra Mutzel DAP2 SS08 19 Aus Inorder-Traversierung und PreorderTraversierungsreihenfolge kann der binäre Baum eindeutig rekonstruiert werden, wenn er lauter verschiedene Schlüssel enthält. • • 1. • Dies gilt nicht, wenn lediglich Preorder- und Postorder-Reihenfolge gegeben sind. 5 5 Beispiel: 2 1 3 2 3 1 Petra Mutzel Preorder: 5,2,1,3 Postorder: 1,2,3,5 DAP2 SS08 Finde die Position im Baum mit Wurzel r, an der s gespeichert ist (bzw. sein müßte): Idee: nutze Suchbaumeigenschaft: Vergleiche s mit dem Schlüssel s´ an der Wurzel (des Teilbaums) Falls gefunden: STOP! Sonst: Falls s < s´: suche im linken Teilbaum Sonst: suche im rechten Teilbaum Gehe zu 1. Pseudocode s. Skript Ausgabe: nicht gefunden! Petra Mutzel DAP2 SS08 22 in binären Suchbäumen • 1. 2. 3. 4. 1. Suche nach q.key → Suche endet mit der Position eines leeren Unterbaums 2. Einfügen von q an diese Position 5. Pseudocode s. Skript DAP2 SS08 20 Implementierung Worst Case Analysevon von DELETE(r,s) BinarySearch Einfügen eines Knotens q in den Baum mit Wurzel r Petra Mutzel 2. 3. 4. 5. 6. 21 Implementierung Worst Case Analysevon vonINSERT(r,q) BinarySearch in binären Suchbäumen • DAP2 SS08 Implementierung Worst Case Analysevon vonSEARCH(r,s) BinarySearch in binären Suchbäumen Worst Case Analysefür vonbinäre BinarySearch Traversierungen Bäume • Petra Mutzel 23 Entfernt Knoten nit Schlüssel s im Baum mit Wurzel r Pseudocode s. Skript Suche nach s → Suche endet an Knoten v Falls v≠NULL, dann Falls v keine Kinder besitzt, dann: streiche v Falls v genau ein Kind hat: ändere 2 Zeiger („herausschneiden“) Falls v zwei Kinder hat, dann hat y:=Successor(v) kein linkes Kind (warum??): Herausschneiden bzw. Entfernen von y und Ersetzen von v durch y. Petra Mutzel DAP2 SS08 24 4 Worst Case Analyse von BinarySearch Beispiel für DELETE(r,s) Worst Case Analyse von BinarySearch Beispiel für DELETE(r,s) 15 15 5 16 20 12 3 5 Fall 1: v ist Blatt 23 6 7 7 Petra Mutzel DAP2 SS08 25 Worst Case Analyse von BinarySearch Beispiel für DELETE(r,s) 5 20 5 26 10 Successor(v): 6 16 20 12 3 23 13 18 10 DAP2 SS08 15 Fall 3: v hat genau 2 Kinder 16 12 3 Petra Mutzel Worst Case Analyse von BinarySearch Beispiel für DELETE(r,s) 15 Fall 3: v hat genau 2 Kinder 13 18 23 Successor(q): 6 7 7 Petra Mutzel DAP2 SS08 27 Worst Case Analyse von BinarySearch Successor-Suche 5 16 • 13 18 23 6 7 Petra Mutzel DAP2 SS08 DAP2 SS08 28 Gibt den Nachfolger von Knoten p in der Inorder-Durchmusterungsreihenfolge aus 1. Falls p rechtes Kind hat: Return Minimum(p.right) 2. Sonst: Falls p linkes Kind ist: Return(p.parent) 3. Sonst: wandere solange nach oben bis der aktuelle Knoten zum ersten Mal linkes Kind ist; dann: Return(p.parent) 4. oder die Wurzel erreicht ist; dann: existiert kein Nachfolger. Pseudocode s. Skript 20 12 Petra Mutzel Worst Case Analyse BinarySearch Implementierung von von SUCCESSOR(r,p) Successor(5) = 6 Successor(12) =13 Successor(13) =15 15 10 20 13 18 10 6 3 16 12 3 23 13 18 10 Fall 2: v hat genau ein Kind 29 Petra Mutzel DAP2 SS08 30 5 Abhängigkeit von Worst Case Analyseder von Höhe BinarySearch Worst Case Analyse von BinarySearch Analyse der Operationen der Einfügereihenfolge Einfügereihenfolge: 1,3,4,6,8,9 1. Alle Operationen benötigen eine Laufzeit von O(h(T)) für binäre Suchbäume, wobei h(T) die Höhe des gegebenen Suchbaumes T ist. 1 Baum ist zu linearer Liste degeneriert Problem: Suchzeit ist linear, da h(T)=n-1 3 4 Einfügereihenfolge: 6,8,3,4,1,9 3 1 Petra Mutzel DAP2 SS08 31 • • • • Ein binärer Suchbaum T kann im Extremfall zu einer linearen Liste ausarten (z.B. Einfügereihenfolge sortiert). Dann dauert die erfolglose Suche Θ(h(T))=Θ(n) Der andere Extremfall sind vollständig balancierte Bäume (d.h. alle Ebenen bis auf evtl. die unterste sind voll besetzt); diese haben die Höhe h(T)=Θ(log n). Hier dauert die erfolglose Suche Θ(h(T))=Θ(log(n)) Wir werden sehen: für dieses gute Zeitverhalten genügen auch „hinreichend“ balancierte Bäume 33 8 8 4 9 9 Petra Mutzel Diskussion • 6 6 Frage: Wie hoch kann h(T) für einen binären Suchbaum mit n Knoten sein? DAP2 SS08 32 32 Durchschnittliche Suchpfadlänge Man kann zeigen: • Die erwartete Suchpfadlänge (über alle möglichen Permutationen von n Einfügeoperationen) ist I(n)=2 ln n - O(1) = 1.38629…log n-O(1) • D.h. für große n ist die durchschnittliche Suchpfadlänge nur ca. 38% länger als im Idealfall. • Allerdings ist diese Annahme, dass die Daten in einer zufälligen Reihenfolge eingegeben werden, in vielen Anwendungen nicht gerechtfertigt. Lösung: Balancierte Suchbäume, s. nächste VO 34 6