Algorithmen & Datenstrukturen WS 2006/07 Bäume Zusatzfolien Diese Folien detaillieren verschiedene Aspekte des PDF-Foliensatzes. O.J. Bott, 16.01.2007 Institut für Medizinische Informatik Technische Universität Braunschweig 6. Bäume Inhalt 1. Binärbäume und Binäre Suchbäume 2. Ausgeglichene Bäume 1. AVL-Bäume 2. Red/Black-Bäume 3. B-Bäume 3. Heaps und Heapsort Institut für Medizinische Informatik Technische Universität Braunschweig 1 1. Binärbäume Implementierung (1/2): Modell (Klassendiagramm) 0,1 left 0,1 right BinTreeNode BinaryTree getRoot(): BinTreeNode setRoot(BinTreeNode) ... ... 0,1 root getRight(): BinTreeNode getLeft(): BinTreeNode getValue(): Object setValue(Object) setRight(BinTreeNode) setLeft(BinTreeNode) toString(): String 1 value Object Technische Universität Braunschweig Institut für Medizinische Informatik 1. Binärbäume Implementierung (2/2): Binärbaum (Objektmodell) l: BinaryTree root left t2: BinTreeNode left t4: BinTreeNode t1: BinTreeNode 9: Integer right value 2: Integer value 1: Integer right value t5: BinTreeNode t3: BinTreeNode value 12: Integer value 9 t2 5: Integer t4 Institut für Medizinische Informatik 1 2 t1 12 5 t3 t5 Technische Universität Braunschweig 2 1. Binäre Suchbäume Löschen eines Wertes Drei Fälle (2) Knoten hat ein Kind delete(2) (1) Knoten ist Blatt delete(5) 2 1 2 9 5<9 5>2 5 12 9 2<9 2 == 2 12 1 9 5 ==5 1 12 Technische Universität Braunschweig Institut für Medizinische Informatik 1. Binäre Suchbäume Fortsetzung Löschen (3) Knoten hat zwei Kinder delete(3) 3 9 9 3<9 3 == 3 4 12 12 successor? 1 1 6 6 ... ... 4 7 5 7 5 Institut für Medizinische Informatik Technische Universität Braunschweig 3 6. Bäume 6.2 Ausg. Bäume 2.1 AVL-Bäume – Entwickelt von den russischen Mathematikern G.M. AdelsonVelskii und E.M. Landis – AVL-Bäume sind binäre Suchbäume und basieren auf einem abgeschwächten Kriterium für eine ausgeglichene Höhe. Ein binärer Suchbaum ist ein AVL-Baum, wenn das AVL-Kriterium erfüllt ist: Für jeden (inneren) Knoten ist der absolute Betrag der Differenz der Höhen des rechten und linken Teilbaums maximal 1. 11 11 5 2 1 17 7 5 13 2 AVL 1 Institut für Medizinische Informatik 17 7 6 Es genügt nicht, diese Eigenschaft nur für die Wurzel zu fordern, da beide Teilbäume entartet sein können. Nicht AVL Technische Universität Braunschweig 6. Bäume 6.2 Ausg. Bäume Einfügen in AVL-Bäume (1/6) – Einfügen eines Schlüssels mit üblichem Algorithmus – Danach kann die AVL-Eigenschaft eines inneren Knotens k verletzt sein: – balance(k) := right.height - left.height // null.heigth := -1 – AVL-Eigenschaft: balance(k) ∈ { -1, 0, +1 } – Nach Einfügen: balance(k) ∈ { -2, -1, 0, +1, +2 } – Fallunterscheidung beim Einfügen: Verletzung der AVLEigenschaft können eintreten bei 1. Einfügen in linken Teilbaum des linken Kindes 2. Einfügen in rechten Teilbaum des linken Kindes 3. Einfügen in rechten Teilbaum des rechten Kindes 4. Einfügen in linken Teilbaum des rechten Kindes 1 und 3 sowie 2 und 4 sind symmetrische Problemfälle. Institut für Medizinische Informatik Technische Universität Braunschweig 4 6. Bäume 6.2 Ausg. Bäume Einfügen in AVL-Bäume (2/6) – Ist die AVL-Eigenschaft eines inneren Knotens k verletzt, so muss ausgeglichen werden. Die hierbei notwendigen Vertauschungen von Knoten bezeichnet man als Rotation. – Fall 1. (bzw. 3) Einfügen in linken Teilbaum des linken Kindes -2 Ungleichgewicht entsteht hier u -1 0 p 0 2. Rotation p balance(k) := right.height - left.height u z 1. Einfügen von k y e z y e Rotation mit linkem Kind nach rechts, analoge Operation nach links (spiegelbildlich) Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume Einfügen in AVL-Bäume (3/6) – Fall 2. (bzw. 4) Einfügen in rechten Teilbaum des linken Kindes -2 balance(k) := right.height - left.height Ungleichgewicht entsteht hier u 0 +1 g * z p 1. Einfügen von k 2. Doppelrotation p 0/+1 0/-1 g u w x y w x y z Doppelrotation mit linkem Kind nach links und bzgl. des Vaters nach rechts, analoge Operation nach links (spiegelbildlich) Institut für Medizinische Informatik Technische Universität Braunschweig 5 Einfügen in AVL-Bäume Zusammenfassung der Fälle 1. Einfügen in linken Teilbaum des linken Kindes => Rechtsrotation des Vaters 2. Einfügen in rechten Teilbaum des linken Kindes => Doppelrotation links/rechts des linken Kindes/Vaters 3. Einfügen in rechten Teilbaum des rechten Kindes => Linksrotation des Vaters 4. Einfügen in linken Teilbaum des rechten Kindes => Doppelrotation rechts/links des rechten Kindes/Vaters Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume Einfügen in AVL-Bäume (4/6) Beispiel (1/3): Einfügen von 3,2,1,4,... Einfügen 3 0 3 -1 2 3 0* 1 -1 2 2 1 -2 3 RR 1 4 2 2 1 1 3 1 3 4 *i.F. werden balance(k) = 0 u. irrelevante Werte weggelassen Institut für Medizinische Informatik Technische Universität Braunschweig 6 6. Bäume 6.2 Ausg. Bäume Einfügen in AVL-Bäume (5/6) Beispiel (2/3): Einfügen von ...5,6,7... 5 1 LR 2 2 6 2 2 2 1 3 1 4 1 4 1 1 1 3 4 3 5 5 5 LR 6 1 7 4 1 2 LR 4 4 2 2 5 2 5 6 1 3 1 6 3 1 6 3 1 5 7 7 Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume Einfügen in AVL-Bäume (6/6) Beispiel (3/3): Einfügen von ...9,8 9 4 1 8 4 1 2 1 2 6 3 1 7 5 6 2 3 1 7 5 -1 9 9 1 DR r/l 8 4 2 1 7 RR 2 1 8 LR 9 Institut für Medizinische Informatik 1 6 3 5 8 7 9 Technische Universität Braunschweig 7 6. Bäume 6.2 Ausg. Bäume Löschen in AVL-Bäumen – Analog zum Einfügen! – Löschen eines Schlüssels mit üblichem Algorithmus. – Danach kann die AVL-Eigenschaft eines inneren Knotens k verletzt sein. => Ggf. Balance des betroffenen, vom Vater aufgespannten Teilbaums durch Rotieren wieder herstellen. Aber: Rotieren kann Ausgeglichenheit weiterer Knoten auf dem Pfad zur Wurzel verletzen. => Balance rekursiv/iterativ ggf. bis zur Wurzel wieder herstellen. -1 -2 4 4 Löschen von 5 1 RR 2 -1 2 1 2 5 3 1 Institut für Medizinische Informatik 4 1 3 3 Technische Universität Braunschweig 6. Bäume 6.2 Ausg. Bäume 2.2 Red/Black-Bäume – Ein Red/Black-Baum ist ein Binärer Suchbaum, in dem jeder Knoten über ein Zusatzbit zur Speicherung seiner Farbe (0=Schwarz und 1 =Rot) verfügt. 38 41 – Auch Red/Black-Bäume basieren auf einem abgeschwächten Kriterium für eine ausgeglichene Höhe: Durch Einschränkungen bei der Färbung der Knoten auf den Pfaden von der Wurzel zu einem Blatt wird sichergestellt, dass jeder Pfad maximal doppelt so lang ist, wie jeder andere. – Für nicht vorhandene Kind-Knoten (bislang durch Referenz der Beziehung right/left auf null repräsentiert) wird ein spezieller Null-Knoten als Kind eingefügt, dessen Wert das Null-Objekt repräsentiert. Institut für Medizinische Informatik 41 Null 38 Null Null Technische Universität Braunschweig 8 6. Bäume 6.2 Ausg. Bäume Red/Black-Bäume: Definition Ein Binärer Suchbaum ist ein Red/Black-Baum, wenn er folgende Red/Black-Eigenschaft erfüllt: 1. 2. 3. 4. 5. Jeder Knoten ist entweder rot oder schwarz. Die Wurzel ist schwarz. Jedes Blatt (Null) ist schwarz. Wenn ein Knoten rot ist, so sind beide Kinder schwarz. Für jeden Knoten gilt, dass alle Pfade vom Knoten zu einem Blatt die selbe Anzahl schwarzer Knoten beinhalten. 8 4 12 2 6 1 Null 3 Null Null 10 5 Null Null 7 Null Null 14 9 Null Null 11 Null Null 13 Null 15 Null Null Null Null Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume Red/Black-Bäume: Black-Height Definition: Als black-height eines Knotens k - geschrieben bh(k) - gelte die Anzahl der schwarzen Knoten auf beliebigen Pfaden von k zu einem Blatt. Hierbei wird k selbst nicht mitgezählt. Anmerkung: Die black-height-Eigenschaft ist aufgrund der Red/Black-Eigenschaft 5 wohl definiert. Beispiel: bh(8) = 3 8 4 12 2 6 1 Null 3 Null Null 10 5 Null Null 7 Null Null Institut für Medizinische Informatik Null 11 Null 14 bh(11) = 1 9 Null bh(2) = 2 Null 13 Null Null 15 Null Null Null Technische Universität Braunschweig 9 6. Bäume 6.2 Ausg. Bäume Black-Height (1/3) Satz 9.2: Die Höhe eines Red/Black-Baumes mit n internen Knoten beträgt maximal 2 ld (n+1) . Beweis: Zunächst zeigen wir, dass jeder durch einen Knoten x aufgespannte Teilbaum wenigstens 2bh(x) -1 innere Knoten hat. Der Beweis erfolgt durch vollständige Induktion über die Höhe h von x. I.Anf.: h = 0 ⇒ x ist ein Blatt (=Null-Knoten) und der durch x aufgespannte Teilbaum enthält 2bh(x) -1 = 20 -1 = 0 innere Knoten. (o.k.) I.Ann.: Ein durch x aufgespannter Teilbaum der Höhe h hat wenigstens 2bh(x) -1 innere Knoten. Institut für Medizinische Informatik Technische Universität Braunschweig 6. Bäume 6.2 Ausg. Bäume Black-Height (2/3) Satz 9.2: Die Höhe eines Red/Black-Baumes mit n internen Knoten beträgt maximal 2 ld (n+1) . Beweis: (Fortsetzung) I.B.: Ein durch x aufgespannter Teilbaum der Höhe h+1 hat wenigstens 2bh(x) -1 innere Knoten. I.S.: x habe die Höhe h+1 und zwei Kinder. ⇒ Jedes Kind hat die black-height bh(x) oder bh(x) -1 abhängig davon, ob seine Farbe Rot oder Schwarz ist. ⇒ (Induktionsannahme) Jedes Kind von x hat mindestens 2bh(x)-1 -1 innere Knoten. ⇒ Der durch x aufgespannte Teilbaum hat mindestens (2bh(x)-1 -1)+(2bh(x)-1 -1)+1= 2bh(x) -1 innere Knoten. (q.e.d.) Institut für Medizinische Informatik Technische Universität Braunschweig 10 6. Bäume 6.2 Ausg. Bäume Black-Height (3/3) Satz 9.2: Die Höhe eines Red/Black-Baumes mit n internen Knoten beträgt maximal 2 ld (n+1) . Bereits bewiesen: Ein durch x aufgespannter Teilbaum der Höhe h+1 hat wenigstens 2bh(x) -1 innere Knoten. Sei nun h die Höhe des Baumes. Entsprechend Red/BlackEigenschaft 4 müssen mindestens die Hälfte aller Knoten auf allen Pfaden von der Wurzel zu einem Blatt (ausschließlich der Wurzel) schwarz gefärbt sein. ⇒ Die black-height der Wurzel muss mindestens h/2 betragen. ⇒ n ≥ 2h/2-1 ⇒ ld (n+1) ≥ h/2 oder h ≤ 2 ld (n+1) Institut für Medizinische Informatik Eig. 4: Wenn ein Knoten rot ist, so sind beide Kinder schwarz. Technische Universität Braunschweig 6. Bäume 6.2 Ausg. Bäume Basisalgorithmen für Red/Black-Bäume Da die Höhe eines Red/Black-Baumes durch h< 2 ld (n+1) beschränkt ist, liegen die Laufzeiten der Algorithmen – Suchen eines Knotens, – Minimum, Maximum, – Nachfolger und Vorgänger in O(log n). Institut für Medizinische Informatik Technische Universität Braunschweig 11 6. Bäume 6.2 Ausg. Bäume Einfügen in R/B-Bäume (1/5) – Einfügen eines Schlüssels mit üblichem Algorithmus, Rot-färben des eingefügten Knotens k sowie Ergänzung zweier Null-Knoten als Kinder. Danach kann die Red/Black-Eigenschaft des Baumes verletzt sein: – 1. 2. Jeder Knoten ist entweder rot oder schwarz. => Nicht verletzt. Die Wurzel ist schwarz. Verletzt nur dann, wenn k in den leeren Baum eingefügt wird. Aktion: k Schwarz färben. 3. Jedes Blatt (Null) ist schwarz. => Nicht verletzt. 4. Wenn ein Knoten rot ist, so sind beide Kinder schwarz. Nicht durch k verletzt, da beide Kinder schwarze Null-Knoten sind. Die Eigenschaft ist dann verletzt, wenn k als Kind eines roten Vater... Knotens eingefügt wird. 5. Für jeden Knoten gilt, dass alle Pfade vom Knoten zu einem Blatt die selbe Anzahl schwarzer Knoten beinhalten. Da nur ein roter Knoten hinzukommt, ist diese Eigenschaft ebenfalls nicht verletzt. ... 41 38 k Null Null Institut für Medizinische Informatik Technische Universität Braunschweig 6. Bäume 6.2 Ausg. Bäume Einfügen in R/B-Bäume (2/5) – Maßnahmen die Red/Black-Eigenschaft 4 wieder herzustellen sind 1. 2. Geeignete Links/Rechts/Doppel-Rotation zwecks Höhenausgleich. Dabei gibt die Einfärbung der Knoten Aufschluss über die notwendigen Rotationen. Korrektur der Einfärbung der falsch eingefärbten Knoten. Die Einfärbung wird dabei in Richtung der Wurzel korrigiert, wodurch eine Funktion zum Zugriff auf den Vaterknoten eines Knotens k nötig wird ==>> parent(k). – Sechs Fälle sind zu unterscheiden: a. parent(k) ist linkes Kind von parent(parent(k)). 1. Der „Onkel“ von k ist rot. 2. Der „Onkel“ von k ist schwarz und k ist rechtes Kind. 3. Der „Onkel“ von k ist schwarz und k ist linkes Kind. b. parent(k) ist rechtes Kind von parent(parent(k)). 3 analoge Fälle Institut für Medizinische Informatik Technische Universität Braunschweig 12 6. Bäume 6.2 Ausg. Bäume Einfügen in R/B-Bäume (3/5) Im Folgenden wird nur Fallgruppe a betrachtet: – Fall a.1: Der „Onkel“ von k ist rot. c a Umfärben d b α β c k a d k δ ε b α χ β δ ε χ Problem: Knoten c kann ebenfalls wieder Kind eines roten Knoten sein (erneute Verletzung von Eigenschaft 4). Dementsprechend wird in diesem Fall für c (=: k) rekursiv die Red/BlackEigenschaft wiederhergestellt. Der Fall, dass k linkes Kind von parent(k) ist, wird analog behandelt. Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume Einfügen in R/B-Bäume (4/5) – Fall a.2: Der „Onkel“ von k ist schwarz und k ist rechtes Kind. c c a Linksrotation d b α β k neues k δ ε χ α d b a χ β δ ε => Fall a.3 Durch Linksrotation der Knoten k und parent(k) entsteht Fall a.3 in Bezug auf den ehemaligen Vater-Knoten von k (=:k): Der „Onkel“ von k ist schwarz und k ist linkes Kind. Hierbei finden bezüglich der Eigenschaften bzw. bzgl. der Verletzung der Eigenschaften keine Veränderungen statt. => Weiter wie bei Fall a.3 beschrieben. Institut für Medizinische Informatik Technische Universität Braunschweig 13 6. Bäume 6.2 Ausg. Bäume Einfügen in R/B-Bäume (5/5) – Fall a.3: Der „Onkel“ von k ist schwarz und k ist linkes Kind. c d b k a χ b Umfärben & Rechtsrotation a k c d δ ε α β χ δ α ε β Die Rechtsrotation und Rot-färbung des Knoten c sowie die nachfolgende Schwarz-färbung von Knoten b gefährden Eigenschaft 5 nicht: Knoten c hatte vormals links und rechts die gleiche Anzahl schwarzer Knoten. Da b vormals rot war, wird die Anzahl nach Übernahme des rechten Teilbaums von b als linken Teilbaum dies nicht ändern. Knoten b bekommt rechts zwar einen schwarzen Knoten d hinzu, da vormals die Anzahl der schwarzen Knoten der von b über a oder χ laufenden Pfade aber gleich der von d (inklusive) ausgehenden Pfade war, bleibt Eigenschaft 5 gültig. (> Fertig) Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume 2.3 B-Bäume Ausgangspunkt: – Zugriff auf Primärspeicher (RAM) ist bzgl. Zugriffszeit „billig“ – Zugriff auf Sekundärspeicher (HD) ist „teuer“ und das vor allem dann, wenn – das Auslesen der Daten eine Änderung der Position des Lesekopfes nötig macht, – der Beginn des einzulesenden Bereichs abgewartet werden muss. Bereich benötigter Daten Datentrack n+1 Datentrack n Schreib-/Lesekopf Institut für Medizinische Informatik Idee: Zusammenhängende Daten, auf die i.d.R. immer komplett zugegriffen wird, möglichst hintereinander auf einem Track oder mehreren beieinander liegenden Tracks unterbringen. Technische Universität Braunschweig 14 6. Bäume 6.2 Ausg. Bäume B-Bäume: Aufbau Übertragung dieser Idee auf Suchbäume, die auf einem externen Medium gespeichert sind: Möglichst viele Knoten eines Suchpfades in einem zusammenhängenden Datenbereich speichern. => B-Bäume – B-Bäume sind ausgeglichene geordnete k-näre Suchbäume,deren Knoten – maximal (k-1) Werte bzw. Schlüssel tragen können – auf maximal k Kindknoten verweisen ⇒ B-Bäume sind nicht binär; B steht für „Balanced“ Werte Beispiel: 10 20 Knoten eines 4-nären B-Baumes 30 ... 13 ... 14 17 23 Institut für Medizinische Informatik Zeiger auf Kind-Knoten 24 Technische Universität Braunschweig 6. Bäume 6.2 Ausg. Bäume B-Bäume: Definition (1/3) Definition B-Baum T der Ordnung t: Ein (2t)-närer Baum T heißt B-Baum der Ordnung t ≥ 2, wenn folgende Eigenschaften erfüllt sind: 1. Jeder Knoten x hat die folgenden Felder bzw. Funktionen • n[x] ist die Anzahl der in Knoten x gespeicherten Werte • die n[x] Werte sind in aufsteigender Weise geordnet: value1[x] ≤ value2[x] ≤ ... ≤ valuen[x][x] • leaf[x] ist eine boole‘sche Funktion, die angibt, ob x ein Blatt ist, oder nicht. 2. Jeder innere Knoten x trägt n[x]+1 Zeiger c1[x], c2[x], ... cn[x]+1[x] auf seine Kind-Knoten. 3. Die Werte valuei[x] unterteilen die in den Teilbäumen gespeicherten Werte. Sei treeValues(y) die Menge aller in einem B-Baum mit Wurzel y gespeicherten Werte, so gilt für 1 ≤ i < n[x]: ∀ vi ∈ treeValues(ci[x]), vi+1 ∈ treeValues(ci+1[x]): vi ≤ valuei[x] ≤ vi+1 Institut für Medizinische Informatik Technische Universität Braunschweig 15 6. Bäume 6.2 Ausg. Bäume B-Bäume: Definition (2/3) Definition B-Baum T der Ordnung t (Fortsetzung): 4. Jedes Blatt hat das gleiche Niveau. Es entspricht der Höhe h des Baumes. 5. Die Ordnung t ≥ 2 definiert die obere und untere Grenze der Anzahl Werte und Kind-Knoten eines Knoten: • Jeder Knoten mit Ausnahme der Wurzel trägt wenigstens t -1 Werte. • Jeder innere Knoten mit Ausnahme der Wurzel hat wenigstens t Kind-Knoten. • Ist der Baum nicht leer, so trägt die Wurzel wenigstens einen Wert. • Jeder Knoten trägt maximal 2 t -1 Werte. Damit hat jeder innere Knoten höchstens 2t Kinder. Ein Knoten heißt voll, wenn er genau 2t-1 Werte trägt. D.h. t-1 ≤ n[x] ≤ 2*t-1 für alle Knoten m.A.d. Wurzel und t ≤ #Kinder von x ≤ 2*t für innere Knoten m.A.d. Wurzel Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume B-Bäume: Definition (3/3) Beispiel eines B-Baumes der Ordnung 3: ⇒ Für alle Knoten x m.A.d. Wurzel gilt 3-1=2 ≤ n[x] ≤ 2*3-1=5 ⇒ Für alle innere Knoten x m.A.d. Wurzel gilt: 3 ≤ #Kinder ≤ 2*3=6 value1[x] Knoten x c1[x] 3 7 50 value2[x] 10 20 30 40 55 59 70 75 c2[x] 8 9 13 14 Anmerkungen • • 45 Wurzel 17 ...... 65 66 ...... Blätter Knoten x ist voll, sein rechter Bruder nicht. Es gibt insgesamt 11 Blätter, die alle das Niveau 2 (=Höhe des Baumes) haben. Institut für Medizinische Informatik Technische Universität Braunschweig 16 6. Bäume 6.2 Ausg. Bäume B-Bäume: Anmerkungen – Alle Pfade von der Wurzel bis zu den Blättern sind in einem B-Baum gleich lang. – Typischerweise werden B-Bäume hoher Ordnung verwendet. ⇒ Knoten enthalten sehr viele Werte ⇒ Höhe des Baumes ist dafür niedrig. Vorteil: Ein Knoten kann „in einem Rutsch“ von einer Festplatte geladen werden. – B-Bäume werden im Zusammenhang mit Datenbanken z.B. für Indexstrukturen verwendet. – Die Anzahl der Knoten eines Niveaus nimmt bei einem vollständigen B-Baum der Ordnung t exponentiell zur Basis 2t zu: Jeder Knoten hat 2t Kinder ⇒ Auf Niveau n befinden sich (2t)n Knoten – Die Ordnung t eines B-Baumes wird auch als minimaler Grad (minimum degree) bezeichnet. Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume Höhe eines B-Baumes (1/2) Die Laufzeit und damit die Anzahl der Festplattenzugriffe ist für die meisten B-Baum-Operationen abhängig von der Höhe des Baumes. Satz 9.3: Ist n ≥ 1 die Anzahl der Werte (Schlüssel) eines BBaumes T der Höhe h der Ordnung t, so gilt h ≤ log t n +1 2 Beweis: Hat ein B-Baum die Höhe h, so trägt die Wurzel wenigstens einen Wert und alle anderen Knoten tragen wenigstens t-1 Werte. Innere Knoten haben wenigstens t Kinder. ⇒ Wenigstens zwei Knoten befinden sich auf Niveau 1. ⇒ Wenigstens 2t Knoten befinden sich auf Niveau 2. ⇒ Wenigstens 2t² Knoten befinden sich auf Niveau 3 u.s.w. ⇒ Auf Niveau h befinden sich 2th-1 Knoten Institut für Medizinische Informatik Technische Universität Braunschweig 17 6. Bäume 6.2 Ausg. Bäume Höhe eines B-Baumes (2/2) Satz 9.3: Ist n ≥ 1 die Anzahl der Werte (Schlüssel) eines B-Baumes T der Höhe h der Ordnung t, so gilt h ≤ log t n +1 2 Beweis (Fortsetzung): Auf Niveau h befinden sich 2th-1 Knoten ⇒ n ≥ 1 + (t − 1)∑i =1 2t i −1 h t h −1 = 1 + 2(t − 1) t −1 (wg. mind. t-1 Schlüsseln pro Knoten) = 2t h − 1 ⇒ th ≤ (n+1)/2 ⇒ h ≤ log t n +1 2 nach Anwendung des Logarithmus zur Basis t. (q.e.d.) Institut für Medizinische Informatik 6. Bäume Technische Universität Braunschweig 6.2 Ausg. Bäume Suchen in B-Bäumen (1/3) Suche in B-Bäumen kombiniert die – Suche in Binären Suchbäumen – Suche in Listen bzw. Folgen Ausgangspunkt: Jeder Knoten sei durch einen Zugriff auf die Festplatte (diskRead() oder diskWrite()) in den Speicher zu laden bzw. zu schreiben. Algorithmus (Pseudocode) zum Suchen eines Wertes v: 1. Lies den Wurzelknoten x ein (diskRead()). 2. Vergleiche in x beginnend mit i = 1 jeden Wert valuei[x] mit v, bis ein erster Wert valuei[x] ≥ v oder i = n[x] ist Fallunterscheidung: a. Ist v = valuei[x], dann liefere Knoten x und Index i zurück und beende die Suche b. Ist v ≠ valuei[x] und x ein Blatt, so ist der Wert nicht enthalten: die Suche wird beendet. c. Ist valuei[x] > v bzw. valuei[x] < v (i=n[x]), so lies Knoten ci[x] bzw. ci+1[x] als neuen Knoten x ein und mache weiter bei Schritt 2 Institut für Medizinische Informatik Technische Universität Braunschweig 18 6. Bäume 6.2 Ausg. Bäume Suchen in B-Bäumen (2/3) Beispiel: Suchen des Buchstaben Q in folgenden B-Bäumen der Ordnung 3 Q=N? Q>N=value1[x1]: Verfolge c2[x1] x1 N C K A B D E F H * P Q R x3 L M ** ** Q>P=value1[x3]: Vergleiche mit value2[x3] Q=N? A B D E F H Q<S L M T V X Y Z Q=Q=value2[x3]: Liefere x3 und 2 zurück Q>N x1 N C K * Q<S=value1[x2]: Verfolge c1[x2] S W x2 O P R x3 O<Q & P<Q Institut für Medizinische Informatik 6. Bäume *** R>Q & x3ist Blatt: Liefere Null zurück S W x2 T V *** X Y Z Technische Universität Braunschweig 6.2 Ausg. Bäume Suchen in B-Bäumen (3/3) Analyse des Laufzeitverhaltens des Suchalgorithmus 1. Die Suche innerhalb eines Knotens erfolgt linear und ist beendet, – wenn ein Wert größer oder gleich dem gesuchten Wert ist – oder alle n[x] Werte des Knotens betrachtet worden sind. In einem B-Baum der Ordnung t ist n[x] < 2t. Daher liegt die Laufzeit dieser lokalen Suche in O(t). 2. Wird der Wert in einen inneren Knoten nicht gefunden, so wird analog zum Binären Suchbaum der nächste Knoten in Richtung der Blätter weitergesucht. Die Anzahl der besuchten Knoten sowie die Anzahl der Festplattenzugriffe ist damit abhängig von der Höhe h des Baumes. Sie liegt daher in Θ(h) = Θ(logt n) nach Satz 9.3. 3. Die Laufzeit des gesamten Algorithmus liegt nach 1. und 2. in Ο( t ∗ h ) = Ο(t logt n) Institut für Medizinische Informatik Technische Universität Braunschweig 19 6. Bäume 6.2 Ausg. Bäume Einfügen in B-Bäume (1/5) Das Einfügen eines Wertes in einen B-Baum der Ordnung t ist erheblich komplizierter als bei Binären Suchbäumen: – Zunächst wird analog zu Binären Suchbäumen ein Blatt gesucht, in dem der Wert gespeichert werden kann. – Sollte das Blatt vor dem Einfügen bereits voll gewesen sein, so verstößt der Baum danach gegen die B-Baum-Definition! Ausweg: Aufteilen des „übervollen“ Knotens in zwei Knoten am „Median“ des ursprünglichen Knotens. Beispiel: B-Baum der Ordnung 3. Es gilt 2 ≤ n[x] ≤ 5 und 3 ≤ #Kinder ≤ 6 für alle inneren Knoten x m.A.d. Wurzel (Obergrenzen gelten für alle Knoten). S Einfügen von W C K S X Y Blatt x Institut für Medizinische Informatik C K W X Y Aufsplitten & Einfügen Technische Universität Braunschweig 6. Bäume 6.2 Ausg. Bäume Einfügen in B-Bäume (2/5) – Der neue Vaterknoten muss nun in den ursprünglichen Vaterknoten integriert werden, wodurch wieder die B-Baum-Eigenschaft verletzt sein kann. Rekursiv in Richtung Wurzel ist demnach solange jeder so entstehende „übervolle“ Knoten aufzuteilen, bis spätestens ein neuer Vater die „neue“ Wurzel des Baumes bildet (B-Bäume wachsen in Richtung Wurzel). – Das beschriebene Verfahren durchläuft den Baum ggf. zweimal: Erst wird der Baum in Richtung eines Blattes durchsucht, der Knoten eingefügt und dann in Richtung der Wurzel ausgeglichen. – Ein effizienteres Verfahren, dass den Baum nur einmal durchläuft, teilt auf dem Suchpfad in Richtung des Zielblattes vorsorglich jeden vollen Knoten auf und fügt zum Schluss den Wert in einen Knoten ein, der sicher nicht voll ist. > One-pass-Verfahren Institut für Medizinische Informatik Technische Universität Braunschweig 20 6. Bäume 6.2 Ausg. Bäume Einfügen in B-Bäume (3/5) Beispiel (1/3): Einfügen der Buchstaben F, S, Q, K, C, L, H, T, V, W, M, R, N, P in einen B-Baum der Ordnung 3 (max. 5 Werte). L K K H T V C F K Q S C F W C F H M R N K S C F H L Q S L Q K S T V W P L Q S T V C F H L M N Q R T V W K N S C F H L M P Q R T V W Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume Einfügen in B-Bäume (4/5) Beispiel (2/3): Einfügen der Buchstaben A, B, X, Y, D, Z in den BBaum der Ordnung 3 (max. 5 Werte). A B X Y K N S A B C F H L M D T V W X Y C K N S A B D F H Z A B P Q R L M P Q R T V W X Y C K N S W D E F H L M Institut für Medizinische Informatik P Q R T V X Y Z Technische Universität Braunschweig 21 6. Bäume 6.2 Ausg. Bäume Einfügen in B-Bäume (5/5) Beispiel (3/3): Einfügen des Buchstaben E in den B-Baum der Ordnung 3 (max. 5 Werte) einmal ohne One-Pass-Verfahren und einmal mit. E A B ohne One-passVerfahren C K N S W D E F H L M P Q R T V X Y Z N E A B C K D E F H L M mit One-passVerfahren S W P Q R T V X Y Z Technische Universität Braunschweig Institut für Medizinische Informatik 6. Bäume 6.2 Ausg. Bäume Löschen in B-Bäumen (1/8) Zum Löschen eines Wertes in einen B-Baum der Ordnung t: 1. Zunächst wird der Knoten x gesucht, in dem der Wert v (=valuei[x] für ein i ) gelöscht werden soll. 2. Wird der Wert aus dem betreffenden Knoten x entfernt, so können folgende Fälle auftreten: – – Alle Beispielbäume zum Löschen haben die Ordnung 3 Fall 1: x ist ein Blatt und trägt mehr als t-1 Werte oder ist zugleich die Wurzel. Dann kann der Wert einfach gelöscht werden. Fall 2: x ist ein Blatt, trägt die minimale Anzahl von t-1 Werten und ein Bruder b von x trägt mindestens t Werte. Dann findet vor dem Löschen eine Rotation des kleinsten bzw. größten Wertes von b mit dem Wert des Vaterknotens statt, dessen Teilbäume b und x sind. K N S F H x L M b P Q R Löschen von M T V F H K P S L N Q R T V P ist kleinster Wert im rechten Bruder b von x Institut für Medizinische Informatik Technische Universität Braunschweig 22 6. Bäume 6.2 Ausg. Bäume Löschen in B-Bäumen (2/8) – Fall 3: x ist ein Blatt und trägt die minimale Anzahl von t-1 Werten. Gleiches gilt für beide Brüder. Dann findet eine Verschmelzung von x und einem Bruder b statt, wobei der Wert des Vaterknotens, dessen Teilbäume b und x sind, in der Mitte des neuen Knotens zwischen den Werten von x und b gespeichert wird. K P S F H x L M b Q R Löschen von M T V F H K S L P Q R T V Problem: der Vaterknoten kann damit die kritische Größe (t-1 Werte) unterschreiten, wodurch Ausgleichsaktionen nötig werden! Lösung: s.u. Institut für Medizinische Informatik Technische Universität Braunschweig >>> PDF 6-74 Institut für Medizinische Informatik Technische Universität Braunschweig 23 6. Bäume 6.2 Ausg. Bäume Einfügen & Löschen: Laufzeitanalyse Analyse des Laufzeitverhaltens beim Einfügen & Löschen 1. Zunächst muss der für Einfügen/Löschen relevante Knoten x gesucht und der richtige Index i bestimmt werden. Beim Einfügen wird hierfür ein Blatt gesucht, das Löschen kann potenziell jeden Knoten betreffen. Daher liegt die Laufzeit dieser lokalen Suche entsprechend der Laufzeitanalyse des Suchalgorithmus in O(t logt n). 2. Sowohl beim Löschen, als auch beim Einfügen, werden dabei Ausgleichoperationen vorgenommen. Da diese aber lokal beschränkt sind, und jeden Knoten des Suchpfades maximal einmal betrifft, kommt allenfalls eine Konstante additiv hinzu. 3. Die Laufzeit der beiden Algorithmen liegen demnach ebenfalls in Ο(t logt n) Institut für Medizinische Informatik Technische Universität Braunschweig 12. Sortieralgorithmen 4. Heap Sort • Heap Sort stellt keine Voraussetzungen bzgl. der zu sortierenden Daten • Gegeben: unsortiertes Array a • Ausgabe: sortiertes Array a • Verwendung einer spezifischen (virtuellen) Datenstruktur: (Binärer) Heap 1. Array interpretiert als ausgeglichener binärer Baum B: • • bis auf Ebene der Blätter vollständig Ebene der Blätter ist gefüllt von links bis zu einem Endpunkt 2. Nicht die Suchbaumeigenschaft, sondern die HeapEigenschaft gilt in B Institut für Medizinische Informatik Technische Universität Braunschweig 24 12. Sortieralgorithmen 12.4 Heap Sort Heaps (1/2) Definition: Ein (binärer) Heap ist ein Array a mit Indexmenge {1,..,n} für n∈IN das bis zu einem Index h < n (der sog. Heap-Size) mit Werten des eigentlichen Heaps belegt ist: 1. a.length=n repräsentiere die "Länge" des Arrays 2. a.heapSize=h repräsentiere die Belegung mit Heap-Werten. Für den durch den Heap repräsentierte Binärbaum gelte: – a[1] repräsentiert die Wurzel des Baumes – 2k repräsentiert das linke Kind von Knoten k∈{1,..,h} Hilfsfunktion: left:IN→IN mit left(k)= 2k – 2k+1 repräsentiert das rechte Kind von Knoten k∈{1,..,h} Hilfsfunktion: right:IN→IN mit right(k)= 2k+1 – k/2 repräsentiert den Vater von Knoten k∈{1,..,h} Hilfsfunktion: parent:IN→IN mit parent(k)= k/2 Technische Universität Braunschweig Institut für Medizinische Informatik 12.4 Heap Sort 12. Sortieralgorithmen Heaps (2/2) Definition (Fortsetzung): In einem (Max-)Heap gilt die (Max-)Heap-Eigenschaft: a[parent(k)] ≥ a[k] f. k∈{2,..,h} D.h. Werte der Kinder eines Knotens sind kleiner oder gleich dem Wert des Vaterknotens (Min-Heap entsprechend; hier: Max-Heaps). Beispiel (Max-Heap): 9 1 2 3 4 5 6 7 8 9 a 9 6 8 1 5 7 2 0 3 mit n=9 und h=6 Institut für Medizinische Informatik ≈ 1 2 3 6 8 4 1 5 5 6 7 left(3) =3*2=6 right(2) =2*2+1=5 parent(5) =5/2=2,5 =2 Technische Universität Braunschweig 25 12. Sortieralgorithmen 12.4 Heap Sort Dienste Heap Sort benötigt 3 Dienste bzw. Prozeduren: 1. Max-Heapify bzw. maxHeapify(): stellt die Max-Heap-Eigenschaft für einen Teilbaum sicher 2. Build-Max-Heap bzw. buildMaxHeap(): konstruiert ausgehend von einem unsortierten Array einen (Max-)Heap 3. Heapsort bzw. heapSort(): sortiert ein ungeordnetes Array speicherneutral (d.h. das Array selbst ohne ein zweites gleichgroßes Array) Aufrufstruktur: buildMaxHeap() maxHeapify() heapSort() n/2 n-1 maxHeapify() Technische Universität Braunschweig Institut für Medizinische Informatik 12. Sortieralgorithmen 12.4 Heap Sort Max-Heapify (1/4) Eingabe: 1. Referenzparameter Array a: Heap mit ggf. verletzter HeapEigenschaft 2. Wertparameter Index k: gibt Knoten in a an, der HeapEigenschaft im Teil-Heap verletzt, wobei Teilbäume von k Heap-Eigenschaft einhalten Ausgabe: Array a mit Teil-Heap aufgespannt durch Knoten k, der Heap-Eigenschaft erfüllt Verletzt HeapEigenschaft k heapify (a,k) Erfüllt HeapEigenschaft k Erfüllt Heap-Eigenschaft Institut für Medizinische Informatik Technische Universität Braunschweig 26 12. Sortieralgorithmen 12.4 Heap Sort Max-Heapify (2/4) Algorithmus Max-Heapify 1. Rekursive Kontrollstruktur 2. Hilfsfunktion: swap(a,i,j) tauscht Inhalt von a[i] mit dem von a[j] Algorithmus in Pseudocode: S. PDF-Datei Folie 6-81 Aber erst das Prinzip an einem Beispiel: .... Technische Universität Braunschweig Institut für Medizinische Informatik 12. Sortieralgorithmen 12.4 Heap Sort Max-Heapify (3/4) Beispiel: maxHeapify(a,2) 17 1 17 2 5 11 5 9 10 8 2 k 8 7 1 11 17 2 9 10 2 7 11 3 3 10 4 5 8 2 Institut für Medizinische Informatik 7 6 1 4 9 10 6 1 4 8 7 6 1 11 5 5 6 5 3 8 10 4 7 6 4 3 11 10 4 8 2 3 k 6 1 7 11 3 Technische Universität Braunschweig 27 12. Sortieralgorithmen 12.4 Heap Sort Max-Heapify (4/4) Zur Laufzeit: • Alle Operationen in Max-Heapify bis auf den rekursiven Aufruf sind in O(1) implementierbar. • Falls ein rekursiver Aufruf erfolgt, dann nur auf Knoten, die unterhalb von k liegen. • Die Aufruffolge ist daher durch die Höhe des von k aufgespannten Teilbaums nach oben begrenzt. • Da auch der Teilbaum vollständig ist, liegt die Laufzeit von Max-Heapify innerhalb von O(log n). Institut für Medizinische Informatik Technische Universität Braunschweig 12. Sortieralgorithmen 12.4 Heap Sort Build-Max-Heap (1/5) Eingabe: Referenzparameter Array a: ungeordnetes Array (insb. erfüllt a ggf. nicht die Max-Heap-Eigenschaft) Ausgabe: Umsortiertes Array a, wobei Max-Heap-Eigenschaft erfüllt ist Algorithmus: Wende maxHeapify() auf alle inneren Knoten von Heap a an. O.Bew. (Übung): Indizes innerer Knoten liegen in { 1, 2, ..., n/2 } maxHeapify() maxHeapify() angewendet auf Knoten k erwartet, das k's Teilbäume die Heap-Eigenschaft erfüllen => maxHeapify() muss hintereinander auf die Knoten n/2 , n/2 -1, ..., 2, 1 angewendet werden. Institut für Medizinische Informatik Technische Universität Braunschweig 28 12. Sortieralgorithmen 12.4 Heap Sort Build-Max-Heap (2/5) Algorithmus in Pseudocode: proc Build-Max-Heap(a: <Referenz auf T[]>) begin var i: int; a.heapSize ← a.length; for i ← a.length / 2 downto 1 do Max-Heapify(a, i); od; end Korrektheit von buildMaxHeap(): z.Z. Schleifeninvariante: Zu Beginn jeder Iteration gilt, dass jeder Knoten von i+1 bis n (=a.length) die Wurzel eines Max-Heaps ist. Lösung: Übung (Induktion) Technische Universität Braunschweig Institut für Medizinische Informatik 12. Sortieralgorithmen 12.4 Heap Sort Build-Max-Heap (3/5) Beispiel: Array a mit n = 11 (=>Beginn der Iteration bei n/2 = 5) 1 12 2 j 8 9 10 5 8 7 6 11 2 2 3 j 1 6 5 11 8 5 17 4 9 10 8 2 5 j 11 8 10 17 9 10 8 7 6 4 11 2 3 1 6 4 1 4 5 4 12 3. Iteration 2. Iteration 10 17 3 3 6 1 5 11 2 3 6 4 1 12 12 1 2 j 7 10 11 3 Institut für Medizinische Informatik 3 6 17 4 4. Iteration 5 11 8 5 6 1 4 9 10 8 2 7 10 11 3 Technische Universität Braunschweig 29 12. Sortieralgorithmen 12.4 Heap Sort Build-Max-Heap (4/5) Beispiel (Fortsetzung): 12 1 2 3 j 11 5 6 8 5 1 3 a 12 6 1 4 9 10 1 4 9 10 6 7 10 11 2 3 2 3 4 12 6 1 11 5 6 7 8 9 10 11 3 17 10 5 8 2 4 7 10 11 2 6 1 5 6 8 5 11 8 5 8 2 4 17 4 3 j 17 8 5. Iteration 11 2 3 11 10 1 4 9 10 5 7 6 1 2 17 4 8 j 12 3 1 a 2 3 4 5 6 7 8 9 10 11 17 11 12 8 4 1 10 5 6 2 3 Technische Universität Braunschweig Institut für Medizinische Informatik 12. Sortieralgorithmen 12.4 Heap Sort Build-Max-Heap (5/5) Laufzeitanalyse: (2) = O(ld(n)) => Laufzeit von buildMaxHeap liegt in O(n ld(n)) (1) //... for i ← a.length / 2 downto 1 do (2) Max-Heapify(a, i); // ... Aber: eine genauere Abschätzung ist möglich. Voraussetzungen (o.B.>Übung): 1. ein Heap mit n Elementen hat die Höhe ld n 2. Höchstens n/2h+1 Knoten haben die Höhe h. ∞ 1/ 2 h Weiterhin gilt: = =2 ∑ h (1 − 1 / 2) 2 h =0 2 Damit: ld n ∞ ld n h h n = ( ) = O (n ) => lineare O n = ( ) O n O ( h ) ∑ ∑ h h h +1 h =0 2 h =0 2 Laufzeit ∑ 2 h =0 Institut für Medizinische Informatik Technische Universität Braunschweig 30 12. Sortieralgorithmen 12.4 Heap Sort Prozedur Heap-Sort (1/5) Eingabe: Referenzparameter Array a: ungeordnetes Array (insb. erfüllt a ggf. nicht die Heap-Eigenschaft) Ausgabe: Sortiertes Array a. Algorithmus: 1. Konstruiere Max-Heap 2. Vertausche erstes (=Wurzel) bzw. größtes und letztes (=Blatt ganz rechts) Element des Heaps ... 3. Reduziere Heap um das Blatt ganz rechts 4. Wende maxHeapify() auf die Wurzel an. 5. Solange Blätter vorhanden und nicht gleich der Wurzel > Schritt 2 Institut für Medizinische Informatik heapSort() Technische Universität Braunschweig >>> PDF 6-89 Institut für Medizinische Informatik Technische Universität Braunschweig 31 12. Sortieralgorithmen 12.4 Heap Sort Prozedur Heap-Sort (3/5) Beispiel: 12 1 a 2 3 4 12 6 1 11 5 6 7 9 10 11 8 3 17 10 5 8 2 4 2 ≈ 3 6 1 4 5 11 2 5 7 12 4 5 8 11 2 6 10 1 9 10 5 7 6 4 8 3 3 11 1.Iteration swap() 10 1 9 10 6 2 6 4 1 3 12 4 5 4 3 11 8 11 2 1 17 8 8 10 17 9 10 5 7 6 3 8 buildMaxHeap(a) (s.o.) 1 11 2 17 Technische Universität Braunschweig Institut für Medizinische Informatik 12. Sortieralgorithmen 12.4 Heap Sort Prozedur Heap-Sort (4/5) Beispiel (Fortsetzung): 12 1 2 10 4 5 8 8 6 8 2 3 5 5 2 12 7 6 1 4 9 10 11 12 17 17 Institut für Medizinische Informatik 3 8 3 4 3 11 1 2 3.Iteration swap() & maxHeapify() 5 6 8 5 12 7 6 1 4 9 10 11 3 1 10 10 6 6 7 6 4 1 8 8 5 9 10 5 17 4 10 4 8 11 2 3 11 2.Iteration swap() 3 1 11 2.Iteration maxHeapify() 7 6 4 9 10 5 2 3 11 1.Iteration maxHeapify() 1 2 2 11 17 Technische Universität Braunschweig 32 12. Sortieralgorithmen 12.4 Heap Sort Prozedur Heap-Sort (5/5) Beispiel (Fortsetzung): 1 8 2 4.Iteration swap() & maxHeapify() 3 6 5 5 11 3 5 9 10 12 7 6 8 6 5 11 9 10 10 1 4 8 11 7 6 8 11 12 17 3 4 10 5 1 2 8 3 4 2 17 2 4 3 5 2 11 12 1 ... 1 9 10 10 7 6 4 8 2 5. Iteration swap() & maxHeapify() 3 4 1 6 ≈ 1 2 3 4 5 6 7 a 8 9 10 11 1 2 3 4 5 6 8 10 11 12 17 11 17 Technische Universität Braunschweig Institut für Medizinische Informatik Zusammenfassender Vergleich der Sortieralgorithmen n = Anzahl Elemente der zu sortierenden Folge Algorithmus Worst Case Aver. Case In place • • • • O(n²) O(n²) O(n²) O(k+n)=O(n) O(n²) O(n²) O(n²) O(k+n)=O(n) Ja Ja Ja Nein O(mn+m²)=O(n) O(mn+m²)=O(n) Nein O(n) O(n ld n) O(n ld n) O(n ld n)** Nein Nein+++ Ja Ja Insertion Sort+ Selection Sort Bubble Sort Counting Sort* (größte ganze Zahl k=O(n)) • Radix Sort* (bei m Ziffern und Counting Sort) • • • • Bucket Sort* Merge Sort++ Heap Sort Quick Sort O(n) O(n ld n) O(n ld n) O(n²) +Arrayimplementierung; Gut bei kleinen Arrays! ++Gut für externe Sortierung +++Wg. merge() *Für geig. Grundmengen **Kleine konst. Faktoren! Gut (am besten) für große Arrays! Institut für Medizinische Informatik Technische Universität Braunschweig 33