binäre Suchbäume Wir haben bisher behandelt: Informatik I • Suchen in Listen (linear und verkettet) • Suchen mittels Hashfunktionen 6. Kapitel jeweils unter der Annahme, dass die Daten dynamisch verändert werden, durch Rainer Schrader • Löschoperationen • Einfügeoperationen Zentrum für Angewandte Informatik Köln 4. Juni 2008 Wir haben die Frage zurückgestellt, wie diese Operationen auf Bäumen durchzuführen sind. Zur Erinnerung: 1 / 42 2 / 42 binäre Suchbäume binäre Suchbäume Durch Einfügen und Löschen von Stichworten kann der Suchbaum wie folgt aussehen: Stichwortsuche • Gegeben: ein Lexikon mit n Stichworten. • Frage: ist ein gegebener Begriff im Lexikon enthalten? g a b d Zwei möglich Ansätze: i c d • verkettete Listen: ; O(n) im worst-case b f h j • binärer Baum als Suchbaum organisiert: j a c e • Wörter im linken Unterbaum sind alphabetisch größer als das Wort in der Wurzel Wir werden versuchen, diese Situation zu verhindern, und balancierte Bäume verwenden. • Wörter im rechten Unterbaum sind alphabetisch kleiner als das Wort in der Wurzel Wir werden in diesem Kapitel die Laufzeiten der Operationen Füge_ein, Folgerung Wir können in O(Höhe(T )) entscheiden, ob das gesuchte Wort im Lexikon vorkommt. Entferne, Suche und Zugriff auf Suchbäumen untersuchen. 3 / 42 4 / 42 binäre Suchbäume binäre Suchbäume Sprechweisen Gliederung Sei T ein Baum mit Wurzel r und Unterbäumen T1 , . . . , Tk . Ferner sei ri die Wurzel des Baumes Ti . • grundlegende Definitionen • ri ist i-ter Sohn von r , r ist Vater der r1 , . . . rk , • rj ist Bruder von ri , • u ist Nachfolger von ri , falls u im Unterbaum Ti liegt, • ein Knoten ohne Nachfolger heißt Blatt, • Operationen auf binären Suchbäumen • erwartete Suchzeiten in binären Suchbäumen • Knoten von T , die nicht Blatt sind, heißen innere Knoten, 5 / 42 6 / 42 binäre Suchbäume binäre Suchbäume Bezeichnungen Sprechweisen T1 5 Sei T ein Baum mit Wurzel r und Unterbäumen T1 , . . . , Tk . Wurzel T2 Niveau 2 0 Ferner sei ri die Wurzel des Baumes Ti . 3 7 • eine Folge von Knoten v0 , v1 , . . . , vk heißt Weg, falls vi +1 Nachfolger linker Unterbaum 5 von von vi ist für alle 0 ≤ i ≤ k − 1, 2 • der Weg v0 , v1 , . . . , vk hat die Länge k , • Tiefe(v , T ) = Länge des Weges von Knoten v zur Wurzel r , • Höhe(v , T ) = Länge des längsten Weges von v zu einem Blatt, • Höhe(T ) = Höhe (Wurzel, T ). 5 8 Kanten Tiefe(7)=2 7 5 3 ist Vater von 2 3 ist Vater von 5 2 ist linker Sohn von 3 5 ist rechter Sohn von 3 2 8 3 Blatt 5 7 / 42 1 3 Knoten 4 8 / 42 binäre Suchbäume binäre Suchbäume symmetrisches Durchmustern von Binärbäumen Binäre Bäume (1) Durchmustere in symmetrischer Ordnung Tlinks (falls er existiert) Ein Baum, in dem jeder Knoten höchstens 2 Söhne hat, heißt binär. (2) Durchmustere die Wurzel Darstellung binärer Bäume (3) Durchmustere in symmetrischer Ordnung Trechts (falls er existiert) • durch 2 Felder Leftsoni und Rightsoni • dazu ggf. Informationen über: Inhalt der Knoten, Väter, # Nachfolger in Die Knoten im linken Teilbaum von r tragen kleinere Nummern als r , die im rechten größere. zusätzlichen Feldern 1 2 3 4 5 6 1 2 3 4 5 6 R 4 6 - Folgerung L 2 3 5 - Wir können (auch nach dem Löschen von Knoten) in O(Höhe(T )) entscheiden, ob ein Knoten mit der Nummer p vorkommt. 9 / 42 10 / 42 binäre Suchbäume binaäre Suchbäume Datenstruktur zur Unterstützung der folgenden Operationen auf dynamischen Mengen: Wir unterscheiden: • suche • bestimme das Minimum • Suchbäume: • alle Knoten enthalten Schlüssel, • bestimme das Maximum • bestimme den Vorgänger einer symmetrischen Durchmusterung • Blattsuchbäume: • die Schlüssel sind in den Blättern gespeichert, • bestimme den Nachfolger einer symmetrischen Durchmusterung • füge ein • die inneren Knoten enthalten Wegweiser für die Suche • lösche • wir behandeln in diesem Kapitel ausschließlich Suchbäume Wir haben binäre Bäume schon benutzt (Heapsort, untere Schranke für Sortieren). 11 / 42 12 / 42 binäre Suchbäume binäre Suchbäume Binäre Suchbaumeigenschaft Gliederung Für jeden Knoten p des Baums gilt: • grundlegende Definitionen • die Schlüssel im linken Teilbaum von p sind kleiner als der Schlüssel • Operationen auf binären Suchbäumen von p • erwartete Suchzeiten in binären Suchbäumen • die Schlüssel im rechten Teilbaum von p sind größer als der Schlüssel von p 13 / 42 14 / 42 binäre Suchbäume suche(v, k) in Suchbäumen // suche im Baum mit Wurzel v nach Schlüssel binäre Suchbäume bestimme Minimum (v) in Suchbäumen // im Baum mit Wurzel v bestimme den minimalen Schlüssel k while leftson(v) 6= ∅ do v = leftson(v) end while return v if v.key = k return p if k < v.key then do if leftson(v)6= ∅ then suche(leftson(v), k) else return „nicht gefunden” end if else if rightson(v)6= ∅ then suche(rightson(v), k) else return „nicht gefunden” end if end if Korrektheit: folgt aus der Suchbaumeigenschaft, denn in jedem Schritt gilt: • alle Schlüssel im rechten Teilbaum sind größer als der in der Wurzel • alle Schlüssel im linken Teilbaum sind kleiner als der in der Wurzel • d.h., wenn v einen linken Teilbaum besitzt, so befindet sich das Minimum darin Laufzeit:O(Höhe(T (v ))) Laufzeit: O(Höhe(T (v ))) Entsprechend lässt sich das Maximum bestimmen. 15 / 42 16 / 42 binäre Suchbäume binäre Suchbäume Sei v ein Knoten und u der Knoten mit dem nächstgrößeren Schlüsselwert . • hat v einen rechten Sohn, so ist u der minimale Schlüssel im rechten Teilbaum von v • hat v keinen rechten Sohn, so ist u der erste Vorfahr von v , dessen linker Sohn x auch Vorfahr von v ist, denn: • in einigen Anwendungen muss zu einem Knoten v der Knoten u mit dem nächstgrößeren (nächstkleineren) Schlüsselwert bestimmt werden • v hat maximalen Schlüsselwert im Teilbaum Tx , • danach wird in symmetrischer Durchmusterung u erreicht. • Beobachtung: die symmetrische Durchmusterung durchläuft offensichtlich die Knoten nach aufsteigenden Schlüsselwerten u • damit ist u der nächste Knoten in der symmetrischen Durchmusterung x v 17 / 42 18 / 42 binäre Suchbäume binäre Suchbäume füge_ein(T , k ) bestimme Nachfolger(p) in Suchbäumen fügt einen neuen Knoten mit Schlüssel k in den Suchbaum ein. if rightson(p)6= ∅ then return minimum(rightson(p)) else q = father(p) while father(p)6= ∅ and p = rightson(q) do p = q q = father(p) end while if father(p)6= ∅ return q else return „kein Nachfolger” • suche nach k • ist k schon in T enthalten, stop • andernfalls endet die Suche in einem Knoten v mit Schlüssel j , und • j > k und v hat keinen linken Sohn, oder • j < k und v hat keinen rechten Sohn • erzeuge den entsprechenden Sohn von v • speichere k in v Laufzeit: O(Höhe(T )) Laufzeit: O(Höhe(T (p))) Entsprechend lässt sich der Vorgänger in der symmetrischen Durchmusterung bestimmen. 19 / 42 20 / 42 binäre Suchbäume binäre Suchbäume Illustration zu Entfernung des Knotens v : Beispiel: Einfügen des Schlüssels k = 16 15 v 5 15 6 2 3 18 3 7 4 17 13 16 20 12 10 20 u 16 13 18 23 6 successor(15) = 17 successor(13) = 15 9 7 insert(16) 21 / 42 22 / 42 binäre Suchbäume binäre Suchbäume 15 15 v v 5 16 3 5 20 12 10 u 13 18 3 20 12 23 10 Fall 1: v hat keine Kinder (im Beispiel Knoten 13) 6 16 u 13 18 23 Fall 2: v hat ein Kind (im Beispiel Knoten 16) 6 ; einfach entfernen. ; zwei Zeiger ändern („herausschneiden“): Vater von v zeigt auf Sohn von v 7 7 23 / 42 24 / 42 binäre Suchbäume binäre Suchbäume 15 v Laufzeit für Entfernen: 5 O(Höhe(T )) 16 Aufbau eines binären Suchbaums 3 10 • erzeuge einen leeren Baum • füge die Schlüssel in gegebener Reihenfolge in den Baum ein 20 12 13 18 • im Extremfall kann der Baum zu einer linearen Liste ausarten, wenn 23 z.B. die Einträge nach aufsteigenden Schlüsseln eingefügt werden u Fall 3: v hat zwei Kinder (im Beispiel Knoten 5) 6 7 • sei u der Knoten mit dem nächstgrößeren Schlüssel • u hat keinen linken Sohn, da sonst der nächstkleinere Schlüssel von u im linken Teilbaum • u erfüllt Fall 1 oder 2 • wenn wir v durch u ersetzen, bleibt die Suchbaumeigenschaft erhalten • ; entferne u und ersetze v durch u • in diesem Fall dauern die Operationen lineare Zeit, da h(T ) = Θ(n). • (vollständige binäre Bäume T haben die Höhe h(T ) = Θ(log n)) • wir versuchen zu analysieren, wie lange die Operationen im Erwartungswert dauern 25 / 42 26 / 42 binäre Suchbäume binäre Suchbäume • als Maß für die Güte eines Suchbaums betrachten wir die mittleren Suchzeiten Gliederung • Suchzeit für Knoten p = Anzahl der Knoten auf dem Pfad von p zur • grundlegende Definitionen Wurzel = Tiefe(p) + 1 • Operationen auf binären Suchbäumen Mittelung über: • erwartete Suchzeiten in binären Suchbäumen • alle Permutation der n Schlüssel, oder • alle Suchbäume mit n Knoten Wir beschränken uns auf den ersten Fall. 27 / 42 28 / 42 binäre Suchbäume binäre Suchbäume Annahmen: Konventionen: • alle Schlüssel sind paarweise verschieden, oBdA {1, 2, . . . , n} • wir schreiben v ∈ T für „v ist ein Knoten im Baum T“ • ein zufälliger binärer Suchbaum entsteht durch Einfügen der Schlüssel • |T | ist die Anzahl der Knoten im Baum T hintereinander gemäß einer zufälligen Permutation • falls |T | > 0, so sei Tl linker und Tr rechter Teilbaum von T • jede Permutation π bestimmt eindeutig einen binären Suchbaum Tπ , • die Umkehrung gilt jedoch nicht: T π1 = h2, 1, 3i 2 π2 = h2, 3, 1i 1 Tπ1 = Tπ2 3 Tl Tr 30 / 42 29 / 42 binäre Suchbäume binäre Suchbäume Lemma (Rekursive Definition von ϕ(T )) Suchpfadlänge eines Baumes T : ϕ(T ) = X ϕ(T ) = (TiefeT (v ) + 1) falls |T | = 0 falls |T | > 0 0, |T | + ϕ(Tl ) + ϕ(Tr ), v ∈T Beweis: Beispiel: ϕ(T ) = X (TiefeT (v ) + 1) v ∈T Tiefe+1 =1+ 1 X (TiefeT (v ) + 1) + v ∈Tl 2 2 =1+ φ(Τ)=14 X 3 3 3 (TiefeTl (v ) + 2) + X = 31 / 42 X (TiefeTr (v ) + 2) v ∈Tr (TiefeTl (v ) + 1) + v ∈Tl per Def. (TiefeT (v ) + 1) v ∈Tr v ∈Tl = |T | + X X (TiefeTr (v ) + 1) v ∈Tr |T | + ϕ(Tl ) + ϕ(Tr ) 32 / 42 binäre Suchbäume binäre Suchbäume • sei die durchschnittliche Suchpfadlänge gegeben durch ϕ̄(T ) = • in unserem Beispiel für n = 3: ϕ(T ) |T | π1 = h2, 1, 3i • ϕ̄(T ) ist die Anzahl der Knoten, die bei einer zufälligen, erfolgreichen π2 = h2, 3, 1i Suche in T besucht werden • sei Sn die Menge aller Permutation auf {1, 2, . . . , n} 1 Tπ1 = Tπ2 3 • die Permutationen h2, 1, 3i und h2, 3, 1i liefern eine Pfadlänge von 5 • für π ∈ Sn sei Tπ der Binärbaum, der entsteht, wenn in der • alle anderen führen zu linearen Listen mit Pfadlänge 6 Reihenfolge von π eingefügt wird • dies liefert eine mittlere Pfadlänge von Eϕ̄ (3) = • wir mitteln jetzt die Suchzeiten über alle Bäume: Eϕ (n) = 2 34 18 • dies ist fast die mittlere Pfadlänge einer linearen Liste (= 2) 1 X ϕ(Tπ ) n! π∈Sn Eϕ̄ (n) = • wir werden zeigen, dass dieses Beispiel täuscht 1 X 1 ϕ̄(Tπ ) = Eϕ (n) n! n π∈Sn 34 / 42 33 / 42 binäre Suchbäume binäre Suchbäume Satz • sei π<k die Einschränkung von π = hπ(1), π(2), . . . , π(n)i auf Eϕ̄ (n) = 2 ln n + O(1). 1, 2, . . . , k − 1 Beweis: • wir berechnen zunächst Eϕ (n) • sei π = hπ(1), π(2), . . . , π(n)i ∈ Sn zufällig gewählt • dann ist π(1) Wurzelschlüssel von Tπ • für jedes k ∈ {1, 2, . . . , n} ist π(1) = k mit Wahrscheinlichkeit Beispiel: • sei π = h4, 3, 1, 5, 2, 6i • dann ist π<4 = h3, 1, 2i 1 n • entsprechend sei π>k die Einschränkung von π auf k + 1, k + 2, . . . , n • π<k und π>k sind Permutation auf den entsprechenden Teilmengen • ist π ∈ Sn zufällig, so sind π<k ∈ Sk −1 und π>k ∈ Sn−k ebenfalls k Schlüssel Schlüssel 1, 2, . . . , k − 1 k + 1, k + 2, . . . , n Tπ,l zufällig Tπ,r 35 / 42 36 / 42 binäre Suchbäume binäre Suchbäume Eϕ (n) = n 1X (Eϕ (k − 1) + Eϕ (n − k ) + n) n k =1 =n+ • mit Hilfe dieser Beobachtung • und etwas formalem Aufwand (den wir hier nicht treiben) • ergeben sich daraus Rekursionsformeln für Eϕ (n): n 1X (Eϕ (k − 1) + Eϕ (n − k )) n k =1 =n+ 2 n n−1 X Eϕ (k ) k =0 Somit: Eϕ (n) = 8 < : 1 n 0, für n = 0, 1, für n = 1, Pn k =1 (Eϕ (k − 1) + Eϕ (n − k ) + n), für n > 1. (n + 1) · Eϕ (n + 1) = (n + 1)2 + 2 · n X Eϕ (k ) k =0 n · Eϕ (n) = n 2 + 2 · n−1 X Eϕ (k ) k =0 Subtraktion liefert: Eϕ (n + 1) = 2n + 1 n+2 + Eϕ (n) n+1 n+1 37 / 42 38 / 42 binäre Suchbäume binäre Suchbäume 2n + 1 n+2 + Eϕ (n) n+1 n+1 . Pn 1 Per Induktion zeigt man: Eϕ (n) = 2(n + 1) i =1 i − 3n, denn Eϕ (n + 1) = 2n + 1 n+2 + Eϕ (n) n+1 n+1 n i X n + 2h 1 2n + 1 + 2(n + 1) − 3n = n+1 n+1 i Eϕ (n) = 2(n + 1) Eϕ (n + 1) = n X 1 − 3n i i =1 (per Induktion) Die Abschätzung der Summe liefert: i =1 n = Eϕ (n) ≤ 2n ln n + 2 ln n − 2n X1 3n(n + 2) 2n + 1 + 2(n + 2) − n+1 i n+1 und i =1 = 2(n + 2) n X i =1 Eϕ̄ (n) ≤ 1.4 log n + 1 2n + 1 − 3n 2 − 6n + i n+1 2 ln n −2 n n X 1 1 = 2(n + 2) + 2(n + 2) · − 3(n + 1) i n+1 i =1 n+1 X 1 = 2(n + 2) − 3(n + 1) i i =1 39 / 42 40 / 42 binäre Suchbäume binäre Suchbäume Unter allen Suchbäumen auf n Knoten hat der vollständige Baum minimale mittlere Suchpfadlänge. Sie beträgt: log(n + 1) n = log(n + 1) + O(1) Mϕ (n) = log(n + 1) + • diese Analyse gilt jedoch nur, wenn der Baum nicht durch Einfüge- und Lösch-Operationen verändert wird • unsere Lösch-Strategie führt dazu, dass größere Schlüssel nach oben = log(n) + O(1) wandern Zum Vergleich: • der Baum wird dadurch mehr und mehr linkslastig √ • eine Analyse ergibt eine mittlere Suchpfadlänge von Θ( n) Eϕ̄ (n) = 2 ln n + O(1) = • wir wollen im folgenden versuchen, den Baum „balanciert” zu halten 2 log2 n + O(1) log2 e = 1.38629 . . . · log2 n + O(1) D.h. für große n ist die durchschnittliche Suchpfadlänge nur ca. 40% länger als im Idealfall. 41 / 42 42 / 42