nil then return

Werbung
Datenstrukturen und Algorithmen
Christian Sohler
FG Algorithmen & Komplexität
1
Ein Datenbank-Problem
Problem:
• Gegeben sind n Objekte O1,.., O n mit zugehörigen
Schlüsseln s(O i )
Operationen:
• Suche(x); Ausgabe O mit Schlüssel s(O) =x;
nil, falls kein Objekt mit Schlüssel x in Datenbank
• Einfügen(O); Einfügen von Objekt O in Datenbank
• Löschen(O); Löschen von Objekt O mit aus der
Datenbank
2
Ein Datenbank-Problem
Binäre Suchbäume:
• Ausgabe aller Elemente in O(n)
• Suche, Minimum, Maximum, Nachfolger in O(h)
• Einfügen, Löschen in O(h)
Frage:
• Wie kann man eine „kleine“ Höhe unter Einfügen und
Löschen garantieren?
3
Ein Datenbank-Problem
AVL-Bäume
• Ein Baum heißt AVL-Baum, wenn für jeden Knoten gilt:
Die Höhe seines linken und rechten Teilbaums
unterscheidet sich höchstens um 1.
4
Ein Datenbank-Problem
Satz 21
Für jeden AVL-Baum der Höhe h mit n Knoten gilt:
(3/2)h ≤ n ≤ 2h+1 -1
5
Ein Datenbank-Problem
Satz 21
Für jeden AVL-Baum der Höhe h mit n Knoten gilt:
(3/2)h ≤ n ≤ 2h+1 -1
Korollar 22:
Ein AVL-Baum mit n Knoten hat Höhe Θ(log n).
6
Ein Datenbank-Problem
Rotationen:
y
x
x
C
A
y
Rechtsrotation(T,y)
B
Linksrotation(T,x)
A
B
C
7
Ein Datenbank-Problem
Beispiel 1:
15
15
21
9
7
x
17
y Rechtsrotation(T,y)
27
19
20
19
9
7
x
21 y
17
27
20
8
Ein Datenbank-Problem
Beispiel 2:
x
y
21
15
y
x
Linksrotation(T,x)
21
9
27
19
7
17
20
27
15
9
7
19
17
20
9
Ein Datenbank-Problem
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
10
Ein Datenbank-Problem
Annahme: x hat
rechtes Kind.
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
11
Ein Datenbank-Problem
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
x
15
21
9
27
19
7
17
20
12
Ein Datenbank-Problem
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
x
15
21
9
y
27
19
7
17
20
13
Ein Datenbank-Problem
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
x
15
21
9
y
27
19
7
17
20
14
Ein Datenbank-Problem
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
x
15
21
9
y
27
19
7
17
20
15
Ein Datenbank-Problem
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
x
15
nil
21
9
y
27
19
7
17
20
16
Ein Datenbank-Problem
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
root[T]
x
15
nil
21
9
y
27
19
7
17
20
17
Ein Datenbank-Problem
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
root[T]
x
15
nil
21
9
y
27
19
7
17
20
18
Ein Datenbank-Problem
root[T]
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
nil
21
y
x
15
27
9
19
7
17
20
19
Ein Datenbank-Problem
root[T]
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
nil
21
y
x
15
27
9
19
7
17
20
20
Ein Datenbank-Problem
root[T]
Linksrotation(T,x)
1. y ← rc[x]
2. rc[x] ← lc[y]
3. if lc[y]≠nil then p[lc[y]] ← x
4. p[y] ← p[x]
5. if p[x]=nil then root[T] ← y
6. else if x=lc[p[x]] then lc[p[x]] ← y
7. else rc[p[x]] ← y
8. lc[y] ← x
9. p[x] ← y
Laufzeit: O(1)
nil
21
y
x
15
27
9
19
7
17
20
21
Ein Datenbank-Problem
Dynamische AVL-Bäume
• Operationen Suche, Einfügen, Löschen, Min/Max,
Vorgänger/Nachfolger,… wie in der letzten Vorlesung
• Laufzeit O(h) für diese Operationen
• Nur Einfügen/Löschen verändern Struktur des Baums
Idee:
• Wir brauchen Prozedur, um AVL-Eigenschaft nach
Einfügen/Löschen wiederherzustellen.
22
Ein Datenbank-Problem
Dynamische AVL-Bäume
Nach Korollar 22 gilt
= Θ(log n)
• Operationen Suche, hEinfügen,
Löschen, Min/Max,
Vorgänger/Nachfolger,… wie in der letzten Vorlesung
• Laufzeit O(h) für diese Operationen
• Nur Einfügen/Löschen verändern Struktur des Baums
Idee:
• Wir brauchen Prozedur, um AVL-Eigenschaft nach
Einfügen/Löschen wiederherzustellen.
23
Ein Datenbank-Problem
Definition:
• Ein Baum heißt beinahe-AVL-Baum, wenn die AVLEigenschaft in jedem Knoten außer der Wurzel erfüllt ist
und die Höhe der Unterbäume der Wurzel um höchstens
2 unterscheidet.
24
Ein Datenbank-Problem
Problem:
• Umformen eines beinahe-AVL-Baums in einen AVLBaum mit Hilfe von Rotationen
• O.b.d.A.: Linker Teilbaum der Wurzel höher als der
rechte
25
Ein Datenbank-Problem
Fall 1:
y
x
C
H
A
B
H-1
H oder
H-1
26
Ein Datenbank-Problem
Fall 1:
y
Rechtsrotation(T,y)
x
y
x
C
H
A
B
H oder
H-1
H-1 H
A
H oder
H-1
B
C
H-1
27
Ein Datenbank-Problem
Fall 2:
y
x
C
H-1
A
H-1
H
B
28
Ein Datenbank-Problem
Fall 2:
y
x
C
H-1
A
H-1
H
B
29
Ein Datenbank-Problem
Fall 2:
y
x
C
H-1
z
H-1
H
A
H-2
oder
H-1
B‘
B‘‘
H-2
oder
H-1
30
Ein Datenbank-Problem
Fall 2:
y
y
Linksrotation(T,x)
z
x
C
H-1
H-1
C
x
z
H-1
H
A
H-2
oder
H-1
B‘‘
B‘
B‘‘
H-2
oder H-1
H-1
B‘
A
H-2
oder
H-1
H-2
oder
H-1
31
Ein Datenbank-Problem
Fall 2:
z
y
Rechtsrotation(T,x)
z
x
C
y
H-1
x
B‘‘
H-1
B‘
A
H-2
oder
H-1
H-2
oder
H-1
B‘
B‘‘
C
A
32
Ein Datenbank-Problem
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
y
x
H-1
C
H
A
B
H oder
H-1
33
Ein Datenbank-Problem
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
y
x
H-1
C
H
A
B
H oder
H-1
34
Ein Datenbank-Problem
h gibt Höhe des Teilbaums an.
Dies müssen wir zusätzlich in
unserer Datenstruktur aufrecht
erhalten.
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
y
x
H-1
C
H
A
B
H oder
H-1
35
Ein Datenbank-Problem
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
y
x
H-1
C
H
A
B
H oder
H-1
36
Ein Datenbank-Problem
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
x
y
A
B
C
37
Ein Datenbank-Problem
Balance(T)
1. t ← root[T]
2. if h[lc[t]] > h[rc[t]]+1 then
3. if h[lc[lc[t]]]< h[rc[lc[t]]] then
4.
Linksrotation(lc[t])
5. Rechtsrotation(t)
6. else if h[rc[t]]> h[lc[t]]+1 then
7. if h[rc[rc[t]]]< h[lc[rc[t]] then
8.
Rechtsrotation(rc[t])
9. Linksrotation(t)
Laufzeit: O(1)
x
y
A
B
C
38
Ein Datenbank-Problem
Kurze Zusammenfassung:
• Wir können aus einem beinahe-AVL-Baum mit Hilfe von
maximal 2 Rotationen einen AVL-Baum machen
• Dabei erhöht sich die Höhe des Baums nicht
Einfügen:
• Wir fügen ein wie früher
• Dann laufen wir den Pfad zur Wurzel zurück
• An jedem Knoten balancieren wir, falls der Unterbaum
ein beinahe-AVL-Baum ist
39
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
9
6
Einfügen 2
40
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
9
6
Einfügen 2
41
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
9
6
Einfügen 2
42
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
9
6
Einfügen 2
43
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
9
6
Einfügen 2
44
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
9
6
Einfügen 2
45
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
9
6
Einfügen 2
46
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
nil
9
6
Einfügen 2
47
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
Neuen Knoten erzeugen.
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
Zusätzlich noch Zeiger
lc[t] und rc[t] auf nil
5. else return ¾ Schlüssel schon vorhanden
setzen, sowie p[t] und
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
den Zeiger von p[t]
8
setzen.
7. Balance(t)
5
3
2
9
6
Einfügen 2
48
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
h[nil] definieren wir als 0.
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
2
9
6
Einfügen 2
49
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
2
9
6
Einfügen 2
50
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
2
9
6
Einfügen 2
51
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
2
9
6
Einfügen 2
52
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
7. Balance(t)
5
3
2
9
6
Einfügen 2
53
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
2
8
6
Einfügen 2
9
54
Ein Datenbank-Problem
AVL-Einfügen(t,x)
1. if t=nil then
2. t ← new node(x); return
3. else if key[x]<key[t] then AVL-Einfügen(lc[t],x)
4. else if key[x]>key[t] then AVL-Einfügen(rc[t],x)
5. else return ¾ Schlüssel schon vorhanden
6. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
5
7. Balance(t)
3
Laufzeit:
• O(h) = O(log n)
2
8
6
Einfügen 2
9
55
Ein Datenbank-Problem
Korrektheit(Skizze):
• Induktion über die Länge des Suchpfads (startend vom
eingefügten Blatt):
• Einfügen in einen leeren Baum funktioniert
• T nicht leer, dann wird x in einen der beiden Teilbäume
eingefügt
• Nach Ind. Ann. sind diese Teilbäume bereits AVLBäume und unterscheiden sich nur um maximal 2 in
ihrer Höhe
• Falls die AVL-Eigenschaft nicht erhalten bleibt,
56
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
2. else if k>key then AVL-Löschen(rc[t],x)
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(key[u],lc[t])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
5
3
8
9
6
57
k bezeichnet Schlüssel
des zu löschenden
Elements.
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
2. else if k>key then AVL-Löschen(rc[t],x)
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(key[u],lc[t])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
Löschen(3)
5
3
8
9
6
58
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
2. else if k>key then AVL-Löschen(rc[t],x)
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(key[u],lc[t])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
Löschen(3)
5
3
8
9
6
59
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
2. else if k>key then AVL-Löschen(rc[t],x)
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(key[u],lc[t])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
Löschen(3)
5
3
8
9
6
60
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
Und die anderen
2. else if k>key then AVL-Löschen(rc[t],x)
Zeiger aktualisieren
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
Löschen(3)
8.
AVL-Löschen(key[u],lc[t])
5
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
nil
10.Balance(t)
9
6
61
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
2. else if k>key then AVL-Löschen(rc[t],x)
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
Oder h[t]=0,
7.
Kopiere Informationen von ufalls
nach
t=nil t
Löschen(3)
8.
AVL-Löschen(key[u],lc[t])
5
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
8
nil
10.Balance(t)
9
6
62
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
2. else if k>key then AVL-Löschen(rc[t],x)
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
Löschen(3)
8.
AVL-Löschen(key[u],lc[t])
Nichts zu tun,
5
da Baum leer.
9. h[t] = 1 + max{h[lc[t]],
h[rc[t]]}
8
nil
10.Balance(t)
9
6
63
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
2. else if k>key then AVL-Löschen(rc[t],x)
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(key[u],lc[t])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
Löschen(3)
5
8
9
6
64
Ein Datenbank-Problem
AVL-Löschen(t,x)
1. if k<key[t] then AVL-Löschen(lc[t],x)
2. else if k>key then AVL-Löschen(rc[t],x)
3. else if t=nil then return ¾ x nicht im Baum
4. else if lc[t]=nil then ersetze t durch rc[t]
5. else if rc[t]=nil then ersetze t durch rc[t]
6. else u=MaximumSuche(lc[t])
7.
Kopiere Informationen von u nach t
8.
AVL-Löschen(key[u],lc[t])
9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}
10.Balance(t)
5
Löschen(3)
8
9
6
65
Ein Datenbank-Problem
Korrektheit:
• Ähnlich wie beim Einfügen
Satz 23:
Mit Hilfe von AVL-Bäumen kann man Suche, Einfügen,
Löschen, Minimum und Maximum in einer Menge von n
Zahlen in Θ(log n) Laufzeit durchführen.
66
Ein Datenbank-Problem
Zusammenfassung und Ausblick:
• Effiziente Datenstruktur für das Datenbank Problem mit
Hilfe von Suchbäumen
• Kann man eine bessere Datenstruktur finden?
• Was muss man ggf. anders machen?
(untere Schranke für vergleichsbasierte Strukturen)
67
Herunterladen