Praktische Informatik I - Algorithmen und Datenstrukturen 5 Wintersemester 2006/07 Bäume 5.1 Suchbäume Sei T = (V; E ) ein geordneter binärer Wurzelbaum. Sei s : V ! S eine Abbildung der Knotenmenge V in eine vollständig geordnete Schlüsselwertmenge S . T heißt (schwach) sortiert, g.d.w. gilt: 8 v; v0 2 V : ( v0 2 T (v) ) s(v0) < () s(v) ) ^ ( v0 2 T (v) ) s(v0) > () s(v) ) l r Falls T sortiert ist, so wird T auch kurz Suchbaum genannt. Prof. Dr. Dietmar Seipel 211 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiel S = f 2; 5; 6; 7; 8; 12; 13; 14; 15 g 12 7 5 2 Prof. Dr. Dietmar Seipel 15 8 6 13 14 212 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Durchläuft man die Knoten eines Suchbaumes T = (V; E ) in LWR–Ordnung, so durchläuft man die Schlüsselwerte monoton steigend: T ist (schwach) sortiert , ( 8 v; v0 2 V : ( s(v) < () s(v0 ) , v <LWR v0 ) ) Deshalb kann man mit einem Suchbaum sortieren. Offensichtlich sind in einem Suchbaum alle repräsentierten Schlüssel paarweise verschieden: 8 v; v 0 2 V : v 6= v 0 ) s(v ) 6= s(v 0 ): Wir wollen nun folgende Operationen auf Suchbäume betrachten: Suchen, Einfügen und Löschen eines Schlüsselwerts s, Generierung eines Suchbaumes zur Repräsentation einer Menge von Schlüsselwerten. Prof. Dr. Dietmar Seipel 213 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Implementierung BinTreeNode /** * Knoten eines binaeren Baumes */ public class BinTreeNode { /** Schluesselwert */ int key; /** Linker Sohnknoten */ BinTreeNode lson; /** Rechter Sohnknoten */ BinTreeNode rson; Prof. Dr. Dietmar Seipel 214 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTreeNode /** * Konstruktor. */ BinTreeNode(int v) { key = v; lson = rson = null; } Prof. Dr. Dietmar Seipel 215 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTreeNode /** * Gibt die Anzahl der Soehne des Knotens * zurueck (0, 1 oder 2) */ int countSons() { if (lson == null) return (rson == null)?0:1; else return (rson == null)?1:2; } Prof. Dr. Dietmar Seipel 216 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTreeNode /** * Liefert true, falls der Knoten ein * Blatt ist, d.h. keine Kinder hat */ boolean isLeaf() { return (lson == null) && (rson == null); } Prof. Dr. Dietmar Seipel 217 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTreeNode /** * Liefert true, falls der Knoten keinen * Sohn auf der Seite hat, in der der Schluessel * s zu suchen waere */ boolean isLeaf(int s) { return ( (key > s) && (lson == null) ) || ( (key < s) && (rson == null) ); } Prof. Dr. Dietmar Seipel 218 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTreeNode /** * Liefert eine Textausgabe des Objektes, siehe * {@link java.lang.Object#toString} */ public String toString() { return "[" + key + "]"; } } Prof. Dr. Dietmar Seipel 219 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Binärer Suchbaum */ public class BinSearchTree { /** der Wurzelknoten */ BinTreeNode root = null; /** * Leerer Konstruktor * erzeugt einen leeren Suchbaum */ public BinSearchTree() { root = null; } Prof. Dr. Dietmar Seipel 220 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Generiert einen neuen binären * Suchbaum aus dem Array s */ public BinSearchTree(int[] s) { for (int i = 0; i < s.length; i++) insert(s[i]); } Prof. Dr. Dietmar Seipel 221 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Sucht den Knoten mit Schlüssel s * im Teilbaum von p */ BinTreeNode search(BinTreeNode p, int s) { BinTreeNode q = null; if (p != null) { if (p.key == s) { q = p; Prof. Dr. Dietmar Seipel 222 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree } else { if (p.key > s) { q = search(p.lson, s); } else { q = search(p.rson, s); } } } return q; } Prof. Dr. Dietmar Seipel 223 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Sucht den Knoten mit Schlüssel s im Baum. */ BinTreeNode search(int s) { return search(root, s); } Prof. Dr. Dietmar Seipel 224 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Einfügen eines neuen Blattes mit Schlüssel * s in den Teilbaum von p */ void insert(BinTreeNode p, int s) { BinTreeNode q = p, r = null; while ( (q != null) && (q.key != s) ) { r = q; if (q.key > s) q = r.lson; else q = r.rson; } Prof. Dr. Dietmar Seipel 225 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree // Abbruch bei vorhandenem Schlüssel if (q != null) return; if (r.key > s) r.lson = new BinTreeNode(s); else r.rson = new BinTreeNode(s); } Prof. Dr. Dietmar Seipel 226 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Fügt ein neues Blatt mit Schlüssel * s in den Baum ein */ void insert(int s) { if (root != null) { insert(root, s); } else { root = new BinTreeNode(s); } } Prof. Dr. Dietmar Seipel 227 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Löscht den Knoten mit Schlüssel s aus dem Baum */ void remove(int s) { BinTreeNode v = root, w = null, t; // Suche Knoten v mit Schlüssel s // (w ist Vater von v) while ( (v != null) && (v.key != s) ) { w = v; if (v.key > s) v = v.lson; else v = v.rson; } Prof. Dr. Dietmar Seipel 228 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree //Abbruch, falls Schlüssel nicht gefunden if (v == null) return; switch (v.countSons()) { case 0: changeSon(w, v, null); break; case 1: //Der einzige Sohn von v ist t t = (v.lson == null)?v.rson:v.lson; // v durch einzigen Sohn t ersetzen changeSon(w, v, t); break; Prof. Dr. Dietmar Seipel 229 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree case 2: // v durch v.lson ersetzen changeSon(w, v, v.lson); // rechtesten Knoten suchen t = findRight(v.lson); // rechten Sohn von v an t hängen t.rson = v.rson; break; } } Prof. Dr. Dietmar Seipel 230 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Tauscht den Sohn v von w gegen den Knoten x. */ void changeSon(BinTreeNode w, BinTreeNode v, BinTreeNode x) { if (w == null) { if (v != root) return; root = x; } else { if (w.lson == v) w.lson = x; else if (w.rson == v) w.rson = x; } } Prof. Dr. Dietmar Seipel 231 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 BinTree /** * Sucht den Knoten der am weitesten * rechts im Teilbaum von p steht */ BinTreeNode findRight(BinTreeNode p) { BinTreeNode q = p; while (q.rson != null) q = q.rson; return q; } } Prof. Dr. Dietmar Seipel 232 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Einfügen Um einen Schlüsselwert s in einen Suchbaum einzufügen, „suchen“ wir s in dem Baum. Falls s schon vorhanden ist, so wird s nicht eingefügt. Anderenfalls bricht die „Suche erfolglos“ in einem Knoten ab. Wir können s nun als Sohn des erreichten Knotens einfügen. Löschen Zuerst muss der zu löschende Schlüsselwert s wieder in dem Baum gesucht werden. Dabei merken wir uns nicht nur den Knoten v mit s(v) = s, sondern auch den Vater „Vater(v)“ von v im Baum. Wir unterscheiden nun drei Fälle: 1. v ist ein Blatt: Dann kann v ohne Probleme gelöscht werden. Prof. Dr. Dietmar Seipel 233 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 2. v hat genau einen Sohn: Dann wird v im Baum gelöscht, und der Sohn von v wird zum (entsprechenden) Sohn von Vater(v). T: T’: Vater(v) Vater(v) v v’ v’ Prof. Dr. Dietmar Seipel 234 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 3. v hat zwei Söhne: Seien vl und vr der linke bzw. rechte Sohn von v, und sei vt der rechteste Knoten des linken Teilbaums von v. T: Vater(v) v vl vr Tl(v) Tr(v) vt Prof. Dr. Dietmar Seipel 235 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Dann wird v im Baum gelöscht, und vl wird zum (entsprechenden) Sohn von Vater(v). Außerdem wird vr zum rechten Sohn von vt , d.h. der rechte Teilbaum Tr (v) von v in T wird in den linken Teilbaum Tl (v) von v in T „eingehängt“. Dies ergibt folgenden Baum: T’: Vater(v) vl Tl(v) vt vr Tr(v) Prof. Dr. Dietmar Seipel 236 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiel: Löschen nach Version 1 T: v1 v2 v4 v6 Prof. Dr. Dietmar Seipel v3 v5 v7 237 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 (i) Wenn wir in T den Schlüsselwert von v1 löschen, so erhalten wir folgenden neuen Baum: T’: v2 v4 v6 Tl(v1) v5 v7 v3 Tr(v1) Prof. Dr. Dietmar Seipel 238 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 (ii) Wenn wir in T den Schlüsselwert von v2 löschen, so erhalten wir folgenden neuen Baum: T’: Tl(v2) v7 v1 v4 v3 v5 v7 Tr(v2) Man beachte, dass der rechteste Knoten v4 von Tl (v2 ) in diesem Fall kein Blatt ist. Prof. Dr. Dietmar Seipel 239 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Löschen – Version 2 Der rechteste Knoten vt hat (natürlich) keinen rechten Sohn. Außerdem ist s(vt ) sicher ein (geeigneter) Separator für Tl (v) und Tr (v). T: Vater(v) v vl Tl(v) vr vt Tr(v) Prof. Dr. Dietmar Seipel 240 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Deshalb können wir v aus T löschen und durch vt ersetzen. Danach müssen wir noch vt in Tl (v) löschen. Da vt maximal einen Sohn hat, ist dies unproblematisch, vgl. a), b). Es gilt: h(T 0 ) h(T ) T´: Vater(v) vt vl T´l(v) Prof. Dr. Dietmar Seipel vr Tr(v) 241 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiel: Löschen nach Version 2 (i) Löschen von v1 in T: T: v7 v2 v4 v3 v5 v6 Prof. Dr. Dietmar Seipel 242 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 (ii) Löschen von v2 in T: T: v1 v4 v6 v3 v5 v7 Prof. Dr. Dietmar Seipel 243 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Der resultierende Baum T’ ist wieder ein Suchbaum, und zwar zur Knotenmenge V’ = V n {v}. Bei Version 1 ist die Höhe h(T’) häufig viel größer als die Höhe von T: -1 Fall b) Prof. Dr. Dietmar Seipel <= h(T’) - h(T) Fall a) <= h(Tl(v)) Fall c) 244 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Der Aufwand für das Löschen beträgt wie beim Suchen O(h) Schritte. Die Operation Löschen nach Version 1 ist kommutativ, d.h. löscht man in einem Suchbaum zuerst einen Knoten v1 und dann einen anderen Knoten v2 , so erhält man dasselbe Produkt wie wenn man zuerst v1 und dann v2 löscht. Bei Löschen nach Version 2 gilt für die Höhen: h(T 0 ) h(T ): Prof. Dr. Dietmar Seipel 245 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Generieren: Der Konstruktor: BinSearchTree(int[] s) erstellt einen Suchbaum für die Folge s. Prof. Dr. Dietmar Seipel 246 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiel: a) s = (12, 15, 7, 13, 5, 8) (8 Schritte) 12 7 5 Prof. Dr. Dietmar Seipel 15 8 13 247 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 b) s = (5, 7, 8, 12, 13, 15) (15 Schritte) 5 7 8 12 13 15 Prof. Dr. Dietmar Seipel 248 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Der Aufwand C(N) (gemessen in der Anzahl der Schlüsselvergleiche „s <, =, > s’? “ ) und der resultierende Suchbaum T hängen stark von der Reihenfolge der Schlüsselwerte s1 , ..., sN ab: Ist die Eingabefolge s monoton, so degeneriert T zu einer linearen Liste (siehe Beispiel b). Dann gilt: C (N ) = X N 1 i= N (N 2 i=1 und hat die maximale Höhe N Prof. Dr. Dietmar Seipel 1) 2 (N 2) 1. 249 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Im günstigsten Fall erhält man einen Suchbaum T der Höhe hT = blog2 N : Dann gilt: C (N ) = T X h 1 i2 i + h (N 2 T + 1) h T i=0 = ( h 2 ) 2 T + 2 + h (N 2 T + 1) = (N + 1) h 2 T +1 + 2 2 (N log2 N ) h T T (im Beispiel a): N T h h = 6 ! C (N ) = 7 2 8 + 2 = 8) Insgesamt gilt: Cmin (N ) 2 (N log2 N ); Cmax (N ) 2 (N 2 ): Prof. Dr. Dietmar Seipel 250 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Für den Erwartungswert Cmit (N) unter der Annahme, daß alle N ! Permutationen von s gleich wahrscheinlich sind, gilt: Cmit (N ) 2 (N log2 N ): Prof. Dr. Dietmar Seipel 251 Praktische Informatik I - Algorithmen und Datenstrukturen 5.2 Wintersemester 2006/07 AVL–Bäume Definition (von Adelson–Velski und Landis (1962)): = (V; R) ein geordneter binärer Wurzelbaum. Balance: Die Balance eines Knotens v 2 V ist (v) = h(T (v)) h(T (v)); Sei T (i) r l d.h. die Höhendifferenz zwischen dem rechten und dem linken Teilbaum von v, wobei h(T 0 ) = 1 ist, falls T 0 leer ist. Prof. Dr. Dietmar Seipel 252 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 v vl H(Tr(v)) H(Tl(v)) vr Tl(v) Tr(v) ß(v) Prof. Dr. Dietmar Seipel 253 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Falls v ein Blatt ist, so ist (v ) = 0. Falls v kein Blatt ist und – T (v) leer ist, so ist l (v) = h(T (v)) + 1; r – T (v) leer ist, so ist r (v) = 1 h(T (v)): l (ii) AVL–Baum: T heißt AVL–Baum, falls gilt: 8v 2 V : j (v)j 1: Prof. Dr. Dietmar Seipel 254 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiele: AVL–Bäume (i) Für die Folge s = (7, 4, 11, 8, 15, 12) erzeugt der Konstruktor folgenden Baum T: T: 7 4 11 8 15 12 Prof. Dr. Dietmar Seipel 255 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Dieser Baum ist kein AVL–Baum, denn er ist rechtslastig: (7) = 2 v (v) Prof. Dr. Dietmar Seipel 0 = 2: 4 7 8 11 12 15 0 2 0 1 0 1 256 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 (ii) Für die Folge (11, 7, 4, 8, 12, 15) zur selben Schlüsselwertmenge wird dagegen folgender Baum T’ generiert: T’: 11 7 4 Prof. Dr. Dietmar Seipel 15 8 12 257 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 T 0 ist ein AVL–Baum. Hier gilt: v (v) 4 7 8 11 12 15 0 0 0 0 0 1 (iii) T und T’ unterscheiden sich dadurch, daß T um den Knoten 11 nach „links rotiert“ ist. Prof. Dr. Dietmar Seipel 258 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Linksrotation eines Suchbaumes T bezüglich zweier Knoten v; v 0 mit v T: = V ater(v0) T’: V V’ V’ Rotlinks(v, v') V Rotrechts(v', v) Tl Tl Tr,1 Tr,1 Tr,2 Tr,2 Prof. Dr. Dietmar Seipel 259 Praktische Informatik I - Algorithmen und Datenstrukturen Der neue Baum T 0 Wintersemester 2006/07 = Rotlinks (v; v0 )(T ) ist ebenfalls ein Suchbaum. Für die Höhen von T und T 0 gilt: Falls h(Tl (v )) < h(Tr (v )), so gilt h(T 0 ) h(T ). Falls h(Tl (v )) < h(Tr (v )) und h(Tr;1 ) < h(Tr;2 ), so gilt h(T 0 ) = h(T ) 1, denn h(T 0 ) = h(Tr;2 ) + 1 und h(T ) = h(Tr;2 ) + 2. Falls h(Tl (v )) h(Tr (v )), so gilt h(T 0 ) = h(T ) + 1, denn h(T 0 ) = h(Tl ) + 2 und h(T ) = h(Tl ) + 1. Prof. Dr. Dietmar Seipel 260 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Rechtsrotation von T’ bezüglich v’, v (in T’ gilt: v’ = Vater(v)) liefert wieder T. Rotrehts (v0 ; v) Æ Rotlinks (v; v0 )(T ) = T; Rotlinks (v; v0 ) Æ Rotrehts (v0 ; v)(T 0 ) = T 0 Durch Links–, bzw. Rechtsrotation wird die LWR–Ordnung eines Baumes nicht verändert. Prof. Dr. Dietmar Seipel 261 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Satz: Sei S = f s1 ; : : : ; sN g mit (o.B.d.A.) s1 < s2 < : : : < sN eine Schlüsselwertmenge und T = (V; R) ein beliebiger Suchbaum für S . Dann sind alle Suchbäume T’ für S durch endlich viele Anwendungen von Rotlinks und Rotrechts aus T erzeugbar! Beweis: Wir können jeden Suchbaum T’ für S per Induktion aus der „linken linearen Liste” erzeugen und umgekehrt: Prof. Dr. Dietmar Seipel 262 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Sk SN TL: SN-1 Sk+1 Sk-1 (N-k)-mal Rotrechts S1 SN S1 (N-k-1)-mal Sk T’: Sk-1 Rotlinks Sk Sk+1 Sk-1 per SN Induktion S1 Prof. Dr. Dietmar Seipel Sk+1 263 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Um nun T 0 aus T zu erzeugen, gehen wir wie folgt vor: T ! T ! T0 l 2 Offenbar kann man mit einer der beiden Rotationen alleine nicht alle Transformationen auf Suchbäumen realisieren. Z.B. ist Rotlinks auf die linke lineare Liste Tl überhaupt nicht anwendbar. Deshalb kann man Tl in keinen anderen Suchbaum transformieren, falls nur Rotlinks zugelassen ist. Prof. Dr. Dietmar Seipel 264 Praktische Informatik I - Algorithmen und Datenstrukturen Sei T Wintersemester 2006/07 = (V; R) ein Wurzelbaum. (i) Der Außengrad g + (v ) und der Innengrad g (v ) eines Knotens v 2 V geben die Anzahl der Nachfolger bzw. der Vorgänger von v in T an: g+ (v) g (v) Prof. Dr. Dietmar Seipel = j f w 2 V j (v; w) 2 R g j; = j f w 2 V j (w; v) 2 R g j: 265 Praktische Informatik I - Algorithmen und Datenstrukturen (ii) Wintersemester 2006/07 T heißt vollständig, falls jeder innere Knoten (= Nicht–Blatt) genau zwei Söhne hat: 8v 2 V : (g+(v) 6= 0 ) g+ (v) = 2): T1: T2: |V| ___ h(T2) = 2 Prof. Dr. Dietmar Seipel 266 Praktische Informatik I - Algorithmen und Datenstrukturen (iii) Wintersemester 2006/07 T heißt voll, falls alle Knoten auf allen Stufen außer den beiden untersten genau zwei Söhne haben: 8v 2 V : ( h(v) h(T ) 2 ) g+(v) = 2 ): T3: Hier gilt: 2 h(T ) Prof. Dr. Dietmar Seipel jV j < 2 h(T )+1 ) h(t) 2 O(log2 jV j) 267 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Für geordnete binäre Wurzelbäume T gilt: Ist T voll, so ist T ein AVL–Baum, denn alle Blätter haben die Höhe h(T ) oder h(T ) 1. T4 ist ein AVL–Baum, welcher nicht voll ist: T4: T1 und T2 sind vollständig, aber keine AVL–Bäume. T4 ist ein AVL–Baum, welcher nicht vollständig ist. Prof. Dr. Dietmar Seipel 268 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Fibonacci-Bäume: Abschätzung der Höhe von AVL–Bäumen Wir betrachten im folgenden extremale AVL–Bäume, welche zu einer vorgegebenen Höhe h eine minimale Anzahl von Knoten aufweisen: n Prof. Dr. Dietmar Seipel h = min f n j T ist ein AVL–Baum mit n Knoten und Höhe h g: 269 Praktische Informatik I - Algorithmen und Datenstrukturen Es gilt n0 Wintersemester 2006/07 = 1 und n1 = 2. Beispielbäume sind: T0: V1 T1: V1 Höhe 0 Höhe 1 V2 Prof. Dr. Dietmar Seipel 270 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Sei T ein beliebiger knotenminimaler AVL–Baum der Höhe h 2. Sei v die Wurzel von T und seien Tl (v ) und Tr (v ) der linke bzw. rechte Teilbaum von v T: Tl(v) Prof. Dr. Dietmar Seipel v Tr(v) 271 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Wegen h 2 hat (mindestens) einer der beiden Teilbäume die Höhe 1 und ist somit nicht leer, und wegen j (v )j 1 ist auch der andere Teilbaum nicht leer. Aufgrund der Knotenminimalität von T gilt: h(T (v)) = h 1 und h(T (v)) = h 2, oder h(T (v)) = h 2 und h(T (v)) = h 1. l r l r Außerdem müssen Tl (v) und Tr (v) auch wieder knotenminimale AVL–Bäume sein, zu ihrer jeweiligen Höhe. Prof. Dr. Dietmar Seipel 272 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Rekursionsformel: n0 = 1 n1 = 2 n =1+n h h 1 +n h 2 Diese Rekursionsformel erinnert an die Formel der Fibonacci–Zahlen: f0 = 0 f1 = 1 f =f h Prof. Dr. Dietmar Seipel h 1 +f h 2 273 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Die Wertetabelle zeigt den Zusammenhang: 0 1 2 3 4 5 6 ::: n 1 2 4 7 12 20 33 : : : f 0 1 1 2 3 5 8 ::: h h h f h Prof. Dr. Dietmar Seipel =n h 3 + 1; für h 3 274 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Definition (Fibonacci–Bäume, FB–Bäume) Die Menge Fh der Fibonacci–Bäume der Höhe h ist rekursiv definiert: 1. 2. F0 enthält alle Wurzelbäume T0 = (fvg; ;) mit genau einem Knoten und der Höhe h = 0. F , h 1, enthält alle geordneten binären Wurzelbäume h = < T 1; v; T 2 > bzw. T = < T 2; v; T 1 >; wobei T 1 2 F 1 und T 2 2 F 2 . Hierzu sei F 1 = f(;; ;)g, d.h. T 1 ist der leere Baum, und T h h h h h h h h h h < T; v; T 0 > bezeichne einen geordneten binären Wurzelbaum mit der Wurzel v und dem linken bzw. rechten Teilbaum T bzw. T 0 von v . Prof. Dr. Dietmar Seipel 275 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 v T T’ T0: T1: v v T3: v v 2 verschiedene Bäume Prof. Dr. Dietmar Seipel T2: 4 verschiedene Bäume 16 verschiedene Bäume 276 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 ebenfalls in F3 : T3’: Prof. Dr. Dietmar Seipel v T3’’: v 277 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Satz: Jeder FB–Baum ist auch ein AVL–Baum: Beweis: Sei der Baum von der Form T h =< T 1; v; T h h 2 >. Dann haben – per Induktion – alle Knoten v 0 in den kleineren Teilbäumen Th 1 und Th 2 die Balance j (v0 )j 1: Für den Knoten v gilt: j (v)j = jh(T 1) h(T 2)j = 1: h h 2 Dies zeigt ebenso gleich mit, dass alle Knoten v eines FB–Baumes die Balance (v ) = += 1 haben. Die FB–Bäume Th Höhe h. Prof. Dr. Dietmar Seipel 2F h sind genau die knotenminimalen AVL–Bäume der 278 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Satz: Ein knotenminimaler AVL–Baum T zu einer vorgegebenen Höhe h mit n Knoten ist gleichzeitig auch ein höhenmaximaler AVL–Baum zur vorgegebenen Knotenanzahl n. Beweis: Angenommen, es gibt einen anderen AVL–Baum T 0 mit n Knoten und h(T 0 ) > h(T ) = h: Dann besitzt T 0 einen Teilbaum T 00 der Höhe h(T 00 ) = h: T 00 ist ebenfalls ein AVL–Baum. Prof. Dr. Dietmar Seipel 279 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Wegen der Knotenminimalität von T zur Höhe h gilt somit n(T ) n(T 00 ): Da T 00 aber ein echter Teilbaum von T 0 ist, muss gelten n(T 00 ) < n(T 0 ) = n(T ); ein Widerspruch. 2 Also sind die FB-Bäume genau die höhenmaximalen AVL–Bäume zu einer vorgegebenen Knotenzahl. Prof. Dr. Dietmar Seipel 280 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Satz: (Höhenabschätzung für AVL–Bäume) Sei T ein AVL–Baum mit n Knoten. Dann gilt: h(T ) 2 log2 n: Beweis: Für die höhenmaximalen AVL–Bäume, d.h. die FB–Bäume, mit n Knoten gilt die Rekursionsformel: n0 = 1 n1 = 2 n =1+n h h 1 +n h 2 Per Induktion kann man zeigen: 1. 2. = f +3 1 p p f = 1= 5 (((1 + 5)=2) n Prof. Dr. Dietmar Seipel h h h h ((1 p 5)=2)) h . 281 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 p Der negative Term ((1 5)=2) ist dem Betrag nach kleiner als 1 und seine Potenzen konvergieren daher mit wachsendem h gegen 0. Daher gilt: p p f 1= 5 ((1 + 5)=2) 0:45 1:62 ; d.h. n 0:45 1:62 +3 1: h h Prof. Dr. Dietmar Seipel h h h 282 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Für alle h gilt: p p f 1= 5 ((1 + 5)=2) 1: Wegen n = f +3 1 gilt nun: p p log2 (n + 2) log2 (1= 5) + (h + 3) log2 ((1 + 5)=2): h h h h h Daraus folgt die Abschätzung h 2 log2 (n ): h 2 Prof. Dr. Dietmar Seipel 283 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Doppelrotationen Der resultierende Wurzelbaum T’ ist wiederum ein Suchbaum (falls T ein Suchbaum war), und es gilt: DoppelRotlinks (v; v0 ; v00 ) = Rotlinks (v; v00 ) Æ Rotrehts (v0 ; v00 ); DoppelRotrehts (v; v0 ; v00 ) = Rotrehts (v; v00 ) Æ Rotlinks (v0 ; v00 ): Prof. Dr. Dietmar Seipel 284 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 V T: T’: V’ V’’ DoppelRotlinks (v, v', v'') V’ V V’’ Tl Tr3 Tr1 Tl Tr2 V T: Tr1 Tr3 Tr2 T’: V’’ DoppelRotrechts (v, v', v'') V’ V V’ V’’ Tr Tl1 Tl2 Prof. Dr. Dietmar Seipel Tl3 Tl1 Tl2 Tl3 Tr 285 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Satz: (Rebalancierung) Sei T =< Tl ; v; Tr > ein geordneter binärer Wurzelbaum, mit der Wurzel v und den Teilbäumen Tl , Tr , welche beide AVL–Bäume sind. Ist j (v )j = 2, so kann T mittels einer Rotation oder Doppelrotation in einen AVL–Baum T 0 überführt werden, mit h(T ) Prof. Dr. Dietmar Seipel 1 h(T 0) h(T ): 286 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beweis: Sei T o.B.d.A. „linkslastig“, d.h. (v ) = 2. T: V Vl Vr Vl2 Vl1 hl Tr Tl1 Prof. Dr. Dietmar Seipel Tl2 hr 2 287 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Wir betrachten nur den Fall, dass Tr nicht–leer ist. (Der andere Fall ist leicht, da dann wegen (v ) = 2 die Teilbäume Tl;1 und Tl;2 jeweils maximal einen Knoten haben können.) Es gilt: jh(T 2) h(T 1)j = j (v )j 1: l; Prof. Dr. Dietmar Seipel l; l 288 Praktische Informatik I - Algorithmen und Datenstrukturen (i) (v ) 2 f l Wintersemester 2006/07 1; 0 g, d.h. h(T 1) h(T 2): l; l; Vl Vl1 V Vr Vl2 Tl1 Tl2 Prof. Dr. Dietmar Seipel Tr 289 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Dann betrachten wir den Wurzelbaum T 0 = Rotrehts (v; v )(T ): l Alle Knoten in den AVL–Bäumen Tl;1 , Tl;2 und Tr haben dieselbe Balance (0, +/- 1) wie in T . Für den Knoten v gilt: 0 (v) = h8(T ) h(T 2) < h (h 1); = : h (h 2); r l; r 8 < 1 = : 0 r Prof. Dr. Dietmar Seipel l l falls (vl ) = 0 falls (vl ) = 1 290 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Für den Knoten vl gilt wegen h(Tl;2 ) h(Tr ) auch 0 (v ) = h(T 2 ) + 1 h(T 1 ) = (v ) + 1 2 f Also ist T 0 ein AVL–Baum, und es gilt: l l; l; 8 < h(T ); 0 h(T ) = : h(T ) 1; Prof. Dr. Dietmar Seipel l falls (vl ) = 0 falls (vl ) = 1; 0 g: 1 291 Praktische Informatik I - Algorithmen und Datenstrukturen (ii) (v ) = +1, d.h. h(T l Wintersemester 2006/07 l;1 ) = h(T 2) 1. l; Dann betrachten wir den Wurzelbaum T 0 = DoppelRotrehts (v; v ; v l l;2 )(T ): Alle Knoten in den AVL–Bäumen Tl;1 , T1 , T2 und Tr haben dieselbe Balance (0, +/- 1) wie in T . Prof. Dr. Dietmar Seipel 292 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 V T: T’: Vl2 Vr Vl Vl Vl2 Vl1 V1 Vl1 V2 V V1 V2 Vr Tr Tl1 T1 Prof. Dr. Dietmar Seipel T2 Tl1 T1 T2 Tr 293 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Für den Knoten v gilt: 0 (v) = h8(T ) h(T2) < h(T ) (h(T 2) 1); = : h(T ) (h(T 2 ) 2); r r 8 < (v) + 2 = 0 = : (v) + 3 = 1 r da (v ) = h(Tr ) Prof. Dr. Dietmar Seipel l; l; falls (vl;2 ) 0 falls (vl;2 ) = 1 (h(T 2) + 1). l; 294 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Für den Knoten vl gilt: 0 (v ) l = h8(T1) h(T 1) < (h(T 2) 1) h(T 1); = : (h(T 2) 2) h(T 1); l; l; 8 < (v ) 1 = 0 = : (v ) 2 = 1 l; l; l; falls (vl;2 ) 0 falls (vl;2 ) = 1 l l Prof. Dr. Dietmar Seipel 295 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Für den Knoten vl;2 gilt: 0 (v ) = (h(T ) + 2) (h(T 1) + 2) = h(T ) h(T 1) = (v) + 2 = 0; da (v ) = h(T ) (h(T 1 ) + 2). l;2 r r r l; l; l; Also ist T 0 ein AVL–Baum, und es gilt: h(T 0 ) = h(T ) 1: 2 Prof. Dr. Dietmar Seipel 296 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Definition (Klassen balancierter Bäume) Sei f : N ! N eine Funktion. Dann heißt eine Klasse B von Wurzelbäumen balanciert zur Höhe f (n), g.d.w. gilt: 1. Jede n-elementige Schlüsselwertmenge S kann durch einen Baum T 2 B der Höhe hT f (n) repräsentiert werden. 2. Die Wörterbuchoperationen Suchen, Einfügen und Löschen eines Elements liefern für jeden Baum T 2 B einen (neuen) Baum T 0 2 B, und sie können in O(hT ) Schritten ausgeführt werden. Prof. Dr. Dietmar Seipel 297 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Satz (Adelson) Die Klasse der AVL–Bäume ist zur Höhe f (n) = 2 log2 n balanciert. Die notwendigen Rebalancierungen können nach dem Adelson–Verfahren entlang des Suchpfades mit Hilfe von Rotationen und Doppelrotationen erfolgen. Prof. Dr. Dietmar Seipel 298 Praktische Informatik I - Algorithmen und Datenstrukturen 5.3 Wintersemester 2006/07 B–Bäume (Rudolf Bayer, 1972) Bei Suchproblemen in außerordentlich großen Schlüsselwertmengen S müssen Sekundärspeicher verwendet werden. Dann ist für den Suchaufwand neben den Schlüsselwertvergleichen vor allen Dingen der Aufwand zum Aufsuchen und Laden von Seiten des Sekundärspeichers entscheidend. Um die Anzahl der Seitenwechsel von Seiten des Sekundärspeichers zu minimieren, versucht man möglichst viele Schlüsselwerte entlang der Zugriffswege beim binären Suchen in jeweils einer Seite zu speichern. Prof. Dr. Dietmar Seipel 299 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Voller Baum AVL-Baum Seiten 12 18 7 2 1 Prof. Dr. Dietmar Seipel 9 8 5 3 22 15 4 6 14 10 11 13 20 17 16 19 24 21 23 25 300 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Definition (B–Baum vom Typ m) Sei T = (V, R) ein geordneter Wurzelbaum mit einer Knotenmarkierung s : V ! 2S ; welche jedem Knoten v 2 V eine Teilmenge s(v) S einer Schlüsselwertmenge S zuordnet. (im folgenden gilt: innerer Knoten: nicht die Wurzel und kein Blatt) Prof. Dr. Dietmar Seipel 301 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Dann ist T ein B–Baum vom Typ m, welcher S repräsentiert, falls gilt: 1. Struktureigenschaften: (a) Alle Blätter haben dieselbe Höhe hT . (b) Alle Knoten enthalten höchstens 2 m Schlüssel. Die Wurzel enthält mindestens einen Schlüssel; alle anderen Knoten enthalten mindestens m Schlüssel. (c) Enthält ein Knoten k Schlüssel, 1 k 2 m, so hat er genau k + 1 Söhne. D.h. g+ (v) = js(v)j + 1. (d) Folgerung aus (b) und (c): Alle Knoten haben höchstens 2 m + 1 Söhne. Die Wurzel hat mindestens 2 Söhne, falls sie kein Blatt ist. Alle inneren Knoten haben mindestens m + 1 Söhne. Prof. Dr. Dietmar Seipel 302 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 2. Suchbaumeigenschaft: Die Schlüsselwertmenge S ist disjunkt auf die Knoten verteilt, und für jeden Knoten v 2 V gilt: sei s(v ) = f s1 ; : : : ; sk g, mit s1 < s2 < : : : < sk , und sei (v1 ; : : : ; vk+1 ) die Folge der Söhne von v im Baum. Dann gilt: (a) Alle Schlüsselwerte s im ersten Teilbaum T (v1 ) sind kleiner als s1 : s < s1 . (b) Alle Schlüsselwerte s im i–ten Teilbaum T (vi ), mit 2 i k, liegen zwischen si 1 und si : si 1 < s < si . (c) Alle Schlüsselwerte s im (k+1)–ten Teilbaum T (vk+1 ) sind größer als sk : sk < s. Prof. Dr. Dietmar Seipel 303 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 V S1 S2 V1 V2 ----- Sk Vk Vk+1 Die Struktureigenschaft (1,b) besagt: 1 k 2 m: Für alle anderen Knoten des B–Baumes gilt: m k 2 m: Für die Wurzel des B–Baumes gilt: Folgerung: Alle Knoten außer der Wurzel sind garantiert zu mindestens 50% mit Schlüsselwerten gefüllt. Prof. Dr. Dietmar Seipel 304 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiel: B–Baum vom Typ m = 2, S = h1; 25i 12 4 1 2 3 Prof. Dr. Dietmar Seipel 5 6 7 8 9 10 11 15 18 22 13 14 16 17 19 20 21 23 24 25 305 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Abschätzungen: = (V; R) vom Typ m. Sei n = jV j die Knotenanzahl und h = h die Höhe von T . für einen B–Baum T T 1. Knotenzahl: Jeder innere Knoten hat mindestens m + 1 Söhne. Deshalb gilt: n 1+2 X h ( m + 1) (m + 1) = 1 + 2 m 1 i=0 h i 1 Jeder Knoten hat maximal 2 m + 1 Söhne. Deshalb gilt: X (2 m + 1) +1 1 (2 m + 1) = n 2m =0 h h i i Prof. Dr. Dietmar Seipel 306 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 2. Höhe: Gemäß 1. gilt: h h log2 ( 21 (n 1) m + 1) ; log2 (m + 1) log2 (2 m n + 1) 1 log2 (2 m + 1) Deshalb gilt h 2 (log2 n); für festes m. Prof. Dr. Dietmar Seipel 307 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 3. Schlüsselanzahl: Für alle Knoten gilt js(v )j 2 m. Deshalb gilt mit 1.: jS j n 2 m (2 m + 1) +1 1 Für die Wurzel w des Baumes gilt js(w)j 1; und für alle anderen Knoten v gilt js(v )j m: h Deshalb gilt mit 1.: jS j 1 + m (n 1) 1 + 2 ((m + 1) Deshalb gilt auch h 2 (log2 jS j); für festes m. 4. Blätterzahl b: Analog zu 1. erhält man: 2 (m + 1)h Prof. Dr. Dietmar Seipel 1 h 1) b (2 m + 1) h 308 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Satz (B–Bäume) Die Klasse der B–Bäume vom Typ m ist zur Höhe f (n) = 1 log2 (n) log2 (m + 1) balanciert. h 1 log2 (m+1) log2 j j2+1 ; und j j2+1 jS j; für jS j 1. S S Zum Beweis dieses Satzes untersuchen wir im folgenden die Wörterbuchoperationen und zeigen, dass diese in O(h) Schritten ausgeführt werden können. Die Höhenbeschränkung erhalten wir mit 3. von oben. Prof. Dr. Dietmar Seipel 309 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Realisierung der Wörterbuchoperationen (i) Suchen nach einem Schlüsselwert s: search(s, T) Innerhalb einer Schlüsselwertmenge s(v ) eines jeden Knotens, welche in einer Seite des Sekundärspeichers ist, kann binär gesucht werden, mit konstantem Aufwand dlog2 (2 m)e: Prof. Dr. Dietmar Seipel 310 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Die Suche wird – wie bei AVL–Bäumen – von den Schlüsselwerten dirigiert: s1 < : : : < sk s < s1 : Fortsetzung der Suche im ersten Teilbaum – s 1 < s < s , 2 i k: Fortsetzung der Suche im i–ten Teilbaum – s < s: Fortsetzung der Suche im (k + 1)–ten Teilbaum Nach maximal (h + 1)–maligem Durchsuchen eines Knotens findet man s, oder stellt fest, dass s nicht im Baum enthalten ist. – i i k T Der Aufwand für die Suche ist also O(hT ). Prof. Dr. Dietmar Seipel 311 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 (ii) Einfügen eines Schlüsselwertes s: insert(s, T) Zunächst wird s im Baum „gesucht“. Ist s schon im Baum, so ist das Einfügen unnötig. Anderenfalls bricht die Suche „erfolglos“ in einem Blatt v ab, und der Pfad zu diesem Blatt wird gespeichert. Dann wird s in das Blatt v eingefügt. Hat v nun immer noch höchstens 2 m Schlüssel, so kann man das Einfügen terminieren. Anderenfalls hat man einen Überlauf mit 2 m + 1 Schlüsseln in v . Dann muß der so entstandene Baum T 0 rekursiv entlang des Pfades von der Wurzel zu v „rebalanciert“ werden, beginnend mit v . Prof. Dr. Dietmar Seipel 312 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Wir „rebalancieren“ einen übergelaufenen Knoten v wie folgt: (a) Die Schlüsselwerte in v werden in drei Gruppen aufgeteilt (Splitting): die Menge S1 der m kleinsten Schlüssel, das mittlere Element sm+1 , die Menge S2 der m größten Schlüssel. (b) Anstelle von v werden zwei neue Knoten v1 und v2 mit den Schlüsselwerten S1 bzw. S2 erzeugt. Der Schlüssel sm+1 wird in den Vater von v eingefügt, falls v nicht die Wurzel des Baumes war. In diesem Falle muß jetzt (rekursiv) der Vater von v rebalanciert werden. Falls v schon die Wurzel des Baumes war, so wird eine neue Wurzel mit genau einem Schlüssel sm+1 erzeugt. Prof. Dr. Dietmar Seipel 313 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 --V1 Sm+1 --- S1 --V2 S2 Aufwand für das Einfügen: Beim Rebalancieren kann höchstens hT + 1–mal gesplittet werden. Deshalb ist der Aufwand für das Einfügen in O(hT ). Der beim Einfügen entstehende Baum T 0 kann eine um 1 größere Höhe haben, falls die Wurzel gesplittet wurde: „B–Bäume wachsen (und schrumpfen) an der Wurzel.“ Es gilt: hT Prof. Dr. Dietmar Seipel h h +1 T0 T 314 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiel: Einfügen 1. Das Einfügen von s = 26 in T stellt kein Problem dar, da das zugehörige Blatt nur 3 Schlüssel hat. Sei T 0 der erzeugte Baum. 2. Beim Einfügen von s0 – – – S1 = f 23; 24 g, s3 = 25, S2 = f 26; 27 g, = 27 in T 0 muß ein Blatt gesplittet werden: und wir erhalten folgenden neuen Baum T 00 : Prof. Dr. Dietmar Seipel 315 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 15 18 22 25 13 14 Prof. Dr. Dietmar Seipel 16 17 19 20 21 23 24 26 27 316 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Alternativ kann man beim Einfügen von s0 Verschieben: = 27 in T 0 auch nach links 15 18 22 19 20 21 23 24 25 26 27 Prof. Dr. Dietmar Seipel 317 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Dann erhält man folgenden Baum: 15 18 23 19 20 21 22 Prof. Dr. Dietmar Seipel 24 25 26 27 318 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 (iii) Löschen eines Schlüsselwertes s: delete(s, T) Zunächst wird der Pfad von der Wurzel von T zu dem Knoten v von T bestimmt, der s enthält. Sei s der i–te Schlüssel in v . Ist v ein Blatt, so wird s aus v gelöscht, und man setzt v 0 = v . Ist v kein Blatt, wo wird s auch aus v gelöscht. Aber jetzt benötigt man einen neuen Separator s0 anstelle von s in v . Dazu wählen wir den größten Schlüssel s0 im rechtesten Blatt v 0 des i–ten Teilbaums T (vi ) von v . Wir löschen s0 aus v 0 und ziehen s0 nach v hoch. Der so entstehende neue Baum T 0 erfüllt die Suchbaumeigenschaft für S 0 = S n f s g. Prof. Dr. Dietmar Seipel 319 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Um auch die Struktureigenschaft wieder herzustellen, muss T 0 „rebalanciert“ werden. Dies erfolgt rekursiv entlang des Pfades von der Wurzel von T zu v 0 , beginnend mit v 0 . Wir „rebalancieren“ einen Knoten v wie folgt: (a) Falls v mindestens m Schlüssel enthält, oder die Wurzel des Baumes ist, so ist nichts zu tun. (b) Falls v nur m 1 Schlüssel enthält (Unterlauf ), so betrachten wir den linken und rechten Bruder von v . Enthält einer der beiden Brüder v 0 mindestens m + 1 Schlüssel, so kann man einen dieser Schlüssel verschieben. Danach kann man die gesamte Rebalancierung terminieren. Enthalten beide Brüder nur m Schlüssel, so kann man v mit einem Bruder v 0 verschmelzen. Prof. Dr. Dietmar Seipel 320 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Vater(v*) S* --- --- --- S1 S2 ... --- M-1 Schlüssel T1 T2 Verschiebe S1 nach Vater(v*) und s* nach v* Vater(v*) S1 --- --S2 ... S* T1 Prof. Dr. Dietmar Seipel T2 321 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Vater(v*) --- Si-1 Si Si+1 --- S*1...S*m-1 ----- S01 ... S0m verschmelze v* und v0 Vater(v*) --- Si-1 Si+1 --- Prof. Dr. Dietmar Seipel --- S*1...S*m- 1 Si S01 ... S0m --- 322 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Danach müssen wir (eventuell) den Knoten V ater(v ) rebalancieren (Rekursion). Aufwand für das Löschen: – Das Hochziehen eines neuen Separators wird höchstens einmal ausgeführt. – Das Verschieben wird bei der Rebalancierung ebenfalls höchstens einmal ausgeführt. – Das Verketten wird bei der Rebalancierung höchstens hT mal ausgeführt. Deshalb ist der Gesamtaufwand für das Löschen in O(hT ). Prof. Dr. Dietmar Seipel 323 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Falls beim Rebalancieren Söhne der Wurzel verschoben werden, so verliert die Wurzel einen Schlüssel. Falls die Wurzel dann nur genau einen Schlüssel hätte, so schrumpft die Höhe des Baumes um 1. Im allgemeinen gilt: h T Prof. Dr. Dietmar Seipel 1h h : T0 T 324 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiel: Löschen 1. Das Löschen von s = 11 stellt kein Problem dar, da das zugehörige Blatt 4 Schlüssel enthält. 2. Beim Löschen von s = 5 kann man verschieben und erhält: 3 1 2 Prof. Dr. Dietmar Seipel 4 6 7 8 9 10 11 325 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 3. Beim Löschen von s = 13 kann man verschmelzen und erhält: 18 22 14 15 16 17 19 20 21 23 24 25 4. Beim Löschen von s = 18 wird der rechte Schlüssel s0 = 17 des „linken Teilbaums“ von 18 hochgezogen. Danach wird der Baum rebalanciert. Prof. Dr. Dietmar Seipel 326 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Seitengrößen bei B–Bäumen: Seitengröße 1KB = 210 Bytes für einen Schlüsselwert + einen Zeiger: 10 Bytes ) pro Seite maximal k = 100 Schlüsselwerte, d.h. m = 50: 50 k 100: Beispiel: Typ m = 50 ) h=0: h=1: h=2: h=3: Prof. Dr. Dietmar Seipel 2 51 1 jS j 101 +1 1 1 jS j 100; 101 jS j 10:200; 5:201 jS j 1:030:300; 265:301 jS j 104:060:400 h h 327 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Bei praktischen Problemstellungen sind die Höhen der B–Bäume gewöhnlich höchstens 3. Bei jeder Basisoperation sind dann höchstens 8 Seitenwechsel nötig. Höhenvergleich: B–Bäume: n = jS j 1 1 log2 (n + 1) 1 h log (m + 1) (log2 (n + 1) 1) log2 (2 m + 1) 2 AVL–Bäume: log2 (n + 1) Prof. Dr. Dietmar Seipel 1 h 1:44 (log2 (n + 1) + 1=2 log2 (5)) 3 328 Praktische Informatik I - Algorithmen und Datenstrukturen Beispiel: Wintersemester 2006/07 m = 50, jS j = 50 000 000 25 hAVL 35 3 hB 4 Hier gilt: 25:57 = log2 (jS j + 1), 5:67 = log2 (m + 1), 6:66 = log2 (2 m + 1) Prof. Dr. Dietmar Seipel 329 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Bearbeitungszeit für eine Seite (beim Suchen im B–Baum) Seien k Schlüsselwerte in der Seite gespeichert: t = + + (log2 k) : : : Aufwand zum Positionieren des Schreiblesekopfes der Platte auf die gewünschte Seite (mittlere Zugriffszeit) Aufwand für das Laden der Seite Aufwand für einen Schlüsselwertvergleich im Hauptspeicher (beim binären Suchen innerhalb einer Seite) Prof. Dr. Dietmar Seipel 330 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Realistische Größenordnungen sind etwa Beispiel Seagate Cheetah: 10 000 U/min, Ultra-Wide SCSI, Vibre-channel Anschluß mittlere Zugriffszeit: 7.5 ms Durchsatz: 16.8 MByte/s Dann gilt: Prof. Dr. Dietmar Seipel = 7:5 ms; = 60 s (Faktor 116 langsamer als ); = 0 (vernachlässigbar gegenüber und ) 331 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 B –Bäume (blätterorientierte Version der B–Bäume) Relation: Datensatz i ! Schlüssel si + beschreibende Attribute bi Die Nicht–Blatt–Knoten dienen – wie üblich – als Wegweiser zu den Schlüsselwerten. Sie bilden einen B–Baum vom Typ m für eine Menge S von Separatoren. Die Datensätze werden entsprechend ihrer Schlüsselwerte aus S disjunkt auf die Blätter verteilt, welche zwischen m0 und 2 m0 Datensätze enthalten. Die Separatoren separieren alle Knoten des Baumes – auch die Blätter – entsprechend der Suchbaumeigenschaften (a), (b), (c) mit „“ ( anstelle von „<“) Prof. Dr. Dietmar Seipel 332 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Beispiel: B –Baum vom Typ m = 2, m0 =1 7 12 21 M=2 3 M’=1 Prof. Dr. Dietmar Seipel 1 2 3 4 5 5 6 9 11 14 16 18 19 23 25 7 8 9 10 11 12 13 14 1516 17 18 19 20 21 22 23 24 25 333 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 n Blätter (n = 14) n 1 Separatoren (n 1 = 13) S = h1; 25i S = f 3; 5; 7; 9; 11; 12; 14; 16; 18; 19; 21; 23; 25 g Auf der Blätterebene des B –Baums ist bereits die gesamte Information mit den vollständigen Datensätzen (si ; bi ) repräsentiert. Prof. Dr. Dietmar Seipel 334 Praktische Informatik I - Algorithmen und Datenstrukturen Wintersemester 2006/07 Anwendung: B –Bäume werden benutzt, wenn zu den zu den Schlüsseln si auch beschreibende Attribute mit viel Speicherverbrauch gespeichert werden sollen. So müssen nicht bei jeder Suche auch alle vorhergehenden Daten, sondern nur die gesuchten eingelesen werden. Prof. Dr. Dietmar Seipel 335