Korrektur zu 4. Vorlesung (25.04.) Algorithmen und Datenstrukturen 6. Vorlesung Datentyp MarkedSequence 2. Mathematisches Modell: ... Martin Dietzfelbinger Operationen: ... 9. Mai 2005 removeFirst((p, (a1, . . . , an))) := (p − 1, (a2, . . . , an)), falls n ≥ 1 und p ≥ 2 (1, (a2, . . . , an)), falls n ≥ 1 und p = 1 undefiniert, falls n = 0 FG KTuEA, TU Ilmenau AuD – 09.05.2005 FG KTuEA, TU Ilmenau AuD – 09.05.2005 Ein binärer Suchbaum 1 Binärer Suchbaum U = {A, B, C, . . . , Z}, R = N Knoteneinträge: key (v): Schlüssel (aus U ) G 4 data(v): Daten, Wert (aus R) (oft: Zeiger, Referenz) E K 7 2 B I M 9 4 11 Definition Ein Binärbaum T mit Einträgen aus U × R heißt ein binärer Suchbaum (BSB/BST), falls für jeden Knoten v in T gilt: w im linken Unterbaum von Tv ⇒ key (w) < key (v) w im rechten Unterbaum von Tv ⇒ key (v) < key (w) D 2 Def(f ) = {B, D, E, G, I, K, M }, f (B) = 9, f (D) = 2, usw. FG KTuEA, TU Ilmenau AuD – 09.05.2005 2 FG KTuEA, TU Ilmenau AuD – 09.05.2005 3 Mittlere Tiefe von. Knoten in BSBs 0 1 2 T zufällig erzeugt: d 2 c k 1 a m p f 3 Zufällig erzeugte binäre Suchbäume h 3 3 Eingabereihenfolge der Schlüssel x1 < x2 < · · · < xn ist zufällig — 2 n jede Reihenfolge hat dieselbe Wahrscheinlichkeit 1 n! . A(n) := E(TIPL(T )). Summe der Tiefen: 0 + 2 · 1 + 3 · 2 + 3 · 3 = 17 P Totale innere Weglänge TIPL(T ) := v∈V d(v) Dann ist der erwartete (über Eingabereihenfolgen gemittelt) mittlere (über Schlüssel gemittelt) Suchaufwand: Totale Anzahl Knoten, wenn jeder besucht: n + TIPL(T ). 1 1 + A(n). n 1 TIPL(T ). n Mittlere innere Weglänge: Mittlere Anzahl besuchter Knoten: 1 + n1 TIPL(T ). FG KTuEA, TU Ilmenau AuD – 09.05.2005 A(0) = 0, A(1) = 0, A(2) = 1. 4 FG KTuEA, TU Ilmenau 6 Einfügereihenfolgen für (x1, x2, x3) = (1, 2, 3): 1 2 3 1 1 3 2 1 3 2 TIPL(T): 3 3 3 2 1 3 3 2 3 3 2 3 1 2 2 3 TIPL(T): 2 xi 1 1 3 2 1 3 1 Wenn xi der erste eingefügte Schlüssel ist, dann hat der linke Unterbaum i − 1 Schlüssel, der rechte n − i. 2 2 x1 , ... , xi- 1 3 AuD – 09.05.2005 xi+1 , ... , x n Die Unterbäume sind selbst zufällig erzeugte Suchbäume Also: E(TIPL(T ) | falls xi erster) = . . . ! Derselbe Baum ! 2 A(3) = E(TIPL(T )) = 16 (3 + 3 + 3 + 3 + 2 + 2) = 83 . FG KTuEA, TU Ilmenau 5 Rekursionsformel 3 1 2 1 AuD – 09.05.2005 binäre . . . = ((i − 1) + A(i − 1)) + ((n − i) + A(n − i)). 6 FG KTuEA, TU Ilmenau AuD – 09.05.2005 7 (Weg in T zu jedem der n − 1 Knoten in den Teilbäumen ist um 1 länger als der Weg im Teilbaum; daher die Summanden (i − 1), (n − i).) Vereinfachung: Rekursionsformel Jeder der n Schlüssel hat dieselbe Wahrscheinlichkeit 1/n, als erster eingefügt zu werden und die Wurzel zu bilden. Also Mittelung: . . . = (n − 1) + A(i − 1) + A(n − i) A(n) = 1 X [(n − 1) + A(i − 1) + A(n − i)]. n 1≤i≤n Das heißt: A(n) = (n − 1) + FG KTuEA, TU Ilmenau AuD – 09.05.2005 8 FG KTuEA, TU Ilmenau Umgruppieren; A(0) = 0: A(n) = (n − 1) + 2 n X 1 X (A(i − 1) + A(n − i)). n 1≤i≤n AuD – 09.05.2005 9 A(n) = (n − 1) + A(j) 2 n Multiplizieren mit n: 1≤j≤n−1 P 1≤j≤0 A(j) = 0; 29 6; 29 37 6)= 5; AuD – 09.05.2005 X A(j) 1≤j≤n−2 Subtrahieren: nA(n)−(n − 1)A(n − 1) = n(n − 1)−(n − 1)(n − 2)+2A(n − 1) Geschlossene Form? FG KTuEA, TU Ilmenau A(j) 1≤j≤n−1 (n − 1) · A(n − 1) = (n − 1)(n − 2) + 2 · A(4) = (4 − 1) + 24 (0 + 1 + 83 ) = A(5) = (5 − 1) + 25 (0 + 1 + 83 + X Dasselbe für n − 1: A(2) = (2 − 1) + 22 (0) = 1; A(3) = (3 − 1) + 23 (0 + 1) = 83 ; A(j) 1≤j≤n−1 n · A(n) = n(n − 1) + 2 · A(1) = (1 − 1) + 21 X = 2(n − 1) + 2A(n − 1). 10 FG KTuEA, TU Ilmenau AuD – 09.05.2005 11 Z(n) − Z(n − 1) = n · A(n) − (n − 1) · A(n − 1) = 2A(n − 1) + 2(n − 1). X 2 X 2(j − 1) 4 . = − Z(n) = j(j + 1) j j(j + 1) n · A(n) − (n + 1) · A(n − 1) = 2(n − 1). Teile durch n(n + 1): 1≤j≤n A(n) A(n − 1) 2(n − 1) − = . n+1 n n(n + 1) 1≤j≤n Mit Hn := 1 + 12 + 13 + 14 + · · · + n1 : (n-te harmonische Zahl) Abkürzung: Z(n) := A(n)/(n + 1). und Damit: Z(0) = Z(1) = 0 und 1 1·2 1 1 1 + 2·3 + · · · + n·(n+1) = 1 − n+1 gibt das: 2(n − 1) Z(n) − Z(n − 1) = . n(n + 1) AuD – 09.05.2005 Z(1) = 0. Also, für n ≥ 2: D.h.: FG KTuEA, TU Ilmenau 2(n − 1) ; n(n + 1) Z(n) = 2Hn − 4 + 12 FG KTuEA, TU Ilmenau 4 n+1 AuD – 09.05.2005 13 1 A(n) = 2Hn − 4 + O( Hnn ). n 4 n+1 Mit Definition von Z(n): Geschlossene Form: Z(n) = 2Hn − 4 + Übung: ln n < Hn < 1 + ln n, für n ≥ 2. Genauer: γ = limn→∞(Hn − ln n) existiert, A(n) = 2(n + 1)Hn − 4(n + 1) + 4. γ = 0,57721 . . . ( Eulersche Konstante“) ” Damit: 1 A(n) = 2 ln n − (4 − 2γ) + o(1) n Mittlere erwartete Knotentiefe: Teile durch n: 1 A(n) = 2Hn − 4 + O( Hnn ). n FG KTuEA, TU Ilmenau AuD – 09.05.2005 14 FG KTuEA, TU Ilmenau AuD – 09.05.2005 15 Wenn man Zweierlogarithmen lieber mag: Balancierte Suchbäume 1 A(n) = (2 ln 2) log n − 2,846 . . . + o(1). n Idee: Dabei: 2 ln 2 = 1,386 . . . • Lasse nur Bäume zu, die bestimmte Strukturanforderungen erfüllen Fazit: In zufällig erzeugten natürlichen“ binären Suchbäumen ” ist die mittlere Knotentiefe logarithmisch. • Strukturbedingungen erzwingen geringe Tiefe (O(log n) bei n Einträgen) Leider: Normalerweise Einfügereihenfolge nicht zufällig. • Implementierung für Wörterbuch-Operationen Häufiges Löschen mit deletemin zerstört die Balance. Abhilfe: Abwechselnd kleinsten Schlüssel aus rechtem Unterbaum und größten Schlüssel aus linkem Unterbaum entnehmen. FG KTuEA, TU Ilmenau AuD – 09.05.2005 16 insert und delete, die die Strukturbedingungen erhalten und in Zeit O(Tiefe) durchführbar sind. FG KTuEA, TU Ilmenau AuD – 09.05.2005 Ungeeignete Strukturbedingung: Perfekte Balance (Teure Einfüge- und Lösch-Operationen) 17 AVL-Bäume [Adelson-Velskii und Landis 1962] Höhenbalancierte binäre Suchbäume Häufig benutzte Strukturbedingungen: • AVL-Bäume • Rot-Schwarz-Bäume v • 2-3-Bäume h1 • B-Bäume, 2-3-4-Bäume Tv,1 Tv,2 h 2 |h1 − h2| ≤ 1 FG KTuEA, TU Ilmenau AuD – 09.05.2005 18 FG KTuEA, TU Ilmenau AuD – 09.05.2005 19 Definition Ein binärer Baum T heißt höhenbalanciert, falls in jedem Knoten v in T für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt: −1 −1 −1 Stets: 2 0 Nicht .. hohenbalanciert: −2 2 Äquivalent ist die rekursive Charakterisierung: (i) Der leere Baum ist höhenbalancierter BB über U . (ii) Sind T1 und T2 höhenbalancierte BB, x ∈ U , und ist bal = d(T2) − d(T1) ∈ {0, −1, 1}, so ist (T1, x, T2) höhenbalancierter BB über U (Balancefaktor bal). Definition Ein höhenbalancierter binärer Suchbaum heißt AVL-Baum. −1 0 0 20 −1 1 1 ∈ {0, −1, 1} AuD – 09.05.2005 0 0 Balancefaktor in v“ ” FG KTuEA, TU Ilmenau −1 −1 −1 d(Tv,2) − d(Tv,1) {z } | 1 0 Beispiele: 1 −1 1 FG KTuEA, TU Ilmenau AuD – 09.05.2005 21 Satz Ist T ein AVL-Baum mit n Knoten, so gilt Für die Implementierung von AVL-Bäumen muss man in jedem inneren Knoten v den Balancefaktor bal(v) speichern! Notation: bal(v) ist der Balancefaktor in Knoten v. d(T ) ≤ 1,4405 · log2 n. D.h.: AVL-Bäume sind höchstens um den Faktor 1,45 tiefer als vollständig balancierte Binärbäume mit derselben Knotenzahl. Hoffnung: AVL-Bäume sind nicht allzu tief. Tatsächlich: . . . logarithmisch tief“. ” Beweisansatz: Zeige, dass ein AVL-Baum mit Tiefe d exponentiell in d viele Knoten haben muss, d.h. mindestens cd viele für eine Konstante c > 1, mit logc 2 ≤ 1,4405. FG KTuEA, TU Ilmenau AuD – 09.05.2005 22 FG KTuEA, TU Ilmenau AuD – 09.05.2005 23 Beweis des Satzes: oder N(2) = 4 Für d = −1, 0, 1, 2, . . . setze N (d) := die minimale Zahl innerer Knoten in einem AVL-Baum T mit d(T ) = d. N(−1) = 0 Leerer Baum: N(0) = 1 0 2 N(3) = 7 oder 1 Knoten 1 N(1) = 2 FG KTuEA, TU Ilmenau 1 2 2 oder 1 AuD – 09.05.2005 24 N (d) = 1 + N (d − 1) + N (d − 2), für d ≥ 1. . v T2: h−2 . . h−1 N(h−1) AuD – 09.05.2005 25 AuD – 09.05.2005 27 d N (d) −1 0 0 1 1 2 2 4 3 7 4 12 5 20 6 33 7 54 8 87 Behauptung 1: T1: FG KTuEA, TU Ilmenau N(h−2) . Kann N (d)-Zahlen auflisten. FG KTuEA, TU Ilmenau AuD – 09.05.2005 26 FG KTuEA, TU Ilmenau d N (d) −1 0 0 1 1 2 2 4 3 7 4 12 5 20 6 33 7 54 8 88 Behauptung Fibonacci-Zahlen F0 = 0, F1 = 1, Fn = Fn−2 + Fn−1, n ≥ 2. n Fn 0 0 1 1 2 1 3 2 4 3 5 5 6 8 7 13 8 21 9 34 10 55 FG KTuEA, TU Ilmenau Fd+3 1 2 3 5 8 13 21 34 55 89 2: N (d) = Fd+3 − 1, für d ≥ −1. Beweis durch vollständige Induktion. AuD – 09.05.2005 28 Fakt: FG KTuEA, TU Ilmenau AuD – 09.05.2005 29 Es sei nun T ein höhenbalancierter Baum mit Höhe d ≥ 1 und n Knoten. 1 Fi = √ Φi − Φ̂i , für i ≥ 0, 5 √ 1 wo Φ = 2 (1 + 5) ≈ 1,618 . . . ( goldener Schnitt“) ” √ Φ̂ = 12 (1 − 5) ≈ −0,618 . . . Nach Behauptung 2: 1 3 n ≥ Fd+3 − 1 ≥ √ Φd+3 − , 2 5 (Lösungen der quadratischen Gleichung x2 = x + 1.) Beweis des Faktes durch vollständige Induktion. (die gewünschte exponentielle Schranke für die Knotenzahl!) Daraus : Für i ≥ 1 gilt: daraus durch Umstellen und Logarithmieren: √ 3 . d + 3 ≤ logΦ 5· n+ 2 1 1 Fi = √ Φ i + 2 5 (die zu √1 Φi 5 FG KTuEA, TU Ilmenau nächstgelegene natürliche Zahl). AuD – 09.05.2005 30 FG KTuEA, TU Ilmenau AuD – 09.05.2005 31 d + 3 ≤ logΦ √ 3 5· n+ 2 Müssen noch zeigen: . Man kann die Wörterbuchoperationen so implementieren, dass die AVL-Eigenschaft erhalten bleibt, Kurvendiskussion liefert: √ logΦ( 5) ≤ 2 und logΦ(n + 3/2) < logΦ(n) + 1, also: und der Zeitbedarf proportional zur Tiefe ist. Wenn T ein AVL-Baum mit Tiefe d = d(T ) ist und n die Knotenanzahl in T ist, so gilt: GdP1-Folien zu AVL-Bäume“ ansehen. ” d ≤ logΦ(n) = logΦ(2) · log2(n) mit logΦ(2) = ln(2)/ ln(Φ) = 1,4404 . . . . Das ist die gewünschte logarithmische Tiefenschranke. FG KTuEA, TU Ilmenau AuD – 09.05.2005 32 FG KTuEA, TU Ilmenau Implementierung der Operationen AuD – 09.05.2005 33 Rotationen: Hilfsoperationen AVL empty: Wie bei gewöhnlichem BSB. Rechtsrotation: kippe 1 Kante nach rechts“: ” AVL lookup: Wie bei gewöhnlichem BSB. u v Brauchen nur: AVL insert und AVL delete. liefert: Grundansatz: Führe Operation aus wie bei gewöhnlichem BSB. v u Eventuell: AVL-Bedingung verletzt. Reparatur“: Rebalancierung ” FG KTuEA, TU Ilmenau AuD – 09.05.2005 34 FG KTuEA, TU Ilmenau AuD – 09.05.2005 35 Rotationen: Hilfsoperationen key(v1) < x < key(v2) < y < key(v3). Rechtsrotation: Mit Unterbäumen Tv : y v Also Suchbaumeigenschaft auch in Tu0 erfüllt. Tu ’: 1 x u 3 u 1 x 2 2 T3 y 3 T1 T2 T1 v T3 T2 Beobachte: Tv binärer Suchbaum ⇒ Tu0 binärer Suchbaum. Denn: Weil Tv binärer Suchbaum ist, gilt für v1 in T1, v2 in T2, v3 in T3: FG KTuEA, TU Ilmenau AuD – 09.05.2005 36 Als Programm: (0) (1) (2) (3) (4) (5) (6) FG KTuEA, TU Ilmenau AuD – 09.05.2005 37 Linksrotation: Umkehrung von Rechtsrotation Eingabe: v, Referenz auf Knoten, 6= NIL v.left 6= NIL s: Referenz auf Knoten s ← v.left; v.left ← s.right ; s.right ← v ; return s. x y y T1 x T2 T2 T3 T3 T1 Warnung: Balancefaktoren sind nun inkorrekt! Beispiele: Nummern bezeichnen Anschlussstellen für Unterbäume. FG KTuEA, TU Ilmenau AuD – 09.05.2005 38 FG KTuEA, TU Ilmenau AuD – 09.05.2005 39 y 3 1 x r_r Doppelrotationen: Links-Rechts, Rechts-Links y 3 a c 1 x 2 2 l_r a 1 r_r w y a 2 2 l_r c FG KTuEA, TU Ilmenau y 3 AuD – 09.05.2005 40 Links-Rechts-Doppelrotation: Mit Unterbäumen 4 y u x w y 2 u 1 x T4 (1) z 3 (2) 4 (3) 3 (4) T1 T1 T2 (0) w v 2 FG KTuEA, TU Ilmenau T2 T3 (5) T4 (6) T3 (7) Gesamteffekt: Der unterste Knoten eines Zick-Zack-Wegs (Länge 2) wandert nach oben, wird Wurzel. (8) (9) (10) FG KTuEA, TU Ilmenau AuD – 09.05.2005 AuD – 09.05.2005 41 LR-Doppelrotation: Separate Formulierung als Programm v 1 v z a a z u x x 1 r_r c x 1 c a 3 u x rechts an v Wird angewendet auf Weg aus 2 Kanten, Form links-rechts“ ” y 3 2 l_r y links an u y x 1 c x 2 w z u x w y y 3 v z v c 42 Eingabe: v, Referenz auf Knoten, 6= NIL v.left 6= NIL v.left.right 6= NIL u, w: Referenzen auf Knoten u ← v.left; w ← u.right; u.right ← w.left ; v.left ← u.right ; w.left ← u ; w.right ← v ; return w. FG KTuEA, TU Ilmenau AuD – 09.05.2005 43 Rechts-Links-Doppelrotation: Symmetrisch zu LR-Doppelrotation 1 D links− rechts P links v 1 A x y u z w y T1 2 B 1 x F 4 S 2 3 F A R A T S 1 B 2 T R 1 u z P 3 S D 3 2 w v 4 P D 4 2 3 F 3 rechts T4 T2 T1 T3 T2 T3 T4 D B 1 rechts− links P B Beispiel: A A P 4 S F 2 R FG KTuEA, TU Ilmenau T R B AuD – 09.05.2005 44 FG KTuEA, TU Ilmenau T S D 3 F AuD – 09.05.2005 R T 45 Beispiel: Einfügen von 1, 3, 9, 11, 12, 10, 2, 6, 4, 7, 0 in anfangs leeren AVL-Baum. Wir zeichnen nur Situationen, in denen Rotationen stattfinden. AVL insert Effekt: Füge ein wie bei gewöhnlichem BSB. Wenn Balancebedingung nicht verletzt: fertig. Wenn Balancebedingung verletzt, gibt es auf dem Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v, 1 links 3 rechts−links 3 an dem die Balancebedingung nicht erfüllt ist. 3 1 9 links 11 1 An v wird eine Einfach- oder Doppelrotation ausgeführt 11 9 und dadurch die Balance wieder hergestellt. 12 11 12 1 3 9 FG KTuEA, TU Ilmenau AuD – 09.05.2005 46 FG KTuEA, TU Ilmenau AuD – 09.05.2005 12 9 10 9 10 47 rechts− links 3 11 1 2 links 4 10 3 12 6 1 6 3 0 0 4 9 9 2 links FG KTuEA, TU Ilmenau 11 4 7 12 10 7 2 3 11 2 2 7 1 9 4 12 10 1 10 11 11 1 12 9 rechts 9 9 links− rechts 3 10 12 1 6 rechts− links 2 11 2 10 3 1 12 6 4 3 0 6 7 9 11 6 7 10 12 4 AuD – 09.05.2005 48 FG KTuEA, TU Ilmenau AuD – 09.05.2005 Etwas knifflig: Rekursive Programmierung des Ablaufs. 49 AVL insert Benutzt werden: Eingabe: T: AVL tree, x: key, r: range Ausgabe: T: AVL tree, higher: boolean • Balancfaktoren v.bal in den Knoten • Flagbit higher“, das mitteilt, ob der Unterbaum tiefer ” geworden ist Steuerung einer großen Fallunterscheidung durch alte Balancefaktoren und higher“-Meldungen aus rekursivem Aufruf. ” 1. Fall: T = NIL (∗ Neuer Knoten! ∗) Erzeuge neuen AVL-Baum-Knoten v. T←v T.key ← x T.data ← r T.left ← NIL; t.right ← NIL; T.bal ← 0; return (T, true) FG KTuEA, TU Ilmenau AuD – 09.05.2005 50 FG KTuEA, TU Ilmenau AuD – 09.05.2005 51 2. Fall: T.key = x 3. Fall: T.key < x Update-Situation! AVL insert rekursiv auf T.right, x, r anwenden. T.data ← r Ergebnis: Unterbaum T.right geändert, Boolean right higher return (T, false) FG KTuEA, TU Ilmenau AuD – 09.05.2005 Rebalancierung symmetrisch zum 4.Fall. 52 FG KTuEA, TU Ilmenau AuD – 09.05.2005 4. Fall: x < T.key Unterfälle: AVL insert rekursiv auf T.left, x, r anwenden. (4.1) left_higher = false Ergebnis: Unterbaum T.left geändert, Boolean left higher Garantie (Induktion über rekursive Aufrufe/Größe von Bäumen): T.left ist AVL-Baum, im Innern von T.left sind die Balancefaktoren korrekt. Probleme: 53 Aktion: T: higher <- false; (* T.bal stimmt noch *) neu aber gleiche Höhe ? Balancefaktor in T korrekt? ? Balancebedingung in T erfüllt? Rebalancierung! FG KTuEA, TU Ilmenau AuD – 09.05.2005 54 FG KTuEA, TU Ilmenau AuD – 09.05.2005 55 Unterfälle: Unterfälle: Aktion: Aktion: (4.3) left_higher = true ∧ T.bal = 1 (4.2) left_higher = true ∧ T.bal = 0 higher <- false; T.bal <- 0; T: T: higher <- true; T.bal <- -1; neu: neu: FG KTuEA, TU Ilmenau AuD – 09.05.2005 Unterfälle: 56 T: 1 57 Schon vor dem rekursiven Aufruf von AVL insert war der linke Unterbaum T1 von T nicht der leere Baum. Wir werden sehen: ??? Fall (4.4) liefert stets higher = false. Ebenso (3.4) und (4.1), (4.3), (3.1), (3.3). Also tritt beim rekursiven Aufruf für T.left Fall (4.2) oder der symmetrische Fall (3.2) ein. T: 2 D.h.: Der Balancefaktor T.left.bal in T1 ist −1 oder 1. neu: FG KTuEA, TU Ilmenau AuD – 09.05.2005 Aktion: (4.3) left_higher = true ∧ T.bal = -1 T: FG KTuEA, TU Ilmenau AuD – 09.05.2005 58 FG KTuEA, TU Ilmenau AuD – 09.05.2005 59 Unterfälle: (4.4.1) T.left.bal = 1 Aktion: Rechtsrotation T: Unterfälle: Aktion: (4.4.2) Links-RechtsDoppelrotation T.left.bal = 1 T: T.right T.left T: T: T.left T1 T1 T2 T1 T1 T2 T: neu neu FG KTuEA, TU Ilmenau AuD – 09.05.2005 T1 T1 T1 T1 T2 T1 T <- left_right_rotate(T); higher <- false; 60 Neue Werte: altes T.bal −1 0 1 T2 T1 T <- right_rotate(T); higher <- false; T.bal <- 0; T.right.bal <- 0; FG KTuEA, TU Ilmenau AuD – 09.05.2005 61 Faustregel: Wird ein äußerer Teilbaum zu tief: Einfache Rotation hebt diesen Teilbaum ein Level höher. T.left.bal T.right.bal T.bal 0 1 0 0 0 0 −1 0 0 Die Zahl (altes) T.bal stand vor der Rotation in T.left.right.bal, gab also den Balancefaktor von T 00 an. Überlege: Wie könnte es passieren, dass der alte Baum T 00 Balancefaktor 0 hat? Antwort: Wenn im rekursiven Aufruf T 00 genau aus dem neu erzeugten Knoten besteht. Wird ein mittlerer Teilbaum zu tief: Doppelrotation hebt beide mittleren Teile ein Level höher. Mit den rekursiven Aufrufen läuft die Rebalancierung von unten nach oben. Nach dem ersten Auftreten von Fall (4.4) oder (3.4) (d.h. einer Rotation) ist die Rebalancierung beendet. Dann bleibt higher = false bis zur Wurzel. Dann sind T100 und T200 leer, haben also beide Tiefe −1. FG KTuEA, TU Ilmenau AuD – 09.05.2005 62 FG KTuEA, TU Ilmenau AuD – 09.05.2005 63 Proposition Die rekursive Prozedur AVL insert führt die Wörterbuchoperation insert korrekt durch. D.h.: es entsteht wieder ein AVL-Baum. Die Prozedur hat Laufzeit O(log n) und führt höchstens eine Einfach- oder Doppelrotation durch. Folgerung (aus Algorithmus) Für jedes n ≥ 0 gibt es einen AVL-Baum mit n Knoten. (Man fügt 1, . . . , n mittels AVL_insert in einen anfangs leeren AVL-Baum ein.) Kurios: Wenn T ein höhenbalancierter Baum mit n Knoten ist, dann gibt es eine Einfügereihenfolge für 1, . . . , n, die genau diesen Baum erzeugt — sogar ohne Rotationen. FG KTuEA, TU Ilmenau AuD – 09.05.2005 64 AVL delete Effekt: Lösche wie bei gewöhnlichem BSB: Fälle, DeleteMin Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens ein Unterbaum fehlt. Wenn Balancebedingung nicht verletzt: fertig. Wenn Balancebedingung verletzt, laufe den Weg von u zur Wurzel, teste an jedem Knoten die Balancebedingung, führe gegebenenfalls eine Einfach- oder Doppelrotation aus. Achtung: Möglicherweise auf mehreren Levels nacheinander Rotation nötig. Beispiel: Fibonacci-Bäume“ ” FG KTuEA, TU Ilmenau AuD – 09.05.2005 65 AVL delete Tiefe 5 Eingabe: T: AVL tree, x: key 12 Knoten Ausgabe: T: AVL tree, shallower: boolean 1. Fall: T = NIL Tiefe 6 (∗ Erfolglose Suche, Schlüssel x nicht da! ∗) 20 Knoten Keine Rebalancierung nötig! return (T, false) Entfernen des höchsten Knotens in einem minimal großen AVL-Baum löst Rotationskaskade aus. FG KTuEA, TU Ilmenau AuD – 09.05.2005 66 FG KTuEA, TU Ilmenau AuD – 09.05.2005 67 Fall 2: T.key = x beide Unterbäume nicht leer 2. Fall: T.key = x und (T.left = NIL oder T.right = NIL) Entferne Wurzelknoten! x x kleiner war und ist AVLBaum y (T.right,y,s,right_shallower) <- AVL_deletemin(T.right) T.data <- s; T.key <- y; Rebalancierung_rechts; Falls T.left = NIL: T ← T.right Falls T.right = NIL: T ← T.left return (T, true) FG KTuEA, TU Ilmenau AuD – 09.05.2005 68 Fall 3: T.key > x FG KTuEA, TU Ilmenau AuD – 09.05.2005 In AVL deletemin: (T.left,left_shallower) <- AVL_delete(T.left,x) Rebalancierung_links; Fall A: T.left = NIL Fall 4: T.key < x (T.right,right_shallower) <- AVL_delete(T.right,x) Rebalancierung_rechts; FG KTuEA, TU Ilmenau 69 AuD – 09.05.2005 70 bleibt AVL-Baum FG KTuEA, TU Ilmenau AuD – 09.05.2005 Wurzel entfernen y <- T.key; s <- T.data; T <- T.right; Rückgabe von (T,y,s,true) 71 In AVL deletemin: Rebalancierung links: (Rebalancierung rechts geht symmetrisch) Fall B: T.left <> NIL: T: T1 T: T1 T2 umgebaut zu T2 Rückgabewerte: Neuer Baum und Boolean shallower“ ” (T.left,y,s,left_shallower) <- AVL_deletemin(T.left) Rebalancierung_links; Rückgabe von (T,y,s,shallower) FG KTuEA, TU Ilmenau AuD – 09.05.2005 Fall 72 Aktion FG KTuEA, TU Ilmenau AuD – 09.05.2005 Fall 1.Fall: left_shallower = false shallower <- false; 73 Aktion 3.Fall: left_shallower = true ∧ T.bal = 0 2. Fall: left_shallower = true ∧ T.bal = -1 shallower <-false; T.bal <- 1; geschrumpft shallower <- true; T.bal <- 0; geschrumpft FG KTuEA, TU Ilmenau AuD – 09.05.2005 74 FG KTuEA, TU Ilmenau AuD – 09.05.2005 75 Fall 4.Fall: left_shallower = true ∧ T.bal = 1 T1 Aktion Fall 4.1: T.right.bal =0; T T T.left T.right T1 T2 T1 T2 AuD – 09.05.2005 76 Fall 4.2: T.right.bal =1; FG KTuEA, TU Ilmenau AuD – 09.05.2005 77 T T1 T2 T2 T2 Fall 4.3: T.right.bal =-1; T T T1 T2 T <- right_rotate(T); T.left.bal <- 1; Rechtsrotation! T.bal <- -1; shallower <- false; Unterfälle je nach Aussehen von T2. T2 ist nicht leer! FG KTuEA, TU Ilmenau T2 T1 T2 T2 T3 T2 T <- left_rotate(T); T.left.bal <- 0; Linksrotation! T.bal <- 0; shallower <- true; FG KTuEA, TU Ilmenau AuD – 09.05.2005 78 FG KTuEA, TU Ilmenau AuD – 09.05.2005 79 Fall 4.3 (Forts.) Betrachte Teilbäume von T2 = T.right. altes T.bal −1 0 1 T T: T1 T3 T2 T1 T.left.bal T.right.bal T.bal 0 0 1 0 0 0 0 −1 0 T3 T2 Doppelrotation! T <- right_left_rotate(T); shallower <- true; Neue Werte: FG KTuEA, TU Ilmenau AuD – 09.05.2005 80 Proposition Die rekursive Prozedur AVL delete führt die Wörterbuchoperation delete korrekt durch. D.h.: es entsteht wieder ein AVL-Baum. Die Prozedur hat Laufzeit O(log n) und führt an jedem Knoten auf dem Weg von der Wurzel zum gelöschten Knoten höchstens eine Einfach- oder Doppelrotation durch. Satz In AVL-Bäumen kostet jede Wörterbuchoperation Zeit O(log n), wo n die Anzahl der Wörterbucheinträge ist. FG KTuEA, TU Ilmenau AuD – 09.05.2005 82 FG KTuEA, TU Ilmenau AuD – 09.05.2005 81