• Keine Ergebnisse gefunden

Ein Datenbank-Problem

N/A
N/A
Protected

Academic year: 2022

Aktie "Ein Datenbank-Problem"

Copied!
67
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Datenstrukturen und Algorithmen

Christian Sohler

FG Algorithmen & Komplexität

(2)

Ein Datenbank-Problem

Problem:

• Gegeben sind n Objekte O ,.., O mit zugehörigen Schlüsseln s(O )

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

1 n

i

(3)

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?

(4)

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.

(5)

Ein Datenbank-Problem

Satz 21

Für jeden AVL-Baum der Höhe h mit n Knoten gilt:

(3/2) ≤

h

n ≤ 2 -1

h+1

(6)

Ein Datenbank-Problem

Satz 21

Für jeden AVL-Baum der Höhe h mit n Knoten gilt:

(3/2) ≤ n ≤ 2 -1

Korollar 22:

Ein AVL-Baum mit n Knoten hat Höhe Θ(log n).

h h+1

(7)

Ein Datenbank-Problem

Rotationen:

y

x

A B

C

C A

B x

Rechtsrotation(T,y) y

Linksrotation(T,x)

(8)

Ein Datenbank-Problem

Beispiel 1:

7

20 9

15

17

19 27

21

7

20 9

15

17 21

19

27 Rechtsrotation(T,y)

y x

x y

(9)

Ein Datenbank-Problem

Beispiel 2:

7

20 9

15

17

19 27

21 x

y Linksrotation(T,x)

9

20 15

21

7 17

19

27 x

y

(10)

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

(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

Annahme: x hat rechtes Kind.

(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

7

20 9

15

17

19 27

21 x

(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

7

20 9

15

17

19 27

21 x

y

(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

7

20 9

15

17

19 27

21 x

y

(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

7

20 9

15

17

19 27

21 x

y

(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

7

20 9

15

17

19 27

21 x

y nil

(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

7

20 9

15

17

19 27

21 x

y nil

root[T]

(18)

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

7

20 9

15

17

19 27

21 x

y nil

root[T]

(19)

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

Ein Datenbank-Problem

7

20 9

15

17

27

19

21 x

y nil

root[T]

(20)

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

Ein Datenbank-Problem

7

20 9

15

17

27

19

21 x

y nil

root[T]

(21)

Ein Datenbank-Problem

21

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

7

20 9

15

17

27

19

21 x

y nil

root[T]

Laufzeit:

O(1)

(22)

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.

(23)

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.

Nach Korollar 22 gilt h = Θ(log n)

(24)

Ein Datenbank-Problem

Definition:

• Ein Baum heißt beinahe-AVL-Baum, wenn die AVL-

Eigenschaft in jedem Knoten außer der Wurzel erfüllt ist und die Höhe der Unterbäume der Wurzel um höchstens 2 unterscheidet.

(25)

Ein Datenbank-Problem

Problem:

• Umformen eines beinahe-AVL-Baums in einen AVL- Baum mit Hilfe von Rotationen

• O.b.d.A.: Linker Teilbaum der Wurzel höher als der rechte

(26)

Ein Datenbank-Problem

Fall 1:

y

x

A B

C H-1

H oder H H-1

(27)

Ein Datenbank-Problem

Fall 1:

x

y

B C A

y

x

A B

C

Rechtsrotation(T,y)

H-1 H

H oder H-1

H-1 H oder

H H-1

(28)

Ein Datenbank-Problem

Fall 2:

y

x

A B

C H-1

H-1 H

(29)

Ein Datenbank-Problem

Fall 2:

y

x

A B

C H-1

H-1 H

(30)

Ein Datenbank-Problem

Fall 2:

y

x

A

C H-1

H-1 H

z

B‘ B‘‘

H-2 oder

H-1 H-2

oder

(31)

Ein Datenbank-Problem

Fall 2:

y

x

A

C

H-1

H-1 H

z

B‘ B‘‘

H-2 oder

H-1 y

C z

B‘‘

x

H-1 A B‘

H-2 oder

H-1

H-2 oder

H-1

H-1

H-2 oder

H-1 Linksrotation(T,x)

(32)

Ein Datenbank-Problem

Fall 2:

H-1

H-2 oder

H-1 y

C z

B‘‘

x

H-1 A B‘

H-2 oder

H-1

z

y

C x

B‘‘

B‘

A Rechtsrotation(T,x)

(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

A B

C H-1

H oder H H-1

(34)

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

A B

C H-1

H oder H 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

A B

C H-1

H oder H H-1

h gibt Höhe des Teilbaums an.

Dies müssen wir zusätzlich in unserer Datenstruktur aufrecht

erhalten.

(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)

y

x

A B

C H-1

H oder H H-1

(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)

y x

A

B C

(38)

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

A

B C

(39)

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

(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]]}

7. Balance(t) 8

5 9

3 6

(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]]}

7. Balance(t) 8

5 9

3 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]]}

7. Balance(t) 8

5 9

3 6

(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]]}

