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