Algorithmen und Datenstrukturen

Werbung
Algorithmen und Datenstrukturen
7. Vorlesung
Martin Dietzfelbinger
26. Mai 2008
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
AVL-Bäume
[Adelson-Velskii und Landis 1962]
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
1
AVL-Bäume
[Adelson-Velskii und Landis 1962]
Höhenbalancierte binäre Suchbäume
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
1
AVL-Bäume
[Adelson-Velskii und Landis 1962]
Höhenbalancierte binäre Suchbäume
T:
v
d1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
d
Tv ,1
Tv ,2
2
1
AVL-Bäume
[Adelson-Velskii und Landis 1962]
Höhenbalancierte binäre Suchbäume
T:
v
d1
d
Tv ,1
Tv ,2
2
d2 − d1 ∈ {−1, 0, 1}.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
1
Definition
Ein binärer Suchbaum T heißt AVL-Baum,
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
2
Definition
Ein binärer Suchbaum T heißt AVL-Baum,
falls in jedem Knoten v in T
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
2
Definition
Ein binärer Suchbaum T heißt AVL-Baum,
falls in jedem Knoten v in T
für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
2
Definition
Ein binärer Suchbaum T heißt AVL-Baum,
falls in jedem Knoten v in T
für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
2
Definition
Ein binärer Suchbaum T heißt AVL-Baum,
falls in jedem Knoten v in T
für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt:
d(Tv,2) − d(Tv,1)
|
{z
}
∈ {−1, 0, 1} .
Balancefaktor in v“
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
2
Definition
Ein binärer Suchbaum T heißt AVL-Baum,
falls in jedem Knoten v in T
für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt:
d(Tv,2) − d(Tv,1)
|
{z
}
∈ {−1, 0, 1} .
Balancefaktor in v“
”
Satz
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
2
Definition
Ein binärer Suchbaum T heißt AVL-Baum,
falls in jedem Knoten v in T
für den Teilbaum Tv = (Tv,1, v, Tv,2) mit Wurzel v gilt:
d(Tv,2) − d(Tv,1)
|
{z
}
∈ {−1, 0, 1} .
Balancefaktor in v“
”
Satz
Ist T ein höhenbalancierter Baum mit n Knoten, so gilt
d(T ) ≤ 1,4405 · log2 n.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
2
AVL-Bäume: höhenbalancierte binäre Suchbäume.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
3
AVL-Bäume: höhenbalancierte binäre Suchbäume.
Müssen noch zeigen:
Man kann die Wörterbuchoperationen so implementieren,
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
3
AVL-Bäume: höhenbalancierte binäre Suchbäume.
Müssen noch zeigen:
Man kann die Wörterbuchoperationen so implementieren,
dass die AVL-Eigenschaft erhalten bleibt,
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
3
AVL-Bäume: höhenbalancierte binäre Suchbäume.
Müssen noch zeigen:
Man kann die Wörterbuchoperationen so implementieren,
dass die AVL-Eigenschaft erhalten bleibt,
und der Zeitbedarf proportional zur Tiefe ist.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
3
AVL-Bäume: höhenbalancierte binäre Suchbäume.
Müssen noch zeigen:
Man kann die Wörterbuchoperationen so implementieren,
dass die AVL-Eigenschaft erhalten bleibt,
und der Zeitbedarf proportional zur Tiefe ist.
Knotenformat:
x : key
r : data
left bal: Z
FG KTuEA, TU Ilmenau
right
AuD – 26.05.2008
3
AVL-Bäume: höhenbalancierte binäre Suchbäume.
Müssen noch zeigen:
Man kann die Wörterbuchoperationen so implementieren,
dass die AVL-Eigenschaft erhalten bleibt,
und der Zeitbedarf proportional zur Tiefe ist.
Knotenformat:
x : key
r : data
left bal: Z
FG KTuEA, TU Ilmenau
right
AuD – 26.05.2008
x: key;
r: data;
bal: integer; (∗ Legal: {−1, 0, 1} ∗)
left, right: AVL Tree
(∗ Zeiger auf Baumknoten ∗)
3
Implementierung der Operationen
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
4
Implementierung der Operationen
AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem
BSB.)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
4
Implementierung der Operationen
AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem
BSB.)
AVL lookup: Wie bei gewöhnlichem BSB.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
4
Implementierung der Operationen
AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem
BSB.)
AVL lookup: Wie bei gewöhnlichem BSB.
Brauchen nur:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
4
Implementierung der Operationen
AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem
BSB.)
AVL lookup: Wie bei gewöhnlichem BSB.
Brauchen nur: AVL insert(T, x, r) und AVL delete(x).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
4
Implementierung der Operationen
AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem
BSB.)
AVL lookup: Wie bei gewöhnlichem BSB.
Brauchen nur: AVL insert(T, x, r) und AVL delete(x).
Grundansatz:
Führe Update-Operation aus wie bei gewöhnlichem BSB.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
4
Implementierung der Operationen
AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem
BSB.)
AVL lookup: Wie bei gewöhnlichem BSB.
Brauchen nur: AVL insert(T, x, r) und AVL delete(x).
Grundansatz:
Führe Update-Operation aus wie bei gewöhnlichem BSB.
Eventuell wird dadurch Bedingung Höhenbalancierung“
”
verletzt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
4
Implementierung der Operationen
AVL empty: Erzeuge NULL-Zeiger. (Wie bei gewöhnlichem
BSB.)
AVL lookup: Wie bei gewöhnlichem BSB.
Brauchen nur: AVL insert(T, x, r) und AVL delete(x).
Grundansatz:
Führe Update-Operation aus wie bei gewöhnlichem BSB.
Eventuell wird dadurch Bedingung Höhenbalancierung“
”
verletzt.
Reparatur“: Rebalancierung, erfolgt rekursiv.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
4
Rotationen: Hilfsoperationen
Rechtsrotation: kippe 1 Kante nach rechts“:
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
5
Rotationen: Hilfsoperationen
Rechtsrotation: kippe 1 Kante nach rechts“:
”
u
v
liefert:
v
u
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
5
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
6
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
Tv :
y
v
Tu ’:
1 x
u
3
u
1 x 2
2
T3
T1
FG KTuEA, TU Ilmenau
v
3
T1
T2
AuD – 26.05.2008
y
T3
T2
6
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
Tv :
y
v
Tu ’:
1 x
u
3
u
1 x 2
2
T3
T1
y
v
3
T1
T2
T3
T2
Beobachte: Tv binärer Suchbaum ⇒ Tu0 binärer Suchbaum.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
6
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
Tv :
y
v
Tu ’:
1 x
u
3
u
1 x 2
2
T3
T1
y
v
3
T1
T2
T3
T2
Beobachte: Tv binärer Suchbaum ⇒ Tu0 binärer Suchbaum.
Denn: Weil Tv binärer Suchbaum ist,
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
6
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
Tv :
y
v
Tu ’:
1 x
u
3
u
1 x 2
2
T3
T1
y
v
3
T1
T2
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 – 26.05.2008
6
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
Tv :
y
v
Tu ’:
1 x
u
3
u
1 x 2
2
T3
T1
y
v
3
T1
T2
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:
key(v1) < x < key(v2) < y < key(v3).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
6
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
Tv :
y
v
Tu ’:
1 x
u
3
u
1 x 2
2
T3
T1
y
v
3
T1
T2
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:
key(v1) < x < key(v2) < y < key(v3).
Also ist die Suchbaumeigenschaft auch in Tu0 erfüllt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
6
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
7
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
Tv :
y
v
Tu ’:
1 x
u
3
u
1 x 2
2
T3
T1
FG KTuEA, TU Ilmenau
v
3
T1
T2
AuD – 26.05.2008
y
T3
T2
7
Rotationen: Hilfsoperationen
Rechtsrotation: Mit Unterbäumen
Tv :
y
v
Tu ’:
1 x
u
3
u
1 x 2
2
T3
T1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
v
3
T1
T2
Beim Umbau ändert sich nur:
y
T3
T2
– rechtes Kind von u
– linkes Kind von v
7
Rechtsrotation als Programm:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
8
Rechtsrotation als Programm:
Prozedur rotateR(v : AVL Tree)
(1)
(∗ v 6= NULL, v.left 6= NULL ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
8
Rechtsrotation als Programm:
Prozedur rotateR(v : AVL Tree)
(1)
(∗ v 6= NULL, v.left 6= NULL ∗)
(2) u : AVL Tree ; (∗ Hilfsvariable ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
8
Rechtsrotation als Programm:
Prozedur rotateR(v : AVL Tree)
(1)
(∗ v 6= NULL, v.left 6= NULL ∗)
(2) u : AVL Tree ; (∗ Hilfsvariable ∗)
(3) u ← v.left ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
8
Rechtsrotation als Programm:
Prozedur rotateR(v : AVL Tree)
(1)
(∗ v 6= NULL, v.left 6= NULL ∗)
(2) u : AVL Tree ; (∗ Hilfsvariable ∗)
(3) u ← v.left ;
(4) v.left ← u.right ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
8
Rechtsrotation als Programm:
Prozedur rotateR(v : AVL Tree)
(1)
(∗ v 6= NULL, v.left 6= NULL ∗)
(2) u : AVL Tree ; (∗ Hilfsvariable ∗)
(3) u ← v.left ;
(4) v.left ← u.right ;
(5) u.right ← v ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
8
Rechtsrotation als Programm:
Prozedur rotateR(v : AVL Tree)
(1)
(∗ v 6= NULL, v.left 6= NULL ∗)
(2) u : AVL Tree ; (∗ Hilfsvariable ∗)
(3) u ← v.left ;
(4) v.left ← u.right ;
(5) u.right ← v ;
(6) return u .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
8
Rechtsrotation als Programm:
Prozedur rotateR(v : AVL Tree)
(1)
(∗ v 6= NULL, v.left 6= NULL ∗)
(2) u : AVL Tree ; (∗ Hilfsvariable ∗)
(3) u ← v.left ;
(4) v.left ← u.right ;
(5) u.right ← v ;
(6) return u .
Achtung: Balancefaktoren in den zwei beteiligten Knoten sind
nun inkorrekt!
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
8
Linksrotation: Umkehrung von Rechtsrotation
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
9
Linksrotation: Umkehrung von Rechtsrotation,
Implementierung analog.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
9
Linksrotation: Umkehrung von Rechtsrotation,
Implementierung analog.
x
y
y
T1
x
T2
T2
T3
T3
T1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
9
Linksrotation: Umkehrung von Rechtsrotation,
Implementierung analog.
x
y
y
T1
x
T2
T2
T3
T3
T1
In den folgenden Beispielen:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
9
Linksrotation: Umkehrung von Rechtsrotation,
Implementierung analog.
x
y
y
T1
x
T2
T2
T3
T3
T1
In den folgenden Beispielen:
Nummern bezeichnen Anschlussstellen für die drei Unterbäume.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
9
v c
u
1 b
rotateR
3
d
2
u
1 b
a
2
rotateL
a
d
v
c 3
rotateR
1 a
u
u
d
a
1 2
2
rotateL
b
v
c
d
u
d
3
u
1 b
rotateR
v
a
b 2
1
a
3
b
v
FG KTuEA, TU Ilmenau
v
c 3
c
AuD – 26.05.2008
rotateL
2
d
3
c
10
Doppelrotationen: Links-Rechts, Rechts-Links
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
11
Doppelrotationen: Links-Rechts, Rechts-Links
Beispiel: Links-Rechts-Doppelrotation
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
11
Doppelrotationen: Links-Rechts, Rechts-Links
Beispiel: Links-Rechts-Doppelrotation
z v
z
u
x
w
y
w
y
FG KTuEA, TU Ilmenau
links
an
u
u
x
AuD – 26.05.2008
v
rechts
an
v
y
u
x
w
v
z
11
Doppelrotationen: Links-Rechts, Rechts-Links
Beispiel: Links-Rechts-Doppelrotation
z v
z
u
x
w
y
w
y
links
an
u
u
x
v
rechts
an
v
y
u
x
w
v
z
Anzuwenden auf Zick-Zack-Weg aus zwei Kanten,
Form links-rechts“.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
11
Links-Rechts-Doppelrotation: Mit Unterbäumen
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
12
Links-Rechts-Doppelrotation: Mit Unterbäumen
v
z
4
y
u
x
1
w
y
3
2
u
1 x
T1
T1
T2
FG KTuEA, TU Ilmenau
v
z
2
T4
w
T2
3
4
T3
T4
T3
AuD – 26.05.2008
12
Links-Rechts-Doppelrotation: Mit Unterbäumen
v
z
4
y
u
x
1
w
y
3
2
u
1 x
T1
T1
T2
v
z
2
T4
w
T2
3
4
T3
T4
T3
Gesamteffekt: Der unterste Knoten w des Zick-Zack-Wegs
( links-rechts“) wandert nach oben, wird Wurzel;
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
12
Links-Rechts-Doppelrotation: Mit Unterbäumen
v
z
4
y
u
x
1
w
y
3
2
u
1 x
T1
T1
T2
v
z
2
T4
w
T2
3
4
T3
T4
T3
Gesamteffekt: Der unterste Knoten w des Zick-Zack-Wegs
( links-rechts“) wandert nach oben, wird Wurzel; die beiden
”
anderen Knoten u und v werden linkes und rechtes Kind.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
12
LR-Doppelrotation als Programm
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
(4) u ← v.left ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
(4) u ← v.left ;
(5) w ← u.right ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
(4) u ← v.left ;
(5) w ← u.right ;
(6) u.right ← w.left ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
(4) u ← v.left ;
(5) w ← u.right ;
(6) u.right ← w.left ;
(7) v.left ← w.right ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
(4) u ← v.left ;
(5) w ← u.right ;
(6) u.right ← w.left ;
(7) v.left ← w.right ;
(8) w.left ← u ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
(4) u ← v.left ;
(5) w ← u.right ;
(6) u.right ← w.left ;
(7) v.left ← w.right ;
(8) w.left ← u ;
(9) w.right ← v ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
(4) u ← v.left ;
(5) w ← u.right ;
(6) u.right ← w.left ;
(7) v.left ← w.right ;
(8) w.left ← u ;
(9) w.right ← v ;
(10) return w .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
LR-Doppelrotation als Programm
Prozedur rotateLR(v : AVL Tree)
(1) (∗ Eingabe: v 6= NULL
(2)
v.left 6= NULL, v.left.right 6= NULL ∗)
(3) u, w : AVL Tree ;
(4) u ← v.left ;
(5) w ← u.right ;
(6) u.right ← w.left ;
(7) v.left ← w.right ;
(8) w.left ← u ;
(9) w.right ← v ;
(10) return w .
Achtung: Balancefaktoren in den drei beteiligten Knoten sind
nun inkorrekt!
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
13
Rechts-Links-Doppelrotation:
Symmetrisch zu Links-Rechts-Doppelrotation
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
14
Rechts-Links-Doppelrotation:
Symmetrisch zu Links-Rechts-Doppelrotation
v
1
x
y
u
z
w
y
T1
2
w
u
v
4
1
z
x
2
3
4
3
T4
T2
FG KTuEA, TU Ilmenau
T3
AuD – 26.05.2008
T1
T2
T3
T4
14
Beispiel:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
15
Beispiel:
1 D
links
A
P
2
B
links−
rechts
P
F
S
D
3
S
4
F
A
R
T
A
T
S
1 B 2
1
R
P 3
D
T
R
B
2
3
F
rechts
D
B
1
A
rechts−
links
P
B
AuD – 26.05.2008
P 4
S
F
2
R
FG KTuEA, TU Ilmenau
A
T
D
S
3
F
R
T
15
AVL insert(T,x,r)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
16
AVL insert(T,x,r)
Gesamteffekt:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
16
AVL insert(T,x,r)
Gesamteffekt:
Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
16
AVL insert(T,x,r)
Gesamteffekt:
Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten.
Wenn Balancebedingung nirgendwo verletzt: fertig.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
16
AVL insert(T,x,r)
Gesamteffekt:
Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten.
Wenn Balancebedingung nirgendwo verletzt: fertig.
Wenn Balancebedingung irgendwo verletzt, gibt es auf dem
Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v,
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
16
AVL insert(T,x,r)
Gesamteffekt:
Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten.
Wenn Balancebedingung nirgendwo verletzt: fertig.
Wenn Balancebedingung irgendwo verletzt, gibt es auf dem
Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v,
an dem die Balancebedingung nicht erfüllt ist.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
16
AVL insert(T,x,r)
Gesamteffekt:
Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten.
Wenn Balancebedingung nirgendwo verletzt: fertig.
Wenn Balancebedingung irgendwo verletzt, gibt es auf dem
Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v,
an dem die Balancebedingung nicht erfüllt ist.
An v wird eine Einfach- oder Doppelrotation ausgeführt
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
16
AVL insert(T,x,r)
Gesamteffekt:
Füge ein wie bei gewöhnlichem BSB: erzeugt neuen Knoten.
Wenn Balancebedingung nirgendwo verletzt: fertig.
Wenn Balancebedingung irgendwo verletzt, gibt es auf dem
Weg vom neuen Knoten zur Wurzel einen tiefsten Knoten v,
an dem die Balancebedingung nicht erfüllt ist.
An v wird eine Einfach- oder Doppelrotation ausgeführt
und dadurch die Balancebedingung wieder hergestellt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
16
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.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
17
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.
1
links
3
1
3
9 links
11
9
11 12
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
11
1
12
9
12
1 3 9
rechts−links
3
10
9 10
17
rechts−
links
3
11
1
12
9
9
links−
rechts
3
11
10
12
10
1
2
2
9
9
2 links
4
1
3
7
FG KTuEA, TU Ilmenau
11
10
11
2
12
1
6
rechts−
links
10
3
12
6
7
AuD – 26.05.2008
6 4
4
18
rechts
9
2 links
11
4
1
3
10
9
11
4
12
2
6
1
7
6
3
12
10
7
0
0
4
2
1
0
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
9
3
11
6
7
10
12
19
Etwas knifflig: Rekursive Programmierung des Ablaufs.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
20
Etwas knifflig: Rekursive Programmierung des Ablaufs.
Kann/will nicht verwenden: Globale Sicht“, Vergleichen von
”
Tiefen durch Hinschauen“.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
20
Etwas knifflig: Rekursive Programmierung des Ablaufs.
Kann/will nicht verwenden: Globale Sicht“, Vergleichen von
”
Tiefen durch Hinschauen“.
”
Benutzt werden:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
20
Etwas knifflig: Rekursive Programmierung des Ablaufs.
Kann/will nicht verwenden: Globale Sicht“, Vergleichen von
”
Tiefen durch Hinschauen“.
”
Benutzt werden:
• Balancefaktoren T.bal in den Knoten,
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
20
Etwas knifflig: Rekursive Programmierung des Ablaufs.
Kann/will nicht verwenden: Globale Sicht“, Vergleichen von
”
Tiefen durch Hinschauen“.
”
Benutzt werden:
• Balancefaktoren T.bal in den Knoten,
• Flagbit deeper“, das als Resultat eines rekursiven Aufrufs
”
mitteilt, ob der bearbeitete Unterbaum tiefer geworden ist.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
20
Etwas knifflig: Rekursive Programmierung des Ablaufs.
Kann/will nicht verwenden: Globale Sicht“, Vergleichen von
”
Tiefen durch Hinschauen“.
”
Benutzt werden:
• Balancefaktoren T.bal in den Knoten,
• Flagbit deeper“, das als Resultat eines rekursiven Aufrufs
”
mitteilt, ob der bearbeitete Unterbaum tiefer geworden ist.
Steuerung einer großen Fallunterscheidung durch alte Balancefaktoren und deeper“-Meldungen aus rekursivem Aufruf.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
20
Prozedur AVL insert(T,x,r)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
(3)
1. Fall: T = NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
(3)
1. Fall: T = NULL (∗ Neuer Knoten! ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
1. Fall: T = NULL (∗ Neuer Knoten! ∗)
(4)
T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗)
(3)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
1. Fall: T = NULL (∗ Neuer Knoten! ∗)
(4)
T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗)
(5)
T.key ← x ;
(3)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
1. Fall: T = NULL (∗ Neuer Knoten! ∗)
(4)
T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗)
(5)
T.key ← x ;
(6)
T.data ← r ;
(3)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
(3)
(4)
(5)
(6)
(7)
1. Fall: T = NULL (∗ Neuer Knoten! ∗)
T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗)
T.key ← x ;
T.data ← r ;
T.left ← NULL ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
(3)
(4)
(5)
(6)
(7)
(8)
1. Fall: T = NULL (∗ Neuer Knoten! ∗)
T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗)
T.key ← x ;
T.data ← r ;
T.left ← NULL ;
T.right ← NULL;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
1. Fall: T = NULL (∗ Neuer Knoten! ∗)
T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗)
T.key ← x ;
T.data ← r ;
T.left ← NULL ;
T.right ← NULL;
T.bal ← 0 ;
return (T, true) .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
Prozedur AVL insert(T,x,r)
(1) (∗ Eingabe: T: AVL Tree, x: key, r: data ∗)
(2) (∗ Ausgabe: T: AVL Tree, deeper: boolean ∗)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
1. Fall: T = NULL (∗ Neuer Knoten! ∗)
T: new AVL Tree (∗ Erzeuge neuen AVL-Baum-Knoten ∗)
T.key ← x ;
T.data ← r ;
T.left ← NULL ;
T.right ← NULL;
T.bal ← 0 ;
return (T, true) .
(∗ Baumhöhe hat sich von −1 auf 0 erhöht. ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
21
(12) 2. Fall: T 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(∗ Update-Situation! ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(∗ Update-Situation! ∗)
T.data ← r ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(∗ Update-Situation! ∗)
T.data ← r ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(16)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
(∗ Baumstruktur nicht verändert. ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(16)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
(∗ Baumstruktur nicht verändert. ∗)
(17) 3. Fall: T 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(16)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
(∗ Baumstruktur nicht verändert. ∗)
(17) 3. Fall: T 6= NULL and x < T.key.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(16)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
(∗ Baumstruktur nicht verändert. ∗)
(17) 3. Fall: T 6= NULL and x < T.key.
(18)
(T.left, left deeper) ← AVL insert(T.left, x, r) ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(16)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
(∗ Baumstruktur nicht verändert. ∗)
(17) 3. Fall: T 6= NULL and x < T.key.
(18)
(19)
(T.left, left deeper) ← AVL insert(T.left, x, r) ;
(∗ Rekursives Einfügen in linken Unterbaum ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(16)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
(∗ Baumstruktur nicht verändert. ∗)
(17) 3. Fall: T 6= NULL and x < T.key.
(18)
(19)
(20)
(T.left, left deeper) ← AVL insert(T.left, x, r) ;
(∗ Rekursives Einfügen in linken Unterbaum ∗)
(T, deeper) ← RebalanceInsLeft(T,left deeper) ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(16)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
(∗ Baumstruktur nicht verändert. ∗)
(17) 3. Fall: T 6= NULL and x < T.key.
(18)
(19)
(20)
(21)
(T.left, left deeper) ← AVL insert(T.left, x, r) ;
(∗ Rekursives Einfügen in linken Unterbaum ∗)
(T, deeper) ← RebalanceInsLeft(T,left deeper) ;
(∗ Rebalancierung in der Wurzel von T, s. unten ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(12) 2. Fall: T 6= NULL and T.key = x.
(13)
(14)
(15)
(16)
(∗ Update-Situation! ∗)
T.data ← r ;
return (T, false) .
(∗ Baumstruktur nicht verändert. ∗)
(17) 3. Fall: T 6= NULL and x < T.key.
(18)
(19)
(20)
(21)
(22)
(T.left, left deeper) ← AVL insert(T.left, x, r) ;
(∗ Rekursives Einfügen in linken Unterbaum ∗)
(T, deeper) ← RebalanceInsLeft(T,left deeper) ;
(∗ Rebalancierung in der Wurzel von T, s. unten ∗)
return (T, deeper) .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
22
(23) 4. Fall: T 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
23
(23) 4. Fall: T 6= NULL and T.key < x.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
23
(23) 4. Fall: T 6= NULL and T.key < x.
(24)
(T.right, right deeper) ← AVL insert(T.right, x, r) ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
23
(23) 4. Fall: T 6= NULL and T.key < x.
(24)
(25)
(T.right, right deeper) ← AVL insert(T.right, x, r) ;
(∗ Rekursives Einfügen in rechten Unterbaum ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
23
(23) 4. Fall: T 6= NULL and T.key < x.
(24)
(25)
(26)
(T.right, right deeper) ← AVL insert(T.right, x, r) ;
(∗ Rekursives Einfügen in rechten Unterbaum ∗)
(T, deeper) ← RebalanceInsRight(T,right deeper) ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
23
(23) 4. Fall: T 6= NULL and T.key < x.
(24)
(25)
(26)
(27)
(T.right, right deeper) ← AVL insert(T.right, x, r) ;
(∗ Rekursives Einfügen in rechten Unterbaum ∗)
(T, deeper) ← RebalanceInsRight(T,right deeper) ;
(∗ Rebalancierung in der Wurzel von T,
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
23
(23) 4. Fall: T 6= NULL and T.key < x.
(24)
(25)
(26)
(27)
(T.right, right deeper) ← AVL insert(T.right, x, r) ;
(∗ Rekursives Einfügen in rechten Unterbaum ∗)
(T, deeper) ← RebalanceInsRight(T,right deeper) ;
(∗ Rebalancierung in der Wurzel von T,
symmetrisch zum 3. Fall. ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
23
(23) 4. Fall: T 6= NULL and T.key < x.
(24)
(25)
(26)
(27)
(28)
(T.right, right deeper) ← AVL insert(T.right, x, r) ;
(∗ Rekursives Einfügen in rechten Unterbaum ∗)
(T, deeper) ← RebalanceInsRight(T,right deeper) ;
(∗ Rebalancierung in der Wurzel von T,
symmetrisch zum 3. Fall. ∗)
return (T, deeper) .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
23
Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
24
Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden.
Ergebnis: Unterbaum T.left geändert,
Flagbit left deeper bedeutet:
left deeper = false: T.left hat gleiche Höhe wie vorher;
left deeper = true: T.left ist um 1 Ebene tiefer geworden.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
24
Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden.
Ergebnis: Unterbaum T.left geändert,
Flagbit left deeper bedeutet:
left deeper = false: T.left hat gleiche Höhe wie vorher;
left deeper = true: T.left ist um 1 Ebene tiefer geworden.
Invariante:
(Beweis durch Induktion über rekursive Aufrufe/Größe von
Bäumen):
T.left ist AVL-Baum (mit korrekten Balancefaktoren).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
24
Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden.
Ergebnis: Unterbaum T.left geändert,
Flagbit left deeper bedeutet:
left deeper = false: T.left hat gleiche Höhe wie vorher;
left deeper = true: T.left ist um 1 Ebene tiefer geworden.
Invariante:
(Beweis durch Induktion über rekursive Aufrufe/Größe von
Bäumen):
T.left ist AVL-Baum (mit korrekten Balancefaktoren).
Probleme:
FG KTuEA, TU Ilmenau
? Balancebedingung in Wurzel von T erfüllt?
AuD – 26.05.2008
24
Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden.
Ergebnis: Unterbaum T.left geändert,
Flagbit left deeper bedeutet:
left deeper = false: T.left hat gleiche Höhe wie vorher;
left deeper = true: T.left ist um 1 Ebene tiefer geworden.
Invariante:
(Beweis durch Induktion über rekursive Aufrufe/Größe von
Bäumen):
T.left ist AVL-Baum (mit korrekten Balancefaktoren).
Probleme:
FG KTuEA, TU Ilmenau
? Balancebedingung in Wurzel von T erfüllt?
? Balancefaktor in Wurzel von T korrekt?
AuD – 26.05.2008
24
Zeile (18): AVL insert rekursiv auf T.left, x, r anwenden.
Ergebnis: Unterbaum T.left geändert,
Flagbit left deeper bedeutet:
left deeper = false: T.left hat gleiche Höhe wie vorher;
left deeper = true: T.left ist um 1 Ebene tiefer geworden.
Invariante:
(Beweis durch Induktion über rekursive Aufrufe/Größe von
Bäumen):
T.left ist AVL-Baum (mit korrekten Balancefaktoren).
Probleme:
? Balancebedingung in Wurzel von T erfüllt?
? Balancefaktor in Wurzel von T korrekt?
Zeile (20): RebalanceInsLeft prüft und korrigiert;
Ergebnis: Neuer Baum T und Flagbit deeper.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
24
RebalanceInsLeft(T,left deeper)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
25
RebalanceInsLeft(T,left deeper)
Fall RebIL-1
Aktion:
left deeper = false
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
25
RebalanceInsLeft(T,left deeper)
Fall RebIL-1
Aktion:
left deeper = false
T:
neu aber
gleiche
Höhe
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
25
RebalanceInsLeft(T,left deeper)
Fall RebIL-1
Aktion:
left deeper = false
deeper ← false ;
(∗ T.bal stimmt noch ∗)
T:
neu aber
gleiche
Höhe
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
25
RebalanceInsLeft(T,left deeper)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
26
RebalanceInsLeft(T,left deeper)
Fall RebIL-2
Aktion:
left deeper = true ∧
T.bal = 0 (∗ alter Wert! ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
26
RebalanceInsLeft(T,left deeper)
Fall RebIL-2
Aktion:
left deeper = true ∧
T.bal = 0 (∗ alter Wert! ∗)
T:
neu:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
26
RebalanceInsLeft(T,left deeper)
Fall RebIL-2
Aktion:
left deeper = true ∧
T.bal = 0 (∗ alter Wert! ∗)
deeper ← true ;
T.bal ← −1;
T:
neu:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
26
RebalanceInsLeft(T,left deeper)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
27
RebalanceInsLeft(T,left deeper)
Fall RebIL-3
Aktion:
left deeper = true ∧
T.bal = 1 (∗ alter Wert! ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
27
RebalanceInsLeft(T,left deeper)
Fall RebIL-3
Aktion:
left deeper = true ∧
T.bal = 1 (∗ alter Wert! ∗)
T:
neu:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
27
RebalanceInsLeft(T,left deeper)
Fall RebIL-3
Aktion:
left deeper = true ∧
T.bal = 1 (∗ alter Wert! ∗)
deeper ← false ;
T.bal ← 0 ;
T:
neu:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
27
RebalanceInsLeft(T,left deeper)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
28
RebalanceInsLeft(T,left deeper)
Fall RebIL-4
Aktion:
left deeper = true ∧
T.bal = −1 (∗ alter Wert! ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
28
RebalanceInsLeft(T,left deeper)
Fall RebIL-4
Aktion:
left deeper = true ∧
T.bal = −1 (∗ alter Wert! ∗)
T:
0
T:
1
T:
2
neu:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
28
RebalanceInsLeft(T,left deeper)
Fall RebIL-4
Aktion:
left deeper = true ∧
T.bal = −1 (∗ alter Wert! ∗)
???
T:
0
T:
1
T:
2
neu:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
28
Schon vor dem rekursiven Aufruf von AVL insert war der
linke Unterbaum T1 von T nicht der leere Baum.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
29
Schon vor dem rekursiven Aufruf von AVL insert war der
linke Unterbaum T1 von T nicht der leere Baum.
Wir werden sehen:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
29
Schon vor dem rekursiven Aufruf von AVL insert war der
linke Unterbaum T1 von T nicht der leere Baum.
Wir werden sehen:
Fall RebIL-4 liefert stets deeper = false, analog RebIR-4.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
29
Schon vor dem rekursiven Aufruf von AVL insert war der
linke Unterbaum T1 von T nicht der leere Baum.
Wir werden sehen:
Fall RebIL-4 liefert stets deeper = false, analog RebIR-4.
Schon gesehen: RebIL-1, RebIL-3 liefert deeper = false;
analog liefern RebIR-1, RebIR-3 deeper = false.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
29
Schon vor dem rekursiven Aufruf von AVL insert war der
linke Unterbaum T1 von T nicht der leere Baum.
Wir werden sehen:
Fall RebIL-4 liefert stets deeper = false, analog RebIR-4.
Schon gesehen: RebIL-1, RebIL-3 liefert deeper = false;
analog liefern RebIR-1, RebIR-3 deeper = false.
⇒ beim rekursiven Aufruf der Rebalancierung für T.left
ist Fall RebIL-2 oder der symmetrische Fall RebIR-2
eingetreten.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
29
Schon vor dem rekursiven Aufruf von AVL insert war der
linke Unterbaum T1 von T nicht der leere Baum.
Wir werden sehen:
Fall RebIL-4 liefert stets deeper = false, analog RebIR-4.
Schon gesehen: RebIL-1, RebIL-3 liefert deeper = false;
analog liefern RebIR-1, RebIR-3 deeper = false.
⇒ beim rekursiven Aufruf der Rebalancierung für T.left
ist Fall RebIL-2 oder der symmetrische Fall RebIR-2
eingetreten.
⇒ Balancefaktor T.left.bal in T1 ist −1 oder 1.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
29
Unterfall RebIL-1.1
Aktion:
T.left.bal = − 1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
30
Unterfall RebIL-1.1
Aktion:
T.left.bal = − 1
Rechtsrotation
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
30
Unterfall RebIL-1.1
Aktion:
T.left.bal = − 1
Rechtsrotation
T:
T 1:
u
T1,1
T1,2
T:
v
u
v
T2
T1,1
T1,2
T2
neu
neu
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
30
Unterfall RebIL-1.1
Aktion:
T.left.bal = − 1
Rechtsrotation
T:
T 1:
u
T1,1
T1,2
T:
v
u
v
T2
T1,1
T1,2
T2
neu
neu
T ← rotateR(T) ;
deeper ← false ;
T.bal ← 0 ;
T.right.bal ← 0 ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
30
Unterfall RebIL-1.2
Aktion:
T.left.bal = 1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
31
Unterfall RebIL-1.2
Aktion:
T.left.bal = 1
Links-RechtsDoppelrotation
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
31
Unterfall RebIL-1.2
Aktion:
T.left.bal = 1
Links-RechtsDoppelrotation
T:
w
T:
u
T 1:
w
u
T1,2:
v
T2
T 1,1
T’
FG KTuEA, TU Ilmenau
v
T 1,1
T
2
T’
T’’
T’’
AuD – 26.05.2008
31
Unterfall RebIL-1.2
Aktion:
T.left.bal = 1
Links-RechtsDoppelrotation
T:
v
w
T:
u
T 1:
w
u
T1,2:
v
T2
T 1,1
T’
T 1,1
T
2
T’
T’’
T’’
T ← rotateLR(T) ;
deeper ← false ;
Neue bal-Werte: s. Tabelle.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
31
Neue Werte:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
32
Neue Werte:
altes
T.bal
−1
0
1
FG KTuEA, TU Ilmenau
neues
T.left.bal
0
0
−1
AuD – 26.05.2008
T.right.bal T.bal
1
0
0
0
0
0
32
Neue Werte:
altes
T.bal
−1
0
1
neues
T.left.bal
0
0
−1
T.right.bal T.bal
1
0
0
0
0
0
Die Zahl (altes) T.bal stand vor der LR-Rotation in
T.left.right.bal, gab also den Balancefaktor des alten
Unterbaums T1,2 = T.left.right an.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
32
Neue Werte:
altes
T.bal
−1
0
1
neues
T.left.bal
0
0
−1
T.right.bal T.bal
1
0
0
0
0
0
Die Zahl (altes) T.bal stand vor der LR-Rotation in
T.left.right.bal, gab also den Balancefaktor des alten
Unterbaums T1,2 = T.left.right an.
Überlege: Kann es überhaupt passieren, dass der alte Baum T1,2 Balancefaktor 0 hat?
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
32
Neue Werte:
altes
T.bal
−1
0
1
neues
T.left.bal
0
0
−1
T.right.bal T.bal
1
0
0
0
0
0
Die Zahl (altes) T.bal stand vor der LR-Rotation in
T.left.right.bal, gab also den Balancefaktor des alten
Unterbaums T1,2 = T.left.right an.
Überlege: Kann es überhaupt passieren, dass der alte Baum T1,2 Balancefaktor 0 hat? – Antwort: Im rekursiven Aufruf AVL insert(T.left,x,r)
bestand T.left nur aus einem Knoten, T1,2 ist der neu eingefügte Knoten;
T 0, T 00 und T1,1 sind leer, haben also alle Tiefe −1.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
32
Faustregel für RebalanceInsLeft und RebalanceInsRight:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
33
Faustregel für RebalanceInsLeft und RebalanceInsRight:
Wenn ein äußerer Teilbaum zu tief wird:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
33
Faustregel für RebalanceInsLeft und RebalanceInsRight:
Wenn ein äußerer Teilbaum zu tief wird:
Eine einfache Rotation
hebt diesen Teilbaum ein Level höher.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
33
Faustregel für RebalanceInsLeft und RebalanceInsRight:
Wenn ein äußerer Teilbaum zu tief wird:
Eine einfache Rotation
hebt diesen Teilbaum ein Level höher.
Wenn ein mittlerer Teilbaum zu tief wird:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
33
Faustregel für RebalanceInsLeft und RebalanceInsRight:
Wenn ein äußerer Teilbaum zu tief wird:
Eine einfache Rotation
hebt diesen Teilbaum ein Level höher.
Wenn ein mittlerer Teilbaum zu tief wird:
Eine Doppelrotation
hebt den mittleren Teilbaum ein Level höher.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
33
Faustregel für RebalanceInsLeft und RebalanceInsRight:
Wenn ein äußerer Teilbaum zu tief wird:
Eine einfache Rotation
hebt diesen Teilbaum ein Level höher.
Wenn ein mittlerer Teilbaum zu tief wird:
Eine Doppelrotation
hebt den mittleren Teilbaum ein Level höher.
Mit den rekursiven Aufrufen läuft die Rebalancierung von
unten nach oben.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
33
Faustregel für RebalanceInsLeft und RebalanceInsRight:
Wenn ein äußerer Teilbaum zu tief wird:
Eine einfache Rotation
hebt diesen Teilbaum ein Level höher.
Wenn ein mittlerer Teilbaum zu tief wird:
Eine Doppelrotation
hebt den mittleren Teilbaum ein Level höher.
Mit den rekursiven Aufrufen läuft die Rebalancierung von
unten nach oben.
Nach dem ersten Auftreten von Fall RebIL-4 oder RebIR-4
(d. h. einer Rotation) ist die Rebalancierung beendet.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
33
Faustregel für RebalanceInsLeft und RebalanceInsRight:
Wenn ein äußerer Teilbaum zu tief wird:
Eine einfache Rotation
hebt diesen Teilbaum ein Level höher.
Wenn ein mittlerer Teilbaum zu tief wird:
Eine Doppelrotation
hebt den mittleren Teilbaum ein Level höher.
Mit den rekursiven Aufrufen läuft die Rebalancierung von
unten nach oben.
Nach dem ersten Auftreten von Fall RebIL-4 oder RebIR-4
(d. h. einer Rotation) ist die Rebalancierung beendet.
Dann bleibt deeper = false bis zur Wurzel.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
33
Proposition
Die rekursive Prozedur AVL insert(T, x, r) führt die Wörterbuchoperation insert korrekt durch.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
34
Proposition
Die rekursive Prozedur AVL insert(T, x, r) führt die Wörterbuchoperation insert korrekt durch.
D. h.: Aus T entsteht ein AVL-Baum für insert(fT , x, r).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
34
Proposition
Die rekursive Prozedur AVL insert(T, x, r) führt die Wörterbuchoperation insert korrekt durch.
D. h.: Aus T entsteht ein AVL-Baum für insert(fT , x, r).
Die Prozedur hat Laufzeit O(log n) und führt höchstens eine
Einfach- oder Doppelrotation durch.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
34
Folgerung (aus Algorithmus AVL insert):
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
35
Folgerung (aus Algorithmus AVL insert):
Für jedes n ≥ 0 gibt es einen höhenbalancierten Baum mit n
Knoten.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
35
Folgerung (aus Algorithmus AVL insert):
Für jedes n ≥ 0 gibt es einen höhenbalancierten Baum mit n
Knoten.
(Beweis: Man fügt 1, . . . , n mittels AVL insert in einen anfangs leeren AVL-Baum ein. Übung: Durchführen für n = 16.)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
35
Folgerung (aus Algorithmus AVL insert):
Für jedes n ≥ 0 gibt es einen höhenbalancierten Baum mit n
Knoten.
(Beweis: Man fügt 1, . . . , n mittels AVL insert in einen anfangs leeren AVL-Baum ein. Übung: Durchführen für n = 16.)
Umgekehrt gilt: 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 jede Rotation
(Übung).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
35
AVL delete
Lösche wie bei gewöhnlichem BSB:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
36
AVL delete
Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
36
AVL delete
Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin
Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens
ein Unterbaum fehlt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
36
AVL delete
Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin
Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens
ein Unterbaum fehlt.
Wenn Balancebedingung nirgendwo verletzt ist: fertig.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
36
AVL delete
Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin
Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens
ein Unterbaum fehlt.
Wenn Balancebedingung nirgendwo verletzt ist: fertig.
Wenn Balancebedingung verletzt, laufe den Weg von u zur
Wurzel,
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
36
AVL delete
Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin
Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens
ein Unterbaum fehlt.
Wenn Balancebedingung nirgendwo verletzt ist: fertig.
Wenn Balancebedingung verletzt, laufe den Weg von u zur
Wurzel, teste an jedem Knoten die Balancebedingung, führe
gegebenenfalls eine Einfach- oder eine Doppelrotation aus:
RebalanceDelLeft, RebalanceDelRight.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
36
AVL delete
Lösche wie bei gewöhnlichem BSB: Fälle, ExtractMin
Zentraler Effekt: Ein Knoten u wird entfernt, dem mindestens
ein Unterbaum fehlt.
Wenn Balancebedingung nirgendwo verletzt ist: fertig.
Wenn Balancebedingung verletzt, laufe den Weg von u zur
Wurzel, teste an jedem Knoten die Balancebedingung, führe
gegebenenfalls eine Einfach- oder eine Doppelrotation aus:
RebalanceDelLeft, RebalanceDelRight.
Steuerung einer Fallunterscheidung durch shallower-Flagbit.
Achtung: Möglicherweise auf mehreren Levels nacheinander
Rotation nötig. – Beispiel: Fibonacci-Bäume“
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
36
−1
0
0
1
1
2
2
4
3
7
Fibonacci-Bäume der Tiefe −1, 0, 1, 2, 3
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
37
4
12 Knoten
20 Knoten
5
Fibonacci-Bäume der Tiefe 4, 5
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
37
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
links−links
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
links−links
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
links−links
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
links−links
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
links−links
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
links−links
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
Entfernen eines bestimmten Blattes in einem Fibonacci-Baum
löst Rotationskaskade aus.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
38
Prozedur AVL delete(T,x)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
(3)
1. Fall: T = NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
(3)
1. Fall: T = NULL (∗ x nicht da ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(3)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(5)
(∗ Keine Rebalancierung nötig! ∗)
(3)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(5)
(∗ Keine Rebalancierung nötig! ∗)
(3)
(6)
2. Fall: T 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(5)
(∗ Keine Rebalancierung nötig! ∗)
(3)
(6)
2. Fall: T 6= NULL and x < T.key.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(5)
(∗ Keine Rebalancierung nötig! ∗)
(3)
2. Fall: T 6= NULL and x < T.key.
(7)
(T.left, left shallower) ← AVL delete(T.left, x);
(6)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(5)
(∗ Keine Rebalancierung nötig! ∗)
(3)
2. Fall: T 6= NULL and x < T.key.
(7)
(T.left, left shallower) ← AVL delete(T.left, x);
(8)
(∗ Rekursives Löschen im linken Unterbaum ∗)
(6)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(5)
(∗ Keine Rebalancierung nötig! ∗)
(3)
2. Fall: T 6= NULL and x < T.key.
(7)
(T.left, left shallower) ← AVL delete(T.left, x);
(8)
(∗ Rekursives Löschen im linken Unterbaum ∗)
(9)
(T, shallower) ← RebalanceDelLeft(T,left shallower);
(6)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(5)
(∗ Keine Rebalancierung nötig! ∗)
(3)
(6)
(7)
(8)
(9)
(10)
2. Fall: T 6= NULL and x < T.key.
(T.left, left shallower) ← AVL delete(T.left, x);
(∗ Rekursives Löschen im linken Unterbaum ∗)
(T, shallower) ← RebalanceDelLeft(T,left shallower);
(∗ Rebalancierung in der Wurzel von T, s. unten ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
Prozedur AVL delete(T,x)
(1) (∗ Eingabe: T: AVL Tree, x: key ∗)
(2) (∗ Ausgabe: T: AVL Tree, shallower: boolean ∗)
1. Fall: T = NULL (∗ x nicht da ∗)
(4)
return (T, false) .
(5)
(∗ Keine Rebalancierung nötig! ∗)
(3)
(6)
(7)
(8)
(9)
(10)
(11)
2. Fall: T 6= NULL and x < T.key.
(T.left, left shallower) ← AVL delete(T.left, x);
(∗ Rekursives Löschen im linken Unterbaum ∗)
(T, shallower) ← RebalanceDelLeft(T,left shallower);
(∗ Rebalancierung in der Wurzel von T, s. unten ∗)
return (T, shallower).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
39
(12) 3. Fall: T 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
40
(12) 3. Fall: T 6= NULL and T.key < x.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
40
(12) 3. Fall: T 6= NULL and T.key < x.
(13)
(T.right, right shallower) ← AVL delete(T.right, x) ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
40
(12) 3. Fall: T 6= NULL and T.key < x.
(13)
(14)
(T.right, right shallower) ← AVL delete(T.right, x) ;
(∗ Rekursives Löschen im rechten Unterbaum ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
40
(12) 3. Fall: T 6= NULL and T.key < x.
(13)
(14)
(15)
(T.right, right shallower) ← AVL delete(T.right, x) ;
(∗ Rekursives Löschen im rechten Unterbaum ∗)
(T, shallower) ←
RebalanceDelRight(T,right shallower) ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
40
(12) 3. Fall: T 6= NULL and T.key < x.
(13)
(14)
(15)
(16)
(T.right, right shallower) ← AVL delete(T.right, x) ;
(∗ Rekursives Löschen im rechten Unterbaum ∗)
(T, shallower) ←
RebalanceDelRight(T,right shallower) ;
(∗ Rebalancierung in der Wurzel von T,
symmetrisch zu 2. Fall ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
40
(12) 3. Fall: T 6= NULL and T.key < x.
(13)
(14)
(15)
(16)
(17)
(T.right, right shallower) ← AVL delete(T.right, x) ;
(∗ Rekursives Löschen im rechten Unterbaum ∗)
(T, shallower) ←
RebalanceDelRight(T,right shallower) ;
(∗ Rebalancierung in der Wurzel von T,
symmetrisch zu 2. Fall ∗)
return (T, shallower) .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
40
(18) 4. Fall: T 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(18) 4. Fall: T 6= NULL and T.key = x.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(18) 4. Fall: T 6= NULL and T.key = x.
(19)
(∗ Entferne Wurzelknoten! ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(18) 4. Fall: T 6= NULL and T.key = x.
(∗ Entferne Wurzelknoten! ∗)
(20) Fall 4a: T.left = NULL
(19)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(18) 4. Fall: T 6= NULL and T.key = x.
(∗ Entferne Wurzelknoten! ∗)
(20) Fall 4a: T.left = NULL
(19)
x
war und
ist AVLBaum
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(18) 4. Fall: T 6= NULL and T.key = x.
(∗ Entferne Wurzelknoten! ∗)
(20) Fall 4a: T.left = NULL
(19)
x
war und
ist AVLBaum
(21) return (T.right, true) .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(18) 4. Fall: T 6= NULL and T.key = x.
(∗ Entferne Wurzelknoten! ∗)
(20) Fall 4a: T.left = NULL
(19)
x
war und
ist AVLBaum
(21) return (T.right, true) .
(22)
(∗ Baum ist flacher als vorher. ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(18) 4. Fall: T 6= NULL and T.key = x.
(∗ Entferne Wurzelknoten! ∗)
(20) Fall 4a: T.left = NULL
(19)
x
war und
ist AVLBaum
(21) return (T.right, true) .
(22)
(∗ Baum ist flacher als vorher. ∗)
(23) Fall 4b: T.right = NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(18) 4. Fall: T 6= NULL and T.key = x.
(∗ Entferne Wurzelknoten! ∗)
(20) Fall 4a: T.left = NULL
(19)
x
war und
ist AVLBaum
(21) return (T.right, true) .
(22)
(∗ Baum ist flacher als vorher. ∗)
(23) Fall 4b: T.right = NULL
(24) return (T.left, true) .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
41
(25) Fall 4c: T 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
(25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
(25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer
x
kleiner
y
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
(25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer
x
kleiner
y
(26)
(T.right, v, right shallower) ←
AVL extractMin(T.right) ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
(25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer
x
kleiner
y
(26)
(27)
(T.right, v, right shallower) ←
AVL extractMin(T.right) ;
v.left ← T.left; v.right ← T.right;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
(25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer
x
kleiner
y
(26)
(27)
(28)
(T.right, v, right shallower) ←
AVL extractMin(T.right) ;
v.left ← T.left; v.right ← T.right;
v.bal ← T.bal;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
(25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer
x
kleiner
y
(26)
(27)
(28)
(29)
(T.right, v, right shallower) ←
AVL extractMin(T.right) ;
v.left ← T.left; v.right ← T.right;
v.bal ← T.bal;
T ← v; (∗ v ersetzt die Wurzel von T ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
(25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer
x
kleiner
y
(26)
(27)
(28)
(29)
(30)
(T.right, v, right shallower) ←
AVL extractMin(T.right) ;
v.left ← T.left; v.right ← T.right;
v.bal ← T.bal;
T ← v; (∗ v ersetzt die Wurzel von T ∗)
(T, shallower) ←
RebalanceDelRight(T,right shallower) ;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
(25) Fall 4c: T 6= NULL and beide Unterbäume nicht leer
x
kleiner
y
(26)
(27)
(28)
(29)
(30)
(31)
(T.right, v, right shallower) ←
AVL extractMin(T.right) ;
v.left ← T.left; v.right ← T.right;
v.bal ← T.bal;
T ← v; (∗ v ersetzt die Wurzel von T ∗)
(T, shallower) ←
RebalanceDelRight(T,right shallower) ;
return (T, shallower) .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
42
Prozedur AVL extractMin(T)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
43
Prozedur AVL extractMin(T)
(1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
43
Prozedur AVL extractMin(T)
(1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗)
(2) (∗ Ausgabe: T, v: AVL Tree; shallower: boolean ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
43
Prozedur AVL extractMin(T)
(1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗)
(2) (∗ Ausgabe: T, v: AVL Tree; shallower: boolean ∗)
(3)
(∗ Knoten v mit minimalem Eintrag aus T ausgeklinkt ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
43
Prozedur AVL extractMin(T)
(1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗)
(2) (∗ Ausgabe: T, v: AVL Tree; shallower: boolean ∗)
(3)
(4)
(∗ Knoten v mit minimalem Eintrag aus T ausgeklinkt ∗)
(∗ shallower = true, falls T flacher geworden ist ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
43
Prozedur AVL extractMin(T)
(1) (∗ Eingabe: T: AVL Tree mit T 6= NULL ∗)
(2) (∗ Ausgabe: T, v: AVL Tree; shallower: boolean ∗)
(∗ Knoten v mit minimalem Eintrag aus T ausgeklinkt ∗)
(4)
(∗ shallower = true, falls T flacher geworden ist ∗)
...
(3)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
43
In Prozedur AVL extractMin(T):
Fall Schluss“:
”
T.left = NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
44
In Prozedur AVL extractMin(T):
Fall Schluss“:
”
T.left = NULL
bleibt
AVL-Baum
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
44
In Prozedur AVL extractMin(T):
Fall Schluss“:
”
Wurzel abhängen:
T.left = NULL
bleibt
AVL-Baum
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
44
In Prozedur AVL extractMin(T):
Fall Schluss“:
”
Wurzel abhängen:
T.left = NULL
bleibt
AVL-Baum
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
v ← T;
T ← T.right
return (T, v, true).
44
In Prozedur AVL extractMin(T):
Fall Rekursion“:
”
T.left 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
45
In Prozedur AVL extractMin(T):
Fall Rekursion“:
”
T.left 6= NULL
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
45
In Prozedur AVL extractMin(T):
Fall Rekursion“:
”
T.left 6= NULL
(T, v, left shallower) ← AVL extractMin(T.left);
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
45
In Prozedur AVL extractMin(T):
Fall Rekursion“:
”
T.left 6= NULL
(T, v, left shallower) ← AVL extractMin(T.left);
(T, shallower) ← RebalanceDelLeft(T,left shallower);
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
45
In Prozedur AVL extractMin(T):
Fall Rekursion“:
”
T.left 6= NULL
(T, v, left shallower) ← AVL extractMin(T.left);
(T, shallower) ← RebalanceDelLeft(T,left shallower);
return(T, v, shallower).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
45
RebalanceDelLeft(T,left shallower)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
46
RebalanceDelLeft(T,left shallower)
(∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
46
RebalanceDelLeft(T,left shallower)
(∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗)
(∗ (RebalanceDelRight: symmetrisch) ∗)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
46
RebalanceDelLeft(T,left shallower)
(∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗)
(∗ (RebalanceDelRight: symmetrisch) ∗)
Situation:
T:
T1
T2
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
46
RebalanceDelLeft(T,left shallower)
(∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗)
(∗ (RebalanceDelRight: symmetrisch) ∗)
Situation:
T:
T1
T:
T2
FG KTuEA, TU Ilmenau
durch rekursives
Löschen in T1
umgebaut zu
AuD – 26.05.2008
T1
T2
46
RebalanceDelLeft(T,left shallower)
(∗ prüft Balancebedingung in der Wurzel von T, korrigiert ∗)
(∗ (RebalanceDelRight: symmetrisch) ∗)
Situation:
T:
T1
T:
T2
durch rekursives
Löschen in T1
umgebaut zu
T1
T2
T1 = T.left verändert; in left shallower“ wird die Infor”
mation geliefert, ob T1 flacher geworden ist.
T.bal: unverändert.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
46
Fall
Aktion
Fall RebDL-1:
left shallower = false
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
47
Fall
Aktion
Fall RebDL-1:
left shallower = false
shallower ← false;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
47
Fall
Aktion
Fall RebDL-1:
left shallower = false
shallower ← false;
Fall RebDL-2:
left shallower = true ∧
T.bal = −1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
47
Fall
Aktion
Fall RebDL-1:
left shallower = false
shallower ← false;
Fall RebDL-2:
left shallower = true ∧
T.bal = −1
shallower ← true;
T.bal ← 0;
geschrumpft
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
47
Fall
Aktion
Fall RebDL-3:
left shallower = true ∧
T.bal = 0
geschrumpft
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
48
Fall
Aktion
Fall RebDL-3:
left shallower = true ∧
T.bal = 0
shallower ← false;
T.bal ← 1;
geschrumpft
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
48
Fall RebDL-4:
left shallower = true ∧
T.bal = 1
T1
FG KTuEA, TU Ilmenau
T2
AuD – 26.05.2008
49
Fall RebDL-4:
left shallower = true ∧
T.bal = 1
T1
T2
geschrumpft
Unterfälle je nach Aussehen von T2.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
49
Fall RebDL-4:
left shallower = true ∧
T.bal = 1
T1
T2
geschrumpft
Unterfälle je nach Aussehen von T2.
T2 hat Tiefe mindestens 1, da aus T1 ein Knoten entfernt
werden konnte, also T1 Tiefe mindestens 0 hatte.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
49
Fall RebDL-4.1: T.right.bal = 0;
T
T.left
T
T.right
T1
T1
T2
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
T2
T2
T2
50
Fall RebDL-4.1: T.right.bal = 0;
T
T
T.left
T.right
T1
T1
T2
Linksrotation!
FG KTuEA, TU Ilmenau
T2
T2
T2
T ← rotateL(T);
T.left.bal ← 1;
T.bal ← −1;
shallower ← false;
AuD – 26.05.2008
50
Fall RebDL-4.1: T.right.bal = 0;
T
T
T.left
T.right
T1
T1
T2
T2
T2
T2
T ← rotateL(T);
T.left.bal ← 1;
T.bal ← −1;
shallower ← false;
(∗ Rebalancierung beendet ∗)
Linksrotation!
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
50
Fall RebDL-4.2: T.right.bal = 1;
T
T.left
T
T.right
T1
T2
T2
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
T1
T2
T2
51
Fall RebDL-4.2: T.right.bal = 1;
T
T
T.left
T.right
T1
T2
T2
Linksrotation!
FG KTuEA, TU Ilmenau
T1
T2
T2
T ← rotateL(T);
T.left.bal ← 0;
T.bal ← 0;
shallower ← true;
AuD – 26.05.2008
51
Fall RebDL-4.3: T.right.bal = −1;
T
T1
T3
T2
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
52
Fall RebDL-4.3: (Forts.)
Betrachte Teilbäume von T2 = T.right.left.
T
T:
T1
T3
T2
FG KTuEA, TU Ilmenau
T1
T3
T2
AuD – 26.05.2008
53
Fall RebDL-4.3: (Forts.)
Betrachte Teilbäume von T2 = T.right.left.
T
T:
T1
T3
T2
Doppelrotation!
FG KTuEA, TU Ilmenau
T1
T3
T2
T ← rotateRL(T);
shallower ← true;
AuD – 26.05.2008
53
Fall RebDL-4.3: (Forts.)
Betrachte Teilbäume von T2 = T.right.left.
T
T:
T1
T3
T2
T1
T3
T2
T ← rotateRL(T);
shallower ← true;
Neue Werte der Balancefaktoren:
Doppelrotation!
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
53
Neue Werte der Balancefaktoren:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
54
Neue Werte der Balancefaktoren:
altes
T.bal
−1
0
1
FG KTuEA, TU Ilmenau
neues
T.left.bal T.right.bal T.bal
0
1
0
0
0
0
−1
0
0
AuD – 26.05.2008
54
Neue Werte der Balancefaktoren:
altes
T.bal
−1
0
1
neues
T.left.bal T.right.bal T.bal
0
1
0
0
0
0
−1
0
0
(Das alte T.bal enthält (nach der Doppelrotation) den Balancefaktor, der ursprünglich in der Wurzel des mittleren“
”
Unterbaums T2 stand.)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
54
Proposition
Die rekursive Prozedur AVL delete führt die Wörterbuchoperation delete korrekt durch.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
55
Proposition
Die rekursive Prozedur AVL delete führt die Wörterbuchoperation delete korrekt durch.
D.h.: es entsteht wieder ein AVL-Baum.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
55
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)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
55
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.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
55
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 – 26.05.2008
55
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
56
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
Knoten mit mehreren Unterbäumen:
x1
T0
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
xl
T1
Tl-1
Tl
56
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
Knoten mit mehreren Unterbäumen:
x1
T0
xl
T1
Tl-1
Tl
x1 < · · · < xl.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
56
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
Knoten mit mehreren Unterbäumen:
x1
T0
xl
T1
Tl-1
Tl
x1 < · · · < xl.
Für yi in Ti, 0 ≤ i ≤ l:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
56
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
Knoten mit mehreren Unterbäumen:
x1
T0
xl
T1
Tl-1
Tl
x1 < · · · < xl.
Für yi in Ti, 0 ≤ i ≤ l:
y0
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
56
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
Knoten mit mehreren Unterbäumen:
x1
T0
xl
T1
Tl-1
Tl
x1 < · · · < xl.
Für yi in Ti, 0 ≤ i ≤ l:
y0 < x1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
56
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
Knoten mit mehreren Unterbäumen:
x1
T0
xl
T1
Tl-1
Tl
x1 < · · · < xl.
Für yi in Ti, 0 ≤ i ≤ l:
y0 < x1 < y1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
56
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
Knoten mit mehreren Unterbäumen:
x1
T0
xl
T1
Tl-1
Tl
x1 < · · · < xl.
Für yi in Ti, 0 ≤ i ≤ l:
y0 < x1 < y1 < x2
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
56
Mehrweg-Such-Bäume
Bäume aus Knoten mit variablem Ausgrad
Knoten mit mehreren Unterbäumen:
x1
T0
xl
T1
Tl-1
Tl
x1 < · · · < xl.
Für yi in Ti, 0 ≤ i ≤ l:
y0 < x1 < y1 < x2 < · · · < yl−1 < xl < yl
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
56
Mehrweg-Such-Bäume
Beispiel eines N-MSB:
Wurzel
27 39
7
1
2
4
10
16
11 13
9
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
29
35 36
21 25
38
45
41
48 50
12
57
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U sind wie folgt induktiv definiert:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U sind wie folgt induktiv definiert:
(0) Der leere Baum ist ein U -MSB.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U sind wie folgt induktiv definiert:
(0) Der leere Baum ist ein U -MSB.
(1) Ist l ≥ 1
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U sind wie folgt induktiv definiert:
(0) Der leere Baum ist ein U -MSB.
(1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U sind wie folgt induktiv definiert:
(0) Der leere Baum ist ein U -MSB.
(1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und
sind T0, T1, . . . , Tl U -MSBe mit:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U sind wie folgt induktiv definiert:
(0) Der leere Baum ist ein U -MSB.
(1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und
sind T0, T1, . . . , Tl U -MSBe mit:
Für yi in Ti, 0 ≤ i ≤ l:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U sind wie folgt induktiv definiert:
(0) Der leere Baum ist ein U -MSB.
(1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und
sind T0, T1, . . . , Tl U -MSBe mit:
Für yi in Ti, 0 ≤ i ≤ l:
y0 < x1 < y1 < x2 < · · · < yl−1 < xl < yl
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Definition
Mehrweg-Suchbäume (MSBe) über dem (angeordneten)
Universum U sind wie folgt induktiv definiert:
(0) Der leere Baum ist ein U -MSB.
(1) Ist l ≥ 1 und sind x1 < x2 < · · · < xl Schlüssel in U und
sind T0, T1, . . . , Tl U -MSBe mit:
Für yi in Ti, 0 ≤ i ≤ l:
y0 < x1 < y1 < x2 < · · · < yl−1 < xl < yl
dann ist auch (T0, x1, T1, x2, . . . , xl−1, Tl−1, xl, Tl)
ein U -Mehrweg-Suchbaum.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
58
Mehrweg-Such-Bäume
Möglichkeit für Implementierung eines Knotens:
Variante 1: Jeder Knoten enthält 2 Arrays.
1
2 3
4
l max
5
keys: 10 11 13
l: 3
0 1
l_max: 9
2 3
4
5
l max
sons:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
59
Mehrweg-Such-Bäume
Möglichkeit für Implementierung eines Knotens:
Variante 2: Schlüssel und Kinder als Listen.
keys:
10
11
13
sons:
l: 3
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
60
Mehrweg-Such-Bäume
Variante 3:
Ein MSB-Knoten wird durch eine aufsteigend sortierte lineare
Liste von Binärbaumknoten dargestellt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
61
Mehrweg-Such-Bäume
Variante 3:
Ein MSB-Knoten wird durch eine aufsteigend sortierte lineare
Liste von Binärbaumknoten dargestellt.
Jeder Knoten hat Platz für:
Schlüssel, (Daten,) Zeiger auf Unterbaum, Zeiger auf nächsten
in Liste.
Im Knoten muss als boolescher Wert vermerkt sein, ob es sich
um den Knoten am Listenende handelt. (Im Bild: *“.)
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
61
Mehrweg-Such-Bäume
Variante 3:
Ein MSB-Knoten wird durch eine aufsteigend sortierte lineare
Liste von Binärbaumknoten dargestellt.
Jeder Knoten hat Platz für:
Schlüssel, (Daten,) Zeiger auf Unterbaum, Zeiger auf nächsten
in Liste.
Im Knoten muss als boolescher Wert vermerkt sein, ob es sich
um den Knoten am Listenende handelt. (Im Bild: *“.)
”
Dieser Knoten hat zwei Zeiger auf Unterbäume.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
61
Mehrweg-Such-Bäume
Variante 3:
Ein MSB-Knoten wird durch eine aufsteigend sortierte lineare
Liste von Binärbaumknoten dargestellt.
Jeder Knoten hat Platz für:
Schlüssel, (Daten,) Zeiger auf Unterbaum, Zeiger auf nächsten
in Liste.
Im Knoten muss als boolescher Wert vermerkt sein, ob es sich
um den Knoten am Listenende handelt. (Im Bild: *“.)
”
Dieser Knoten hat zwei Zeiger auf Unterbäume.
Elegant: Für die Suche kann man die gewöhnliche Suchprozedur für binäre Suchbäume benutzen.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
61
Mehrweg-Such-Bäume
T:
39 *
27
7
1
2
4 *
16 *
10
9 *
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
11
13 *
21
25 *
12 *
62
2-3-Bäume
Definition
Ein Mehrweg-Suchbaum T heißt ein 2-3-Baum, wenn gilt:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
63
2-3-Bäume
Definition
Ein Mehrweg-Suchbaum T heißt ein 2-3-Baum, wenn gilt:
(a) Jeder Knoten enthält 1 oder 2 Schlüssel
(also hat jeder Knoten 2 oder 3 Unterbäume, was der
Struktur den Namen gibt);
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
63
2-3-Bäume
Definition
Ein Mehrweg-Suchbaum T heißt ein 2-3-Baum, wenn gilt:
(a) Jeder Knoten enthält 1 oder 2 Schlüssel
(also hat jeder Knoten 2 oder 3 Unterbäume, was der
Struktur den Namen gibt);
(b) Für jeden Knoten v in T gilt: wenn v einen leeren Unterbaum hat, so sind alle Unterbäume unter v leer, d.h. v ist
dann Blatt;
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
63
2-3-Bäume
Definition
Ein Mehrweg-Suchbaum T heißt ein 2-3-Baum, wenn gilt:
(a) Jeder Knoten enthält 1 oder 2 Schlüssel
(also hat jeder Knoten 2 oder 3 Unterbäume, was der
Struktur den Namen gibt);
(b) Für jeden Knoten v in T gilt: wenn v einen leeren Unterbaum hat, so sind alle Unterbäume unter v leer, d.h. v ist
dann Blatt;
(c) Alle Blätter von T haben dieselbe Tiefe.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
63
2-3-Bäume
Beispiele:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
64
2-3-Bäume
Beispiele:
Leerer 2-3-Baum:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
64
2-3-Bäume
Beispiele:
Leerer 2-3-Baum:
2-3-Baum mit 2 Ebenen:
A
FG KTuEA, TU Ilmenau
G
O
I
L
AuD – 26.05.2008
Level 1
R
Level 0 = Blattebene
64
2-3-Bäume
Beispiele:
Leerer 2-3-Baum:
2-3-Baum mit 2 Ebenen:
A
G
O
I
L
Level 1
R
Level 0 = Blattebene
NB: Die Ebenen werden von den Blättern her nummeriert.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
64
2-3-Bäume
Beispiele:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
65
2-3-Bäume
Beispiele:
I
Level 2
G
A
O
H
FG KTuEA, TU Ilmenau
L
AuD – 26.05.2008
M
T
R
Level 1
S
U
Level 0 = Blattebene
65
2-3-Bäume
L
A
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
M
O
T
R
U
66
2-3-Bäume
L
A
O
T
M
R
U
Kein 2-3-Baum (zu großer Grad).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
66
2-3-Bäume
G
A
O
L
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
M
R
67
2-3-Bäume
G
A
O
L
M
R
Kein 2-3-Baum (Blätter in verschiedenen Tiefen).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
67
2-3-Bäume
A
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
G
O
I
L
68
2-3-Bäume
A
G
O
I
L
Kein 2-3-Baum (Leerer Unterbaum in Nicht-Blatt).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
68
2-3-Bäume: Logarithmische Tiefe
Proposition
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
69
2-3-Bäume: Logarithmische Tiefe
Proposition
Die Tiefe eines 2-3-Baums mit n Daten ist mindestens
dlog3(n + 1)e − 1 und höchstens blog(n + 1)c − 1.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
69
2-3-Bäume: Logarithmische Tiefe
Proposition
Die Tiefe eines 2-3-Baums mit n Daten ist mindestens
dlog3(n + 1)e − 1 und höchstens blog(n + 1)c − 1.
[log3 x ≈ 0.63 log2 x]
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
69
2-3-Bäume: Logarithmische Tiefe
Proposition
Die Tiefe eines 2-3-Baums mit n Daten ist mindestens
dlog3(n + 1)e − 1 und höchstens blog(n + 1)c − 1.
[log3 x ≈ 0.63 log2 x] Beweis: Übung.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
69
2-3-Bäume: Logarithmische Tiefe
Proposition
Die Tiefe eines 2-3-Baums mit n Daten ist mindestens
dlog3(n + 1)e − 1 und höchstens blog(n + 1)c − 1.
[log3 x ≈ 0.63 log2 x] Beweis: Übung.
Level
h
h-1
1
0
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
69
Suche in 2-3-Bäumen: Rekursiv
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = . Ausgabe: ↑
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = . Ausgabe: ↑
2. Fall: Die Wurzel von T enthält Schlüssel x1
(und eventuell x2 > x1).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = . Ausgabe: ↑
2. Fall: Die Wurzel von T enthält Schlüssel x1
(und eventuell x2 > x1).
2a: x < x1:
Rufe lookup für ersten Unterbaum T0 auf.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = . Ausgabe: ↑
2. Fall: Die Wurzel von T enthält Schlüssel x1
(und eventuell x2 > x1).
2a: x < x1:
Rufe lookup für ersten Unterbaum T0 auf.
2b: x = x1: gefunden“.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = . Ausgabe: ↑
2. Fall: Die Wurzel von T enthält Schlüssel x1
(und eventuell x2 > x1).
2a: x < x1:
Rufe lookup für ersten Unterbaum T0 auf.
2b: x = x1: gefunden“.
”
2c: x1 < x und ( x2 existiert nicht oder x < x2):
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = . Ausgabe: ↑
2. Fall: Die Wurzel von T enthält Schlüssel x1
(und eventuell x2 > x1).
2a: x < x1:
Rufe lookup für ersten Unterbaum T0 auf.
2b: x = x1: gefunden“.
”
2c: x1 < x und ( x2 existiert nicht oder x < x2):
Rufe lookup für zweiten Unterbaum T1 auf.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = . Ausgabe: ↑
2. Fall: Die Wurzel von T enthält Schlüssel x1
(und eventuell x2 > x1).
2a: x < x1:
Rufe lookup für ersten Unterbaum T0 auf.
2b: x = x1: gefunden“.
”
2c: x1 < x und ( x2 existiert nicht oder x < x2):
Rufe lookup für zweiten Unterbaum T1 auf.
2d: x2 existiert und x = x2: gefunden“.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
lookup(T, x), für 2-3-Baum T , x ∈ U .
1. Fall: T = . Ausgabe: ↑
2. Fall: Die Wurzel von T enthält Schlüssel x1
(und eventuell x2 > x1).
2a: x < x1:
Rufe lookup für ersten Unterbaum T0 auf.
2b: x = x1: gefunden“.
”
2c: x1 < x und ( x2 existiert nicht oder x < x2):
Rufe lookup für zweiten Unterbaum T1 auf.
2d: x2 existiert und x = x2: gefunden“.
”
2e: x2 existiert und x2 < x:
Rufe lookup für dritten Unterbaum T2 auf.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
70
Suche in 2-3-Bäumen: Rekursiv
Klar:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
71
Suche in 2-3-Bäumen: Rekursiv
Klar:
Zeitaufwand:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
71
Suche in 2-3-Bäumen: Rekursiv
Klar:
Zeitaufwand: Wenn x im Knoten vx sitzt:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
71
Suche in 2-3-Bäumen: Rekursiv
Klar:
Zeitaufwand: Wenn x im Knoten vx sitzt:
Für jeden Knoten v auf dem Weg von der Wurzel zu vx
entstehen Kosten O(1).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
71
Suche in 2-3-Bäumen: Rekursiv
Klar:
Zeitaufwand: Wenn x im Knoten vx sitzt:
Für jeden Knoten v auf dem Weg von der Wurzel zu vx
entstehen Kosten O(1).
⇒ Zeit für Suche ist
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
71
Suche in 2-3-Bäumen: Rekursiv
Klar:
Zeitaufwand: Wenn x im Knoten vx sitzt:
Für jeden Knoten v auf dem Weg von der Wurzel zu vx
entstehen Kosten O(1).
⇒ Zeit für Suche ist O(log n).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
71
Einfügen in 2-3-Bäumen: Rekursiv
insert(T, x, r), für 2-3-Baum T , x ∈ U .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
72
Einfügen in 2-3-Bäumen: Rekursiv
insert(T, x, r), für 2-3-Baum T , x ∈ U .
Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
72
Einfügen in 2-3-Bäumen: Rekursiv
insert(T, x, r), für 2-3-Baum T , x ∈ U .
Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist.
Invariante (I): (Benutzen – Kontrollieren):
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
72
Einfügen in 2-3-Bäumen: Rekursiv
insert(T, x, r), für 2-3-Baum T , x ∈ U .
Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist.
Invariante (I): (Benutzen – Kontrollieren):
T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
72
Einfügen in 2-3-Bäumen: Rekursiv
insert(T, x, r), für 2-3-Baum T , x ∈ U .
Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist.
Invariante (I): (Benutzen – Kontrollieren):
T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel.
1. Fall: T = .
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
72
Einfügen in 2-3-Bäumen: Rekursiv
insert(T, x, r), für 2-3-Baum T , x ∈ U .
Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist.
Invariante (I): (Benutzen – Kontrollieren):
T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel.
1. Fall: T = .
Erzeuge neuen 2-3-Baum-Knoten T mit 1 Eintrag (x, r), 2
leeren Unterbäumen (Blatt!)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
72
Einfügen in 2-3-Bäumen: Rekursiv
insert(T, x, r), für 2-3-Baum T , x ∈ U .
Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist.
Invariante (I): (Benutzen – Kontrollieren):
T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel.
1. Fall: T = .
Erzeuge neuen 2-3-Baum-Knoten T mit 1 Eintrag (x, r), 2
leeren Unterbäumen (Blatt!)
return (T, true)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
72
Einfügen in 2-3-Bäumen: Rekursiv
insert(T, x, r), für 2-3-Baum T , x ∈ U .
Resultat: Neuer Baum T 0, Boolescher Wert higher, der angibt, ob T 0 höher als T ist.
Invariante (I): (Benutzen – Kontrollieren):
T 0 höher als T ⇒ T 0 hat in der Wurzel nur einen Schlüssel.
1. Fall: T = .
Erzeuge neuen 2-3-Baum-Knoten T mit 1 Eintrag (x, r), 2
leeren Unterbäumen (Blatt!)
return (T, true)
(I) stimmt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
72
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1:
insert(T0) liefert T00 und sub higher.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
FG KTuEA, TU Ilmenau
higher ← false;
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
higher ← false;
2c: x1 < x und (x2 existiert nicht oder x < x2):
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
higher ← false;
2c: x1 < x und (x2 existiert nicht oder x < x2):
insert(T1) liefert T10 und sub higher.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
higher ← false;
2c: x1 < x und (x2 existiert nicht oder x < x2):
insert(T1) liefert T10 und sub higher.
Rebalancierung (s.u.).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
higher ← false;
2c: x1 < x und (x2 existiert nicht oder x < x2):
insert(T1) liefert T10 und sub higher.
Rebalancierung (s.u.).
2d: x2 existiert und x = x2: Update:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
higher ← false;
2c: x1 < x und (x2 existiert nicht oder x < x2):
insert(T1) liefert T10 und sub higher.
Rebalancierung (s.u.).
2d: x2 existiert und x = x2: Update:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
higher ← false;
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
higher ← false;
2c: x1 < x und (x2 existiert nicht oder x < x2):
insert(T1) liefert T10 und sub higher.
Rebalancierung (s.u.).
2d: x2 existiert und x = x2: Update:
higher ← false;
2e: x2 existiert und x2 < x:
insert(T2) liefert T20 und sub higher.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rekursiv
2. Fall: Wurzel von T enthält Schlüssel x1 und eventuell
x2 > x1, entsprechend Unterbäume T0, T1 und eventuell T2.
2a: x < x1: insert(T0) liefert T00 und sub higher.
Rebalancierung (s.u.).
2b: x = x1: Update:
higher ← false;
2c: x1 < x und (x2 existiert nicht oder x < x2):
insert(T1) liefert T10 und sub higher.
Rebalancierung (s.u.).
2d: x2 existiert und x = x2: Update:
higher ← false;
2e: x2 existiert und x2 < x:
insert(T2) liefert T20 und sub higher.
Rebalancierung (s.u.).
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
73
Einfügen in 2-3-Bäumen: Rebalancierung
Fälle 2a/2c/2e:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
74
Einfügen in 2-3-Bäumen: Rebalancierung
Fälle 2a/2c/2e:
Fall 2a(i)/2c(i)/2e(i): sub_higher = false.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
74
Einfügen in 2-3-Bäumen: Rebalancierung
Fälle 2a/2c/2e:
Fall 2a(i)/2c(i)/2e(i): sub_higher = false.
Der veränderte Teilbaum ist nicht tiefer geworden.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
74
Einfügen in 2-3-Bäumen: Rebalancierung
Fälle 2a/2c/2e:
Fall 2a(i)/2c(i)/2e(i): sub_higher = false.
Der veränderte Teilbaum ist nicht tiefer geworden.
Keine weitere Rebalancierung nötig: Setze higher ← false.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
74
Einfügen in 2-3-Bäumen: Rebalancierung
Fall 2a(ii)/2c(ii):
x2 existiert nicht und sub_higher = true
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
75
Einfügen in 2-3-Bäumen: Rebalancierung
Fall 2a(ii)/2c(ii):
x2 existiert nicht und sub_higher = true
2a(ii): Benutze (I)!
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
75
Einfügen in 2-3-Bäumen: Rebalancierung
Fall 2a(ii)/2c(ii):
x2 existiert nicht und sub_higher = true
2a(ii): Benutze (I)!
x1
T
T0
Umbau
z
T
x1
z
alt
T1
neu,
tiefer
T00
T00
FG KTuEA, TU Ilmenau
T01
T1
T01
AuD – 26.05.2008
75
Einfügen in 2-3-Bäumen: Rebalancierung
Fall 2a(ii)/2c(ii):
x2 existiert nicht und sub_higher = true
2a(ii): Benutze (I)!
x1
T
T0
Umbau
z
T
x1
z
alt
T1
neu,
tiefer
T00
T00
T01
T1
T01
higher ← false
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
75
Einfügen in 2-3-Bäumen: Rebalancierung
2c(ii): Benutze (I)!
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
76
Einfügen in 2-3-Bäumen: Rebalancierung
2c(ii): Benutze (I)!
x1
T
T1
alt
Umbau
z
T0
T
z
neu,
tiefer
T0
T10
FG KTuEA, TU Ilmenau
x1
T10
T11
T11
AuD – 26.05.2008
76
Einfügen in 2-3-Bäumen: Rebalancierung
2c(ii): Benutze (I)!
x1
T
T1
alt
Umbau
z
T0
T
x1
z
neu,
tiefer
T0
T10
T10
T11
T11
higher ← false
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
76
Einfügen in 2-3-Bäumen: Rebalancierung
Fall 2a(iii)/2c(iii)/2e(iii):
x2 existiert und sub_higher = true
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
77
Einfügen in 2-3-Bäumen: Rebalancierung
Fall 2a(iii)/2c(iii)/2e(iii):
x2 existiert und sub_higher = true
Benutze jeweils (I)!
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
77
Einfügen in 2-3-Bäumen: Rebalancierung
2a(iii):
T
T0
x1
x2
T
z
T1
T00
FG KTuEA, TU Ilmenau
T01
AuD – 26.05.2008
x2
z
Umbau
neu,
tiefer
x1
T2
T00
T01
T1
T2
78
Einfügen in 2-3-Bäumen: Rebalancierung
2a(iii):
T
T0
x1
x2
T
z
T1
T00
T01
x2
z
Umbau
neu,
tiefer
x1
T2
T00
T01
T1
T2
higher ←
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
78
Einfügen in 2-3-Bäumen: Rebalancierung
2a(iii):
T
T0
x1
x2
T
z
T1
T00
T01
x2
z
Umbau
neu,
tiefer
x1
T2
T00
T01
T1
T2
higher ← true
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
78
Einfügen in 2-3-Bäumen: Rebalancierung
2a(iii):
T
T0
x1
x2
T
z
T1
T00
T01
x2
z
Umbau
neu,
tiefer
x1
T2
T00
T01
T1
T2
higher ← true
Prüfe: (I) erfüllt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
78
Einfügen in 2-3-Bäumen: Rebalancierung
2c(iii):
x1
T
T1
x2
z
T
Umbau
z
x1
x2
T2
T0
T10
FG KTuEA, TU Ilmenau
T11
AuD – 26.05.2008
T0
T10
T11
T2
79
Einfügen in 2-3-Bäumen: Rebalancierung
2c(iii):
x1
T
T1
x2
z
T
Umbau
z
x1
x2
T2
T0
T10
T11
T0
T10
T11
T2
higher ←
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
79
Einfügen in 2-3-Bäumen: Rebalancierung
2c(iii):
x1
T
T1
x2
z
T
Umbau
z
x1
x2
T2
T0
T10
T11
T0
T10
T11
T2
higher ← true
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
79
Einfügen in 2-3-Bäumen: Rebalancierung
2c(iii):
x1
T
T1
x2
z
T
Umbau
z
x1
x2
T2
T0
T10
T11
T0
T10
T11
T2
higher ← true
Prüfe: (I) erfüllt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
79
Einfügen in 2-3-Bäumen: Rebalancierung
2e(iii):
T
x2
x1
T2
T0
Umbau
z
x1
z
T1
T20
FG KTuEA, TU Ilmenau
x2
T
T21
AuD – 26.05.2008
T0
T1
T20
T21
80
Einfügen in 2-3-Bäumen: Rebalancierung
2e(iii):
T
x2
x1
T2
T0
x2
T
Umbau
z
x1
z
T1
T20
T21
T0
T1
T20
T21
higher ←
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
80
Einfügen in 2-3-Bäumen: Rebalancierung
2e(iii):
T
x2
x1
T2
T0
x2
T
Umbau
z
x1
z
T1
T20
T21
T0
T1
T20
T21
higher ← true
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
80
Einfügen in 2-3-Bäumen: Rebalancierung
2e(iii):
T
x2
x1
T2
T0
x2
T
Umbau
z
x1
z
T1
T20
T21
T0
T1
T20
T21
higher ← true
Prüfe: (I) erfüllt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
80
Einfügen in 2-3-Bäumen
Beobachtung:
Die Tiefe von 2-3-Bäumen wächst durch Spalten der Wurzel“.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
81
Einfügen in 2-3-Bäumen
Beobachtung:
Die Tiefe von 2-3-Bäumen wächst durch Spalten der Wurzel“.
”
Proposition
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
81
Einfügen in 2-3-Bäumen
Beobachtung:
Die Tiefe von 2-3-Bäumen wächst durch Spalten der Wurzel“.
”
Proposition
(a) Die Prozedur insert ist korrekt, d.h. sie erhält die 2-3Baum-Struktur.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
81
Einfügen in 2-3-Bäumen
Beobachtung:
Die Tiefe von 2-3-Bäumen wächst durch Spalten der Wurzel“.
”
Proposition
(a) Die Prozedur insert ist korrekt, d.h. sie erhält die 2-3Baum-Struktur.
(b) Das Einfügen eines Schlüssels in einen 2-3-Baum mit n
Schlüsseln benötigt Zeit O(log n) und bewirkt die Erzeugung von höchstens log2 n neuer Knoten.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
81
Einfügen in 2-3-Bäumen
Beweis:
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
82
Einfügen in 2-3-Bäumen
Beweis:
(a) Man kontrolliert in jedem Fall des Algorithmus nach, dass
die 2-3-Baum-Struktur wiederhergestellt wird.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
82
Einfügen in 2-3-Bäumen
Beweis:
(a) Man kontrolliert in jedem Fall des Algorithmus nach, dass
die 2-3-Baum-Struktur wiederhergestellt wird.
(b) Für die Bearbeitung eines Levels in der insert-Prozedur
wird Zeit O(1) benötigt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
82
Einfügen in 2-3-Bäumen
Beweis:
(a) Man kontrolliert in jedem Fall des Algorithmus nach, dass
die 2-3-Baum-Struktur wiederhergestellt wird.
(b) Für die Bearbeitung eines Levels in der insert-Prozedur
wird Zeit O(1) benötigt.
Auf jedem der ≤ log n Levels wird höchstens 1 Knoten neu
gebildet.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
82
Einfügen in 2-3-Bäumen
Beweis:
(a) Man kontrolliert in jedem Fall des Algorithmus nach, dass
die 2-3-Baum-Struktur wiederhergestellt wird.
(b) Für die Bearbeitung eines Levels in der insert-Prozedur
wird Zeit O(1) benötigt.
Auf jedem der ≤ log n Levels wird höchstens 1 Knoten neu
gebildet.
Folgerung: Für jedes n ≥ 0 existiert ein 2-3-Baum mit n
Schlüsseln.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
82
Einfügen in 2-3-Bäumen
Beweis:
(a) Man kontrolliert in jedem Fall des Algorithmus nach, dass
die 2-3-Baum-Struktur wiederhergestellt wird.
(b) Für die Bearbeitung eines Levels in der insert-Prozedur
wird Zeit O(1) benötigt.
Auf jedem der ≤ log n Levels wird höchstens 1 Knoten neu
gebildet.
Folgerung: Für jedes n ≥ 0 existiert ein 2-3-Baum mit n
Schlüsseln. (Man füge in einen anfangs leeren Baum die
Schlüssel 1, . . . , n ein.)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
82
Löschen in 2-3-Bäumen
Prinzip: Suche den kleinsten Schlüssel y ≥ x, der in einem
Blatt gespeichert ist.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
83
Löschen in 2-3-Bäumen
Prinzip: Suche den kleinsten Schlüssel y ≥ x, der in einem
Blatt gespeichert ist.
(x oder der Inorder-Nachfolger von x.)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
83
Löschen in 2-3-Bäumen
Prinzip: Suche den kleinsten Schlüssel y ≥ x, der in einem
Blatt gespeichert ist.
(x oder der Inorder-Nachfolger von x.)
Setze y an die Stelle von x und entferne y.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
83
Löschen in 2-3-Bäumen
Prinzip: Suche den kleinsten Schlüssel y ≥ x, der in einem
Blatt gespeichert ist.
(x oder der Inorder-Nachfolger von x.)
Setze y an die Stelle von x und entferne y.
Fazit: Man muss sich nur um das Löschen eines Eintrags y in
einem Blatt kümmern.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
83
Löschen in 2-3-Bäumen
Einfacher Fall: Neben y hat das Blatt noch andere Einträge.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
84
Löschen in 2-3-Bäumen
Einfacher Fall: Neben y hat das Blatt noch andere Einträge.
Keine Umstrukturierung nötig.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
84
Löschen in 2-3-Bäumen
Einfacher Fall: Neben y hat das Blatt noch andere Einträge.
Keine Umstrukturierung nötig.
Rebalancierungsfall: Durch das Streichen von y wird das Blatt
leer, verliert also an Höhe.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
84
Löschen in 2-3-Bäumen
Einfacher Fall: Neben y hat das Blatt noch andere Einträge.
Keine Umstrukturierung nötig.
Rebalancierungsfall: Durch das Streichen von y wird das Blatt
leer, verliert also an Höhe.
Ähnlich wie bei den Einfügungen werden flacher gewordene
Teilbäume durch lokale Umstellungen wieder auf die Höhe der
anderen Teilbäume gebracht.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
84
Gesehen – Gehört – Gekonnt?
• Begriff höhenbalancierter Binärbaum“ (flache Auffassung,
”
rekursive Auffassung) definieren können.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
85
Gesehen – Gehört – Gekonnt?
• Begriff höhenbalancierter Binärbaum“ (flache Auffassung,
”
rekursive Auffassung) definieren können.
• Tiefenanalyse für höhenbalancierte BB durchführen können:
Induktionsbeweis, Ergebnis.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
85
Gesehen – Gehört – Gekonnt?
• Begriff höhenbalancierter Binärbaum“ (flache Auffassung,
”
rekursive Auffassung) definieren können.
• Tiefenanalyse für höhenbalancierte BB durchführen können:
Induktionsbeweis, Ergebnis.
• Begriff AVL-Baum. An Beispielen erkennen können, ob ein
AVL-Baum vorliegt.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
85
Gesehen – Gehört – Gekonnt?
• Begriff höhenbalancierter Binärbaum“ (flache Auffassung,
”
rekursive Auffassung) definieren können.
• Tiefenanalyse für höhenbalancierte BB durchführen können:
Induktionsbeweis, Ergebnis.
• Begriff AVL-Baum. An Beispielen erkennen können, ob ein
AVL-Baum vorliegt.
• Einfügen in AVL-Baum: An Beispielen durchführen können.
(Test: Zahlen 1, . . . , 16 nacheinander einfügen.)
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
85
Gesehen – Gehört – Gekonnt?
• Begriff höhenbalancierter Binärbaum“ (flache Auffassung,
”
rekursive Auffassung) definieren können.
• Tiefenanalyse für höhenbalancierte BB durchführen können:
Induktionsbeweis, Ergebnis.
• Begriff AVL-Baum. An Beispielen erkennen können, ob ein
AVL-Baum vorliegt.
• Einfügen in AVL-Baum: An Beispielen durchführen können.
(Test: Zahlen 1, . . . , 16 nacheinander einfügen.)
• Einfügen in AVL-Baum: Rekursive Struktur der Einfügeund der Rebalancierungs-Prozedur erklären können, Rolle
der Flagbits deeper“.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
85
Gesehen – Gehört – Gekonnt?
• Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
86
Gesehen – Gehört – Gekonnt?
• Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können.
• Einfügen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
86
Gesehen – Gehört – Gekonnt?
• Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können.
• Einfügen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern.
• Löschen in AVL-Baum: An Beispielen durchführen können.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
86
Gesehen – Gehört – Gekonnt?
• Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können.
• Einfügen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern.
• Löschen in AVL-Baum: An Beispielen durchführen können.
• Löschen in AVL-Baum: Rekursive Struktur der Einfüge- und
der Rebalancierungs-Prozedur erklären können, Rolle der
Flagbits shallower“.
”
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
86
Gesehen – Gehört – Gekonnt?
• Einfügen in AVL-Baum: Rotationsoperationen kennen, erklären können.
• Einfügen in AVL-Baum: Fälle bei der Rebalancierung erklären können, anhand von Bildern erläutern.
• Löschen in AVL-Baum: An Beispielen durchführen können.
• Löschen in AVL-Baum: Rekursive Struktur der Einfüge- und
der Rebalancierungs-Prozedur erklären können, Rolle der
Flagbits shallower“.
”
• Löschen in AVL-Baum: Fälle bei der Rebalancierung erklären
können, anhand von Bildern erläutern.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
86
• Begriff Mehrwegsuchbaum definieren können.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
87
• Begriff Mehrwegsuchbaum definieren können.
• Suche in Mehrwegsuchbaum beschreiben und an Beispiel
durchführen können.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
87
• Begriff Mehrwegsuchbaum definieren können.
• Suche in Mehrwegsuchbaum beschreiben und an Beispiel
durchführen können.
• Begriff 2-3-Baum definieren können.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
87
• Begriff Mehrwegsuchbaum definieren können.
• Suche in Mehrwegsuchbaum beschreiben und an Beispiel
durchführen können.
• Begriff 2-3-Baum definieren können.
• Einfügung in 2-3-Baum beschreiben und an Beispielen
durchführen können.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
87
• Begriff Mehrwegsuchbaum definieren können.
• Suche in Mehrwegsuchbaum beschreiben und an Beispiel
durchführen können.
• Begriff 2-3-Baum definieren können.
• Einfügung in 2-3-Baum beschreiben und an Beispielen
durchführen können.
• Löschung in 2-3-Baum beschreiben und an Beispielen
durchführen können.
FG KTuEA, TU Ilmenau
AuD – 26.05.2008
87
Herunterladen