Slides - TU Ilmenau

Werbung
Algorithmen und Datenstrukturen SS09
Foliensatz 10
Michael Brinkmeier
Technische Universität Ilmenau
Institut für Theoretische Informatik
Sommersemester 2009
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 1 / 74
Balancierte Suchbäume
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 2 / 74
Balancierte Suchbäume
Idee
Lasse nur Bäume mit bestimmten Struktureigenschaften zu.
Ziel ist z.B. das Erzwingen einer geringen Tiefe (d.h. O(log n) für n
Einträge)
delete und insert müssen so implementiert werden, dass sie die
Struktureigenschaften erhalten und in Zeit O(Tiefe) durchgeführt
werden können.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 3 / 74
Perfekte Balancierung
Definition (Perfekte Balancierung)
Ein Binärbaum T heisst perfekt balanciert, wenn an jedem Knoten die
Anzahl der Knoten im linken und im rechten Unterbaum sich um höchstens
eins unterscheidet.
Mittels der rekursiven Definition erhalten wir:
ist perfekt balanciert.
(T1 , x, T2 ) ist genau dann perfekt balanciert, wenn T1 und T2 perfekt
Balanciert sind, und ||T1 | − |T2 || ≤ 1, wobei |Ti | die Anzahl der Knoten
in Ti ist.
Die Perfekte Balancierung ist aber eine ungeeignete Strukturbedingung, da
delete und insert zu viel Zeit benötigen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 4 / 74
Häufig benutzte Implementierungen
AVL-Bäume – höhenbalanciert
Rot-Schwarz-Bäume (Cormen et al., Sedgewick)
2-3-Bäume – bis zu 2 Schlüssel pro Knoten
B-Bäume, 2-3-4 Bäume (Cormen et al., Sedgewick)
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 5 / 74
AVL-Bäume
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 6 / 74
Höhenbalancierte Suchbäume
Definition (Höhenbalancierte Binärbäume)
Ein Binärbaum T ist höhenbalanciert, falls für jeden Knoten v von T der
Teilbaum Tv = (Tv,1 , x, Tv,1 ) mit Wurzel v die Bedingung
|d(Tv,1 ) − d(Tv,2 )| ≤ 1
erfüllt.
v
d(T1 )
T1
T2
d(T2 )
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 7 / 74
Höhenbalancierte Suchbäume
Äquivalent, kann man höhenbalancierte Binärbäume rekursiv definieren:
Definition (Höhenbalancierte Binärbäume (rekursive
Charakterisierung))
ist höhenbalanciert.
Sind T1 und T2 höhenbalanciert und gilt
|d(T1 ) − d(T2 )| ≤ 1,
dann ist auch (T1 , x, T2 ) höhenbalanciert.
Der Balancefaktor bal(v ) eines Knotens v ist genau die Höhendifferenz der
Unterbäume, d.h.
bal(v ) := d(Tv,2 ) − d(Tv,1 ).
Achtung! Die Tiefe des linken Unterbaumes wird von der des rechten
abgezogen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 8 / 74
Beispiele für den Balancefaktor
−2
0
−1
1
0
0
0
2
0
−1
0
0
1
1
0
0
0
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 9 / 74
AVL-Bäume
Definition (AVL-Baum)
Ein höhenbalancierter binärer Suchbaum heisst AVL-Baum (Adelson-Velskii
und Landis 1962).
Der Balancefaktor muss – zusätzlich zu dem Schlüssel-Wert-Paar – in jedem
Knoten gespeichert werden.
Die Hoffnung hinter den Höhenbalancierung ist, dass die resultierenden
Bäume nicht zu tief sind.
Tatsächlich hat ein AVL-Baum mit n inneren Knoten höchstens
logarithmische Tiefe.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 10 / 74
Die Tiefe von AVL-Bäumen
Satz
Ist T ein höhenbalancierter Binärbaum mit n Knoten, so gilt
d(T ) ≤ 1, 4405 · log n.
D.h. höhenbalancierte Bäume sind höchstens um den Faktor 1,4405 tiefer als
vollständig balancierte Bäume mit gleicher Knotenzahl.
Beweisidee: Wir werden zeigen, dass ein AVL-Baum der Tiefe d
exponentiell viele Knoten haben muss.
Genauer gesagt existiert eine Konstante C > 1 mit logC 2 ≤ 1, 4405 und ein
AVL-Baum der Tiefe d enthält mindestens C d Knoten.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 11 / 74
Die Tiefe von AVL-Bäumen
Beweis
Für d ∈ N sei N(d) die minimale Zahl innerer Knoten in einem AVL-Baum
die Tiefe d.
N(0) = 1
N(1) = 2
...
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 12 / 74
Die Tiefe von AVL-Bäumen
Beweis (Fortsetzung)
Behauptung 1: N(d) = 1 + N(d − 1) + N(d − 2) für d ≥ 2
N(d − 1)
N(d − 2)
Damit der höhenbalancierte Baum die
Tiefe d hat, muss mindestens einer seiner Unterbäume Tiefe d − 1 haben. Aus
der Balancierung folgt dann, dass der andere Unterbaum mindestens Tiefe d − 2
hat.
Außerdem müssen beide Unterbäume selbst minimale Knotenzahl haben.
Damit hat der tiefere Baum N(d − 1) Knoten und der flachere Baum
N(d − 2) Knoten.
Damit ist Behauptung 1 gezeigt.
...
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 13 / 74
Die Tiefe von AVL-Bäumen
Beweis (Fortsetzung)
Diese Ungleichung legt exponentielles Wachstum nahe.
Behauptung 2: N(d) ≥ C d für d ≥ 0 wobei C = 21 (1 +
(goldener Schnitt)
√
5) ∼ 1, 618 . . .
Wir beweisen die Behauptung 2 mittels Induktion.
Induktionsanfang:
Für d = 0 gilt N(0) = 1 = C 0 .
Für d = 1 gilt N(1) = 2 > C .
...
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 14 / 74
Die Tiefe von AVL-Bäumen
Beweis (Fortsetzung)
Induktionsbehauptung: Für alle 0 ≤ i ≤ n − 1 gilt N(i) ≥ C i .
Induktionsschritt:
N(d) = 1 + N(d − 1) + N(d − 2) ≥ 1 + C d−1 + C d−2
≥ C d−2 (C + 1)
√
Betrachtet man C = 21 (1 + 5) genauer, stellt man fest, dass C 2 = C + 1
gilt. Das führt zu
N(d) ≥ C d−2 · C 2 = C d ,
was die Behauptung beweist.
...
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 15 / 74
Die Tiefe von AVL-Bäumen
Beweis (Fortsetzung)
Ist T ein höhenbalancierter Baum der Höhe d(T ) ≥ 0 mit n Knoten, so folgt
aus C d(T ) ≤ n
d(T ) ≤ logC (n) = logC (2) · log(n).
Es gilt log C (2) = ln 2/lnC = 1, 440429 . . . was den Beweis des Satzes
abschließt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 16 / 74
Implementierung
Es müssen noch Implementierungen von delete und insert beschrieben
werden, die die Höhenbalancierung erhalten.
Jeder einzelne Baumknoten enthält fünf Einträge.
Den Schlüssel x
die Daten d
einen Zeiger left auf das linke Kind
einen Zeiger right auf das rechte
Kind
den Balancefaktor bal.
x
left
bal
d
right
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 17 / 74
Implementierung
empty() :
Erzeuge einen NULL-Zeiger
lookup(T , x) :
Wie bei einem gewöhnlichen BSB
AVL insert und AVL delete bestehen aus zwei Phasen:
In der ersten Phase werden die üblichen Operationen wie auf einem
BSB ausgeführt.
In der zweiten Phase müssen die Bäume unter Umständen rebalanciert
werden.
Die Rebalancierung erfolgt dabei rekursiv.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 18 / 74
Hilfsoperationen – Die Rechtsrotation
Die Rechtsrotation kippt eine Kante nach rechts.
v
u
y
x
v
u
y
x
⇒
T3
T1
T1
T2
T2
T3
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 19 / 74
Hilfsoperationen – Die Rechtsrotation
T
v
T′
u
y
x
v
u
y
x
T3
T1
⇒
T1
T2
T2
Ist T ein binärer Suchbaum, so auch T ′ .
Beweis: Da T ein BSB ist, gilt für alle vi ∈ Ti
key (v1 ) ≤ x ≤ key (v2 ) ≤ y ≤ key (v3 ).
Das zeigt auch die Suchbaumeigenschaft für T ′
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 20 / 74
T3
Hilfsoperationen – Die Rechtsrotation
T
v
T′
u
y
x
v
u
y
x
T3
T1
⇒
T2
T1
T2
Änderungen:
Rechtes Kind von u und linkes Kind von v
T1 wird hochgezogen
T3 wird abgesenkt
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 21 / 74
Hilfsoperationen – Die Rechtsrotation
rotateR(v)
u = left(v );
left(v ) = right(u);
right(u) = v ;
return u;
Achtung!
Die Balancefaktoren in u und v müssen noch korrigiert werden!
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 22 / 74
T3
Hilfsoperationen – Die Linksrotation
Die Linksrotation kippt eine Kante nach links.
v
u
y
x
v
u
y
x
⇒
T3
T2
T1
T1
T3
T2
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 23 / 74
Hilfsoperationen – Die Doppelrotationen
Die Links-Rechts-Doppelrotation kann auf einen Links-Rechts-Weg
angewandt werden.
z
z
v
y
⇒
u x
y
w
w
y
v
⇒ u x
u x
Erst eine Linksrotation an der unteren Kante
Dann eine Rechtsrotation an der oberen Kante
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 24 / 74
w
z
v
Hilfsoperationen – Die Links-Rechts-Doppelrotation
y w
z v
⇒
x u
y w
T1
x u
v
T4
T1
T2
z
T2
T3
T4
T3
Effekt: Der unterste Knoten des Lnks-Rechts-Weges wandert nach oben und
wird Wurzel des Teilbaumes. Die beiden anderen Knoten des Weges werden
sein linkes und rechtes Kind.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 25 / 74
Hilfsoperationen – Die Links-Rechts-Doppelrotation
rotateLR(v)
u = left(v );
w = right(u);
right(u) = left(w );
left(v ) = right(w );
left(w ) = u;
right(w ) = v ;
return w ;
Achtung!
Die Balancefaktoren in u und v müssen noch korrigiert werden!
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 26 / 74
Die Rechts-Links-Doppelrotation
Die Rechts-Links-Doppelrotation ist symmetrisch zur
Links-Rechts-Doppelrotation.
y w
z v
⇒
x u
T1
z v
x u
y w
T4
T2
T1
T2
T3
T4
T3
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 27 / 74
Ein Beispiel
Links
Links−Rechts
⇒
D
A
P
B
F
⇒
P
D
S
R
A
T
P
S
F
R
B
T
S
A
D
B
R
T
F
⇓Rechts
Rechts−Links
⇐
D
B
A
P
F
A
S
R
P
D
T
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
B
Seite 28 / 74
S
F
R
T
Einfügen in AVL-Bäume
Die Implementierung von AVL insert für AVL-Bäume besteht aus zwei
Phasen:
Das neue Schlössel-Wert-Paar wird wie in einen gewöhnlichen binären
Suchbaum eingefügt.
Anschließend wird die Balancierung geprüft.
Wenn die Balancierung nirgendwo verletzt wird, geschieht nichts
Wenn die Balancierungsbedingung irgendwo verletzt ist, gibt es auf dem
Weg vom neuen Knoten zur Wurzel (nur dort kann die Verletzung
auftreten) einen tiefsten Knoten v , an dem dies der Fall ist.
An v wird eine Einfach- oder Doppelrotation ausgeführt und dadurch die
Balancierung wieder hergestellt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 29 / 74
Ein Beispiel
Wir fügen 1, 3, 9, 11, 12, 10, 2, 6, 4, 7, 0 in einen anfänglich leeren AVL-Baum
ein.
3
3
1
1
9
1
Links
3
⇒
11
Links
⇒
11
9
12
9
12
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 30 / 74
10
Ein Beispiel
3
1
9
11
3
11
Rechts−Links
9
⇒
12
1
10
10
12
2
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 31 / 74
Ein Beispiel
9
9
2
3
11
Links−Rechts
1
11
10
12
⇒
1
3
10
6
2
4
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 32 / 74
12
Ein Beispiel
9
9
2
1
11
3
10
2
12
R−L
11
1
⇒
4
6
3
10
12
6
4
7
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 33 / 74
Ein Beispiel
9
9
2
1
11
4
3
10
4
12
Links
2
⇒
1
6
0
7
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 34 / 74
11
6
3
10
7
12
Ein Beispiel
9
4
2
1
11
6
3
0
10
7
12
4
Rechts
⇒
2
1
9
3
0
6
11
7
10
12
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 35 / 74
Einfügen in AVL-Bäume
Problem
Wie wird entschieden, welche Rotation die Balancierung wieder herstellt?
Es soll weder die globale Sicht verwendet werden, noch soll das Balancieren
durch Hinschauen bzw. Ausprobieren erreicht werden.
Benutzt werden dürfen :
Die Balancefaktoren bal(v ) in jedem Knoten
Ein Flag deeper, das als Resultat eines rekursiven Aufrufs mitteilt, ob
der bearbeitete Unterbaum tiefer geworden ist.
Die Entscheidung, welche Rotation durchgeführt wird, wird an Hand dieser
Werte gefällt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 36 / 74
Einfügen in AVL-Bäume
AVL insert(T , x, r )
Eingabe: AVL-Baum T , Schlüssel x und Daten r ;
Ausgabe: AVL-Baum T und ein Boolean deeper;
if T == NULL then
T = new AVL Tree(x, r );
return (T , true);
end
// Neuer Knoten
if T ! = NULL and key (T ) == x then
data(T ) = r ;
return (T , false);
end
// Update
(. . . )
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 37 / 74
Einfügen in AVL-Bäume
AVL insert(T , x, r ) – Fortsetzung
if T ! = NULL and key (T ) > x then
// links einfügen
// Einfügen
(left(T ), left deeper) = AVL insert(left(T ), x, r );
(T , deeper) = RebalanceInsLeft(T , left deeper);
// Rebalancierung von T
end
else if T ! = NULL and key (T ) < x then
// rechts einfügen
(right(T ), right deeper) = AVL insert(right(T ), x, r ); // Einfügen
(T , deeper) = RebalanceInsRight(T , right deeper);
// Rebalancierung von T
end
return T , deeper;
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 38 / 74
Einfügen in AVL-Bäume
Wie man sieht, wird der neue Schlüssel erst eingefügt, und dann auf dem
Rückweg zur Wurzel wieder Rebalanciert.
Dadurch fängt man immer beim untersten unbalancierten Knoten an und
wandert aufwärts.
Es bleibt festzustellen, welche Situationen auftreten können und wie sie
gelöst werden.
Wir konzentrieren uns im folgenden auf den Fall, dass der neue Knoten in
den linken Unterbaum eingefügt wird. Für den rechten Unterbaum ist das
Vorgehen symmetrisch.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 39 / 74
Einfügen in AVL-Bäume
1. Fall: left deeper = false, d.h. der linke Unterbaum wurde nicht tiefer.
T
geändert, aber
gleiche Höhe
Da sich auch die Tiefe des rechten Unterbaumes nicht geändert hat (er hat
sich gar nicht geändert), ist der Knoten T weiterhin balanciert.
Da der Teilbaum die Tiefe nicht verändert hat: deeper = false
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 40 / 74
Einfügen in AVL-Bäume
2. Fall: left deeper = true und bal(T ) = 0, d.h. der linke Unterbaum
wurde tiefer und die Unterbäume hatten gleiche Tiefe.
T
neu
Da sich die Tiefen der beiden Unterbäume nur um eins unterscheiden, bleibt
der Baum balanciert.
deeper = true und bal(T ) = −1
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 41 / 74
Einfügen in AVL-Bäume
3. Fall: left deeper = true und bal(T ) = 1, d.h. der linke Unterbaum
wurde tiefer und der rechte Unterbaum war um eins tiefer, als der linke.
T
neu
Da sich die Tiefen der beiden neuen Unterbäume nicht unterscheiden, ist der
Baum balanciert.
deeper = false und bal(T ) = 0
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 42 / 74
Einfügen in AVL-Bäume
4. Fall: left deeper = true und bal(T ) = −1, d.h. der linke Unterbaum
wurde tiefer und der linke Unterbaum war um eins tiefer, als der linke.
T
neu
Die Höhen der beiden Unterbäume unterscheiden sich um 2. Damit ist der
Baum unbalanciert.
Frage
Was nun ???
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 43 / 74
Einfügen in AVL-Bäume
Fall 4.1.: left deeper = true und bal(T ) = −1 und bal(left(T )) = −1
Rechtsrotation
T
T1
T1
T
T1,1
neu
T2
T1,1
neu
T1,2
T1,2
T2
Die Rechtsrotation zieht den linken Unterbaum eine Ebene hoch und senkt
den rechten eine Ebene ab.
deeper = false und bal(T1 ) = 0 und bal(T ) = 0 und die neue Wurzel ist
T1 .
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 44 / 74
Einfügen in AVL-Bäume
Fall 4.2.: left deeper = true und bal(T ) = −1 und bal(left(T )) = 1
Links − Rechts
T
T1
T1,2
T1
T
T1,2
T2
T1,1
T′
neu
T′
neu
T1,1
T ′′
neu
T ′′
neu
T2
Die Links-Rechts-Rotation zieht die mittleren Unterbäume eine Ebene hoch
und senkt den rechten eine Ebene ab.
deeper = false und die neuen Balancefaktoren wie folgt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 45 / 74
Einfügen in AVL-Bäume
Neue Balancierung hängt von der Balancierung von T1,2 = right(left(T )) ab.
Links − Rechts
T
T1
T1,2
T1
T
T1,2
T2
T1,1
T′
neu
T ′′
neu
T1,1
T′
neu
T ′′
neu
Falls bal(T1,2 ) = 0 haben T ′ und T ′′ dieselbe Tiefe, wie T1,1 und T2 .
bal(T1 ) = 0 und bal(T ) = 0 und bal(T1,2 ) = 0
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 46 / 74
T2
Einfügen in AVL-Bäume
Links − Rechts
T
T1
T1,2
T1
T
T1,2
T2
T1,1
T′
neu
T′
neu
T1,1
T ′′
T ′′
T2
Falls bal(T1,2 ) = −1
bal(T1 ) = 0 und bal(T ) = 1 und bal(T1,2 ) = 0
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 47 / 74
Einfügen in AVL-Bäume
Links − Rechts
T
T1
T1,2
T1
T
T1,2
T2
T1,1
T′
T ′′
neu
T′
T1,1
T ′′
neu
Falls bal(T1,2 ) = 1
bal(T1 ) = −1 und bal(T ) = 0 und bal(T1,2 ) = 0
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 48 / 74
T2
Einfügen in AVL-Bäume
Insgesamt ergibt sich die folgende Tabelle für den Fall 4.2.:
bal(right(left(T))
-1
0
1
bal(T’)
0
0
0
bal(left(T’))
0
0
-1
bal(right(T’))
1
0
0
Dabei ist T die ursprüngliche Wurzel des Teilbaumes und T ′ die neue
Wurzel.
Das Ergebnis hängt also vom Balancefaktor von right(left(T )) vor der
Rotation, aber nach dem Einfügen ab!
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 49 / 74
Einfügen in AVL-Bäume
Faustregel für das Rotieren
Wenn ein äußerer Teilbaum zu tief wird hilft eine einfache Rotation.
Diese hebt den Teilbaum um eine Ebene an.
Wenn ein mittlerer Teilbaum zu tief wird hilft eine Doppelrotation.
Diese hebt den mittleren Teilbaum um eine Ebene an.
Die rekursive Abarbeitung rebalanciert von unten nach oben.
Beobachtung
Nach dem ersten Auftreten des 4. Falles, gilt stets deeper = false und
somit findet keine weitere Rebalancierung statt.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 50 / 74
Einfügen in AVL-Bäume
Lemma
Die rekursive Prozedur AVL insert(T , x, r ) führt auf AVL-Bäumen die
Wörterbuchoperation insert korrekt durch.
AVL insert hat Laufzeit O(log n) und führt höchstens eine Einfach- oder
Doppelrotation durch.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 51 / 74
Löschen aus AVL-Bäumen
Das Löschen in AVL-Bäumen läuft im Prinzip ähnlich ab, wie das Einfügen:
Der Eintrag wird wie in gewöhnlichen binären Suchbäumen gelöscht.
Der Baum wird anschließend von unten nach oben rebalanciert.
Statt eines deeper-Flags benutzen wir aber ein shallower-Flag, das
anzeigt, ob der Baum flacher geworden ist.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 52 / 74
Löschen aus AVL-Bäume
Wenn der Knoten T mit den zu löschenden Schlüssel x gefunden ist, können
drei Fälle eintreten.
Fall 1: Der Knoten T hat keinen linken Unterbaum, d.h. left(T ) = NULL.
T
T2
Dann kann man einfach den rechten Teilbaum zurückgeben.
shallower = true
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 53 / 74
Löschen aus AVL-Bäume
Fall 2:
Der Knoten T hat keinen rechten Unterbaum, d.h. right(T ) = NULL.
T
T1
Dann kann man einfach den linken Teilbaum zurückgeben.
shallower = true
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 54 / 74
Löschen aus AVL-Bäume
Fall 3:
Der Knoten T hat beide Unterbäume.
T
T1
T2
Wie bei gewöhnlichen binären Suchbäumen löscht man in diesem Fall den
kleinsten Schlüssel aus dem rechten Unterbaum und verschiebt ihn
stattdessen in die Wurzel.
Ob der Baum flacher wird hängt dabei von der Postion des minimalen
Schlüssels im rechten Unterbaum ab.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 55 / 74
Löschen aus AVL-Bäume
AVL delete(T , x, r )
Eingabe: AVL-Baum T , Schlüssel x;
Ausgabe: AVL-Baum T und ein Boolean shallower;
if T == NULL then
return (T , false);
end
// nicht vorhanden
if T ! = NULL and key (T ) > x then
// Update
(left(T ), left shallower) = AVL delete(left(T ), x);
(T , shallower) = RebalanceDelLeft(T , left shallower);
return (T , shallower);
end
(. . . )
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 56 / 74
Löschen aus AVL-Bäumen
AVL delete(T , x, r ) – Fortsetzung
if T ! = NULL and key (T ) < x then
// Update
(right(T ), right shallower) = AVL delete(right(T ), x);
(T , shallower) = RebalanceDelRight(T , right shallower);
return (T , shallower);
end
if T ! = NULL and key (T ) == x then
if left(T ) == NULL then return (right(T ), true);
// Entferne Wurzel
if right(T ) == NULL then return (left(T ), true);
(right(T ), x, r , right shallower) = AVL deleteMin(T );
key (T ) = x, data(T ) = r ;
return RebalanceDelRight(T , right shallower);
end
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 57 / 74
Extraktion des Minimums
Die Prozedur AVL deleteMin(T ) hat vier Rückgabewerte
(S, x, r , shallower):
S ist der resultierende AVL-Baum nach dem Löschen des Minimums
x und r sind die Werte des gelöschten minimalen Schlüssel-Wert-Paares
shallower gibt an, ob der Baum durch das Löschen flacher geworden
ist.
Um das Minimum zu finden, müssen wir – wie in gewöhnlichen binären
Suchbäumen – immer nach links gehen, bis es kein linkes Kind mehr gibt.
D.h. wir müssen zwei Fälle bezglüch left(T ) unterscheiden.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 58 / 74
Extraktion des Minimums
Fall 1: left(T ) = NULL, d.h. T enthält das Minimum.
In diesem Fall können wir einfach den rechten Teilbaum als Wurzel
zurückgeben.
S = right(T ) und x = key (T ) und r = data(T ) und shallower = true.
Fall 2: left(T ) 6= NULL
In dieser Situation müssen wir das Minimum im linken Unterbaum löschen
und anschließend Rebalancieren.
(S, x, r , left shallower) = AVL deleteMin(left(T ));
(S, shallower) = RebalanceDelLeft(T , left shallower);
return (S, x, r , shallower);
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 59 / 74
Die Rebalancierung nach dem Löschen
Wir beschränken uns wieder auf den Fall, dass das Element im linken
Unterbaum gelöscht wurde. Für den rechten Unterbaum ergibt der
Algorithmus durch Spiegelung.
Löschen
⇒
T
T1
T1′
T2
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
T
Seite 60 / 74
T2
Die Rebalancierung nach dem Löschen
Fall 1:
Falls left shallower = false ändert sich auch die Tiefe und die
Balancierung von T nicht, d.h.
shallower = false
Fall 2: Falls left shallower = true und bal(T ) = −1 wurde der Linke
Teilbaum flacher und die Balancierung ändert sich.
T
shallower = true und bal(T ) = 0
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 61 / 74
Die Rebalancierung nach dem Löschen
Fall 3:
Falls left shallower = true und bal(T ) = 0 wurde der Linke Teilbaum
flacher und die Balancierung ändert sich.
T
shallower = false und bal(T ) = 1
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 62 / 74
Die Rebalancierung nach dem Löschen
Fall 4:
Falls left shallower = true und bal(T ) = 1 wurde der Linke Teilbaum
flacher und die Balancierung ändert sich.
T
shallower = false
Der Baum muss – je nach Form des rechten Unterbaumes – rebalanciert
werden.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 63 / 74
Die Rebalancierung nach dem Löschen
Fall 4.1: bal(right(T )) = 0
Links
T
S
S
T
T1
T2,2
T1
T2,1
T2,2
T2,1
bal(T ) = 1 und bal(S) = −1 und shallower = false
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 64 / 74
Die Rebalancierung nach dem Löschen
Fall 4.1: bal(right(T )) = 1
Links
T
S
S
T
T1
T2,1
T1
T2,1
T2,2
bal(T ) = 0 und bal(S) = 0 und shallower = true
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 65 / 74
Die Rebalancierung nach dem Löschen
Fall 4.1: bal(right(T )) = −1
T
S
T1
T2,2
T2,1
Der mittlere Baum muss angehoben werden. Damit erfolgt eine
Doppelrotation.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 66 / 74
T2,2
Die Rebalancierung nach dem Löschen
Fall 4.1: bal(right(T )) = −1
Links − Rechts
T
S
R
T
S
R
′
T2,1
T1
′
T2,1
′′
T2,1
T2,2
′′
T2,1
T2,2
T1
shallower = true
Die Balancefaktoren müssen in Abhängigkeit von bal(R) angepasst werden.
alt
bal(R)
-1
0
1
bal(R)
0
0
0
neu
bal(T)
0
0
-1
bal(S)
1
0
0
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 67 / 74
Löschen in AVL-Bäumen
Lemma
Die Prozedure 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 aus.
Satz
In AVL-Bäumen kostet jede Wörterbuchoperation Zeit O(log n), wobei n die
Anzahl der Wörterbucheinträge ist.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 68 / 74
Ein Beispiel
Im Gegensatz zum Einfügen, kann das Löschen eines Knotens zu mehreren
Einfach- und Doppel-Rotationen führen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 70 / 74
Ein Beispiel
Im Gegensatz zum Einfügen, kann das Löschen eines Knotens zu mehreren
Einfach- und Doppel-Rotationen führen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 71 / 74
Ein Beispiel
Im Gegensatz zum Einfügen, kann das Löschen eines Knotens zu mehreren
Einfach- und Doppel-Rotationen führen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 72 / 74
Ein Beispiel
Im Gegensatz zum Einfügen, kann das Löschen eines Knotens zu mehreren
Einfach- und Doppel-Rotationen führen.
Algorithmen und Datenstrukturen SS09
M. Brinkmeier
TU Ilmenau
Seite 73 / 74
Herunterladen