7. Balance(t) 8

5 9

3 6

Einfügen 2

(44)

Ein Datenbank-Problem

3

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]]}

7. Balance(t) 8

5 9

6

(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]]}

7. Balance(t)

3

8

5 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]]}

7. Balance(t)

3

8

5 9

6

(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) 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]]}

7. Balance(t)

3

8

5 9

6 nil 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) 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]]}

7. Balance(t)

3

8

5 9

6

Neuen Knoten erzeugen.

Zusätzlich noch Zeiger lc[t] und rc[t] auf nil setzen, sowie p[t] und

den Zeiger von p[t]

setzen.

(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]]}

7. Balance(t)

3

8

5 9

6 Einfügen 2 2

h[nil] definieren wir als 0.

(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]]}

7. Balance(t)

3

8

5 9

6

(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]]}

7. Balance(t)

3

8

5 9

6 2 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]]}

7. Balance(t)

3

8

5 9

6

(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]]}

7. Balance(t)

3

8

5 9

6 2 Einfügen 2

(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]]}

7. Balance(t)

3 8

5

6 9 2

(55)

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]]}

7. Balance(t)

Laufzeit:

• O(h) = O(log n)

3 8

5

6 9 2

Einfügen 2

(56)

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 AVL- Bäume und unterscheiden sich nur um maximal 2 in ihrer Höhe

• Falls die AVL-Eigenschaft nicht erhalten bleibt,

(57)

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) 3 8

5

6 9

(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) 3 8

5 k bezeichnet Schlüssel

des zu löschenden Elements.

Löschen(3)

(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) 3 8

5

6 9

Löschen(3)

(60)

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) 3 8

5

Löschen(3)

(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])

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) 8

5

6 9

Löschen(3)

nil

Und die anderen Zeiger aktualisieren

(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 8. AVL-Löschen(key[u],lc[t])

9. h[t] = 1 + max{h[lc[t]], h[rc[t]]}

10.Balance(t) 8

5

Löschen(3)

nil Oder h[t]=0,

falls t=nil

(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) 8

5

6 9

Löschen(3)

nil Nichts zu tun,

da Baum leer.

(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) 8

5

Löschen(3)

(65)

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)

8

5 9

6

Löschen(3)

(66)

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.

(67)

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)

Referenzen

ÄHNLICHE DOKUMENTE

Formulieren Sie mindestens zwei Eigenschaften, die für die Funktionen gelten müssen, und implementieren Sie diese wie in Aufgabe 1 in einer Funktion mit Wertebereich Bool, welche

nicht herum: Als Melodie- träger darf eine ehrwürdige Ziehharmonika dabeisein, für den Rhythmus legen sich eine große und eine kleine Trommel, von Bek- ken unterstützt, schwer ins

Ich bin davon überzeugt, daß durch die vorerwähnte Maßnahme sich in erhebli- chem Umfang schon vor Beginn des Medizinstudi- ums die „Spreu vom Wei- zen&#34; sondern und dadurch

[r]

Nachdem die Ergebnisse aller Gruppen ausgewertet worden sind, zeigt sich, dass einige Merkmale für alle Pflanzen zu treffen, obwohl sie sehr unterschiedlich aussehen:

Nachdem aber die Heilkraft der Teufelskralle auch bei uns im letzten Jahrhundert be- kannt und ihr Einsatz immer beliebter wurde, begann eine zunehmende Übernutzung der

R osenwurz (Rhodiola rosea L.) ist eine widerstandsfähige Pflanze, die bevor- zugt in arktischen und höher gelegenen Regionen Europas, Nordamerikas und Asiens zu finden ist,

Originalveröffentlichung in: Mitteilungen des Deutschen Archäologischen Instituts, Abteilung Kairo 20,