Algorithmen und Datenstrukturen 6. Vorlesung

Werbung
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
Herunterladen