5. Balancierte Bäume 5 Einfügen, Streichen Bsp.: {2, 3, 5, 7, 11, 13, 17} 2 7 3 13 11 17 Knoten hat Verweis auf linkes und rechtes Kind (lchild, rchild) Oft auch Verweis auf Elternknoten. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 1 Knotenorientierte Speicherung: 1. Ein Element pro Knoten 2. Alle Elemente im linken Teilbaum von v < Element an v < alle Elemente im rechten Teilbaum von v, für alle v Blattorientierte Speicherung: 1. Ein Element pro Blatt 2. Alle Elemente im linken Teilbaum von v ≤ Schlüssel an v < alle Elemente rechts 4 2 6 10 2 3 5 7 Vorlesung Algorithmen (RN/MK/AZ) 11 WSI für Informatik, Universität Tübingen 2 Benutzen knotenorientierte Speicherung Suche (x): u Wurzel; found false while (u < > 0) and not found do if info(u) = x then found else if x < info(u) then u else u rchild(u) true lchild(u) Einfüge (x): Zuerst Suche (x). Sei u der zuletzt besuchte Knoten. u hat höchstens ein Kind (oder x ∈ S ). Falls x < Info(u), erzeuge neuen Knoten mit Beschriftung x als linkes Kind von u, andernfalls als rechtes Kind. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 3 Streiche (x): Zuerst Suche (x). Ist x ∈ S , endet Suche in Knoten u mit info(u) = x. Fall 1: u ist Blatt. Streiche u u Fall 2: u hat nur ein Kind w. Streiche u und setze w an die Stelle von u als Kind von u`s Elternknoten. v w u w Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 4 Fall 3: u hat 2 Kinder. Suche Knoten v mit größter Beschriftung im linken Teilbaum von u. (Einmal nach links, dann nach rechts, bis es nicht mehr geht). v hat höchstens ein Kind (evtl. lchild). Ersetze u durch v, und streiche v an alter Stelle mit Fall 1 oder Fall 2. u 8 7 2 9 1 2 5 10 3 7 4 6 Vorlesung Algorithmen (RN/MK/AZ) v 9 1 5 3 10 6 4 WSI für Informatik, Universität Tübingen 5 Komplexität: O(h + 1), wobei h Höhe des Suchbaums kann sehr schlecht sein: Idee: 1. Hoffen, dass das selten vorkommt. 2. Baue Baum von Zeit zu Zeit neu auf (ausgewogen) 3. Balancierte Bäume! Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 6 5.1 Balancierte Bäume: AVL-Bäume Def.: Sei u Knoten in binärem Baum. Balance: Bal(u) = Höhe des rechten Teilbaums von u Höhe des linken Teilbaums von u -1 -1 Def.: Ein binärer Baum heißt AVL-Baum, falls Bal(u ) ≤ 1 für alle Knoten u. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 7 Def.: Fibonacci-Bäume T0, T1, T2 sind definiert durch T0 = leerer Baum T1 = Tn = für n ≥ 2 Tn-1 Tn-2 Fibonacci-Zahlen F0, F1, ... : F0 = 0, F1 = 1, Fn= Fn-1 + Fn-2 Behauptung: Th enthält genau Fh Blätter für h ≥ 0. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 8 Behauptung: AVL-Baum der Höhe h enthält ≥ Fh Blätter. Beweis: Durch Induktion über h. h = 0: OK h = 1: OK h ≥ 2 : Man erhält blattärmsten AVL-Baum der Höhe h, indem man blattärmsten AVL-Baum der Höhe h – 1 mit dem blattärmsten der Höhe h – 2 kombiniert. Th-1 Th-2 Nach Induktionsannahme hat der Baum ≥ Fh −1 + Fh − 2 = Fh Blätter. αh − βh Behauptung: Für h ≥ 0 ist Fh = mit 5 1+ 5 1- 5 α= und β = . 2 2 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen (Induktion) 9 Lemma: Ein AVL-Baum mit n Knoten hat Höhe O(log n). Beweis: Der Baum hat ≤ n Blätter. αh − βh ≤ n. Also Fh ≤ n oder 5 αh − βh αh ≥ Da β < 1 : für h groß genug. 5 2 5 αh α ≈ 1.9, ⇒ n≥ 2 5 β ≈ 0 .1 h ⇒ α ≤ 2 5 ⋅n ( ) log (2 5 ) + log n = O (log n ) h≤ h log(α ) ≤ log 2 5 + log n log(α) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 10 Einfügen / Streichen: Beschriften jedes Knotens v mit seiner Balance Bal(v). Einfügen: Durch Einfügen eines Knotens w können Balancen einiger Vorfahren von w Werte ± 2 annehmen. Sei u der tiefste dieser Vorfahren. O.B.d.A. sei Bal(u) = 2. w wurde also im rechten Unterbaum von u eingefügt. Sei v rechtes Kind von u. Beachte: Bal(v) ≠ 0, da Höhe von v verändert wurde. Fall 1: Bal(v) = 1 v h+2 u h+3 u h+1 h+2 Rotation.Links(u) v h+1 h h ⇒ h+1 h A h B C Vorlesung Algorithmen (RN/MK/AZ) A B WSI für Informatik, Universität Tübingen C 11 Beachte: (1) Die Rotation bewahrt die links-nach-rechts-Ordnung. A-u-B-v-C. (2) u und v haben nach der Rotation die Balance 0. Alle Knoten in A, B und C haben die gleiche (legale) Balance wie vor der Rotation. (3) Höhe von v nach der Rotation ist gleich der Höhe von u vor dem Einfügen von w. Also sind nach der Rotation keine Vorfahren von v unbalanciert. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 12 Fall 2: Bal(v) = –1 h+4 u 2 oder (B,C) vertauscht. v h+1 h+2 –1 h+3 z A h h+1 B C D h+1 Ro Do tati ppe on. lLin ks( u) h+3 z u h+2 h+1 h+1 A Vorlesung Algorithmen (RN/MK/AZ) 0 / –1 B 0 v h+2 h C WSI für Informatik, Universität Tübingen 1/0 h+1 D 13 Es gibt damit 4 Rotationsoperationen auf AVL-Bäumen: • Bal(u) = 2, Bal(v) = 1: Rotation.Links(u) • Bal(u) = -2, Bal(v) = -1: Rotation.Rechts(u) • Bal(u) = 2, Bal(v) = -1: Doppelrot.Links(u) • Bal(u) = -2, Bal(v) = 1: Doppelrot.Rechts(u) Beachte: Die Rotationsoperationen sind lokale Operationen, die nur das Umhängen einiger Zeiger erfordern, und jeweils in Zeit O(1) erfolgen Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 14 Einfügealgorithmus: Füge neues Blatt w ein. Dann folge dem Pfad von w zur Wurzel, wobei alle Balancen neu berechnet werden. Tritt eine Balance ± 2 auf, dann führe Rotation oder Doppelrotation aus. Beende das Einfügen. Laufzeit: O(Höhe des Baums) = O(log n), n = # Knoten Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 15 Streichen: Wie beim Einfügen können Knoten Balance ± 2 annehmen. Sei u der tiefste solche Knoten, sei Bal(u) = 2, und sei v das rechte Kind von u. Fall 1: Bal(v) = 1; balanciere wie beim Einfügen. Fall 2: Bal(v) = –1; analog. Unterbäume B und C können jetzt beide die gleiche Tiefe haben. Im Fall 1 und 2 hat der betroffene Baum nach der Balancierung kleinere Höhe als vor dem Streichen. Balancierung muss daher höher im Baum fortgesetzt werden. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 16 Fall 3: Bal(v) = 0 u v v Rotation ⇒ A B C u C A B In diesem Fall muß die Balancierung nicht höher im Baum fortgesetzt werden. Satz: Balancierte Bäume, wie AVL-Bäume, erlauben Suchen, Einfügen und Streichen in O(log n) Zeit, wobei n die Knotenanzahl ist. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 17 Anwendung von balancierten Suchbäumen: Schnitt von achsenparallelen Liniensegmenten Gegeben: Menge von insgesamt n vertikalen und horizontalen Liniensegmenten in der Ebene. Gesucht: Alle Paare von sich schneidenden Elementen Trivialer Algorithmus: O(n²) Anwendung z.B. bei VLSI-Schaltkreisen: VLSI-Designer will keine unerwarteten „Drahtüberschneidungen“... Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 18 Vereinfachende Annahme nachfolgend: Alle Anfangs- und Endpunkte horizontaler Segmente und alle vertikalen Segmente haben paarweise verschiedene x-Koordinaten. Idee: Vertikale „Sweepline“ geht Ebene von links nach rechts durch; jedes aktuell von Sweepline abgedeckte vertikale Segment kann höchstens Schnittpunkte mit gerade „aktiven“ horizontalen Segmenten haben. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 19 Algorithmus: x − Koordinaten der Anfangs- und Endpunkte Q← horizontal er Segmente ∪ {x − Koordinaten von vertikalen Segmenten} ; Sortiere Q bzgl. x-Werten; L ← o/ ; / * Menge jeweils aktiver horizontaler Segmente in aufsteigender y - Reihenfolge * / Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 20 while Q ≠ o/ do p ← kleinstes Element in Q ; if p linker Endpunkt eines horizontalen Segments s then L ← L ∪ {s} else if p rechter Endpunkt eines horizontalen Segments s then L ← L \ {s} else /* p ist x-Wert eines vertikalen Segments s = [ (p, yunten), (p, yoben)] */ Bestimme alle horizontalen Segmente t ∈ L mit yunten ≤ y (t ) ≤ yoben und gib (s,t) aus. fi; fi; Q ← Q \ { p} od; Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 21 • Beispiel: Sweepline-Algorithmus s4 s1 s3 s2 s5 (s1, s2) (s3, s2) (s3, s4) (s5, s4) s6 Q L x1 x2 x3 x4 x5 x6 x7 x8 x9 s2 s4 s6 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 22 Zur Laufzeit des Algorithmus: Einmaliges Sortieren von Q: O(n log n) Wichtig: Wie hält man L geordnet? Beachte: Die Information in Q ist quasi statisch, die in L dynamisch. Wir benötigen folgende Operationen auf L: -Einfügen & Entfernen -Bestimmen aller Elemente, die in geg. Bereich[ yu , yo ] fallen: „Bereichsanfrage“, Range Query → Implementation von L mit balanciertem Suchbaum mit blattorientierter Speicherung, wobei benachbarte Blätter verkettet sind. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 23 Damit: O(log n) für Einfügen und Entfernen und O(log n + r) für Bereichsanfrage in Bereich [yu, yo] , wobei [yu, yo]. Zusammen: Laufzeit O (n log n + k), wobei k die Gesamtzahl sich schneidender Segmente ist. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 24 5.2 Gewichtsbalancierte Bäume: BB[α]-Bäume Idee: Sei T ein binärer Suchbaum mit n Knoten und Teilbäumen Tl und Tr und sei l bzw. r die Anzahl der Knoten in Tl bzw. Tr. T ist ausbalanciert, falls l ≈ r , d.h. l ≈ 1 n 2 Wir beschränken den Quotienten l + 1 n + 1 Def.: Sei α ∈ R, 0 ≤ α ≤ 12 . Sei T ein binärer Baum mit n Knoten und l Knoten im linken Teilbaum. Dann heißt ρ (T ) = l + 1 n + 1 die Wurzelbalance von T. T heißt von beschränkter Balance α oder ein BB[α]-Baum, falls für jeden Unterbaum T‘ von T gilt: α ≤ ρ (T ' ) ≤ 1 − α . Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 25 • Beispiel eines BB[α]-Baums: Sei Tx Unterbaum mit Wurzel x x ρ (Tx ) = l + 1 n + 1 T: 5 1 1/2 = (0+1)/(1+1) 2 7 2 2/5 = (1+1)/(4+1) 3 1/2 1 4 6 8 4 2/3 3 5 5/9 6 1/2 7 2/4 = 1/2 T ist BB[α]-Baum für α ≤ 13 . 8 1/2 T ist kein BB[α]-Baum für α > 13 . Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 26 Satz: Sei T ein BB[α]-Baum mit n Knoten. Dann gilt log(n + 1) − 1 Höhe(T ) ≤ log( 1−1α ) Beweis: Induktion über n: log(1 + 1) − 1 =0 n = 1: Höhe(T ) = 0 ≤ 1 log( 1−α ) n Æn+1: Sei T ein BB[α]-Baum mit Wurzel und Teilbäumen Tl und Tr. Höhe(T ) = max{Höhe(Tl ), Höhe(Tr )}+ 1 O.B.d.A. sei Höhe(Tl ) ≥ Höhe(Tr ) ⇒ Höhe(T ) = Höhe(Tl ) + 1 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 27 Höhe(T ) ≤ ≤ log(l + 1) − 1 + 1 nach Induktionsvor. 1 log( 1−α ) l +1 log((n + 1)(1 − α )) − 1 + ≤ 1−α 1 wegen 1 n +1 log( 1−α ) log(n + 1) + log(1 − α ) − 1 + log( 1−1α ) = log( 1−1α ) = log(n + 1) − 1 log( 1−1α ) Folgerungen: a) BB[α]-Bäume haben logarithmische Höhe b) Für α = 1 − 12 2 ≈ 0.293 ergibt sich Höhe(T ) ≤ 2 log(n + 1) c) BB[α]-Bäume haben auch logarithmische mittlere Weglänge (hier nicht gezeigt, siehe Mehlhorn) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 28 Rebalancierung von BB[α]-Bäumen Problem: Durch Einfügen und Löschen in BB[α]-Bäumen kann deren Balance zerstört werden. Lösung: Die Balance kann nach solch einer Operation nur auf dem Suchpfad (Weg von der Wurzel zur Stelle der Änderung) zerstört werden. Längs dieses Suchpfades muß rebalanciert werden. Der Pfad hat logarithmische Länge. Unter der Voraussetzung 112 ≤ α ≤ 1 − 12 2 ≈ 0.293 kann man zeigen, dass die lokalen Operationen Rotation und Doppelrotation auf dem Suchpfad zur Rebalancierung ausreichen. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 29 Beispiel zur Rebalancierung: Sei α = 0.29, Einfügen(7) T: i 2 1 T: 5 1 4 6 ρi 2/6 2/4 1/2 1/2 1/2 5 4 2 6 i 2 5 1 4 6 7 ρi 2/7 2/5 1/2 1/2 1/3 1/2 vor R. 2 1 2/4 4/7 5 4 ... ... 6 2 Vorlesung Algorithmen (RN/MK/AZ) ... nach R. 5 Rot.L(2) 7 ... 1 6 4 7 WSI für Informatik, Universität Tübingen 30 Lemma 1: Wirkung von Rotation und Doppelrotation a) Bei Rotation nach links um x T: x ρ T‘: y ρ‘y x Rot.L(x) y ρy T1 ρ‘x x T3 T2 T1 T3 T2 gilt für die Wurzelbalance ρ ′x = ρx ρ x + (1 − ρ x ) ⋅ ρ y ρ ′y = ρ x + (1 − ρ x ) ⋅ ρ y Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 31 b) Bei Doppelrotation nach links T: x ρ T‘: x DRot.L(x) y ρy T1 ρ‘x x z T4 z ρ‘z y ρ‘y T1 T2 T3 T4 T2 T3 gilt für die Wurzelbalance ρx ρ ′x = ρ x + (1 − ρ x ) ⋅ ρ y ⋅ ρ z ρ y (1 − ρ z ) ρ ′y = 1− ρ y ρz ρ ′z = ρ x + (1 − ρ x ) ⋅ ρ y ⋅ ρ z Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 32 Beweis des Lemmas 1: Sei ai-1 die Anzahl der Knoten im Teilbaum Ti: a1 a1 a) Es gilt ρ = ρ ′x = x a1 + a2 + a3 a1 + a2 a2 ρy = a2 + a3 ρ ′y = a1 + a2 a1 + a2 + a3 Damit gilt a1 a1 + a2 + a3 ρx a1 = = = ρ ′x a a + a a a1 + a2 ρ x + (1 − ρ x ) ⋅ ρ y 2 3 1 2 + ⋅ a1 + a2 + a3 a1 + a2 + a3 a2 + a3 ρ x + (1 − ρ x ) ⋅ ρ y = a1 a2 + a3 a2 a1 + a2 = ρ ′y + ⋅ = a1 + a2 + a3 a1 + a2 + a3 a2 + a3 a1 + a2 + a3 b) analog Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 33 Lemma 2: Sei T ein binärer Suchbaum, der bei x nur ein wenig außer Balance geraten ist, d.h. i) Jeder echte Unterbaum von T: x ρ x T ist BB[α]-Baum y ρy T1 ii) α (1 − α ) ≤ ρ x < α Dann gilt: a) b) T2 T3 1 − 2α Ist ρ y > und entsteht T‘ aus T durch eine 1−α Doppelrot. nach links um x, so ist T‘ ein BB[α]-Baum. 1 − 2α ρ ≤ Ist und entsteht T‘ aus T durch eine y 1−α Rotation nach links um x, so ist T‘ ein BB[α]-Baum. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 34 Beweisidee des Lemmas: a) Es muss gezeigt werden, dass eine Doppelrotation möglich ist (T2 nicht leer) und dass T‘ ein BB[α]-Baum ist, d.h. α ≤ ρ ′x , ρ ′y , ρ ′z ≤ 1 − α . b) analog Bemerkung: Sei T ein BB[α]-Baum, in dem ein einzelnes Element eingefügt oder gelöscht wird, wodurch T‘ entstehe. Man kann zeigen, dass i) die Balancen außerhalb des Suchpfades unverändert sind, also im zulässigen Bereich [α, 1-α] liegen. ii) die Balancen auf dem Suchpfad unverändert oder nur wenig außerhalb von [α, 1-α] liegen und T‘ gemäß Lemma 2 durch Rotation und Doppelrot. balanciert werden kann. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 35 Algorithmus zur Rebalancierung von BB[α]-Bäumen nach dem Einfügen/Löschen eines einzelnen Knotens. Sei v0, v1, ... vk der Weg von der Wurzel bis zu der Stelle, an der die Struktur des Baumes geändert wurde, Sei Ti der Teilbaum mit Wurzel vi: for i := k downto 0 do /* d.h. vom Blatt zur Wurzel! */ begin if ρ (Ti ) ≤ α then /* T‘ sei rechter Teilb. von Ti */ 1 − 2α if ρ (T ′) ≤ then Rotation.Links(vi) 1−α else DoppelRot.Links(vi); if ρ (Ti ) > 1 − α then /* T‘ sei linker Teilb. von Ti */ α ′ ρ (T ) > if then Rotation.Rechts(vi) 1−α else DoppelRot.Rechts(vi); end; Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 36 Bemerkungen zur Realisierung a) In jedem Knoten des Baumes wird neben Inhalt, RSohn, LSohn auch die Anzahl der Nachfolger gespeichert. Dann lässt sich die Wurzelbalance in jedem Knoten berechnen. b) Die Knoten des Suchpfades werden beim Abstieg auf einem Stack (Keller) abgelegt. Dann kann man den Suchpfad leicht hochsteigen. c) Zeitbedarf einer Rebalancierung: O(log n), denn es ist ein Ab- und ein Aufstieg des Suchpfades nötig, der Pfad hat Länge O(log n). Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 37 Satz (Zeitbedarf bei BB[α]-Bäumen). Sei 112 ≤ α ≤ 1 − 12 2 Speichert man eine Menge S als BB[α]-Suchbaum, so können die Operationen – Suchen, – Einfügen, – Löschen eines Elements in Zeit O(log||S||) ausgeführt werden. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 38 5.3 B-Bäume Für große Datenmengen, die nicht mehr in den Hauptspeicher passen, sind AVL-Bäume oder BB[α]-Bäume ungeeignet. Hier kommen B-Bäume zum Zug, die für Zugriff auf externe Speicher entworfen wurden. Definition: Ein B-Baum der Ordnung k ≥ 2 ist ein Baum, - dessen Blätter alle gleiche Tiefe haben, - die Wurzel mindestens 2 Kinder und jeder andere - innere Knoten mind. k Kinder hat und - jeder innere Knoten höchstens 2k-1 Kinder besitzt. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 39 Lemma: Sei T ein B-Baum der Ordnung k mit Höhe h und h n Blättern. Dann gilt: 2 ⋅ k h −1 ≤ n ≤ (2k − 1) Beweis: Minimale Anzahl von Blättern, falls jeder innere Knoten die Minimalzahl von Kindern hat: 2 ⋅ k14 ⋅ k2 ⋅ ...4 ⋅3k = 2 ⋅ k h −1 = nmin ≤ n h −1 Analog folgt, dass die maximale Anzahl der Blätter höchstens (2k − 1)h =: nmax ist. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 40 Logarithmieren ergibt: n log ( 2 k −1) n ≤ h ≤ 1 + log k 2 ⇒ Wähle bei großen Datenmengen k so, dass auf eine Seite ein Knoten des B - Baums passt. Operationen: Zugriff, Einfügen, Streichen Annahme: Wir speichern knotenorientiert; nichts in den Blättern. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 41 Betrachte Knoten u mit l Kindern: u s1 s2 ... si-1 ... si ... sl-1 Ti . . . u hat Schlüssel s1 , s2 ,..., sl −1. (geordnet!) Sei Ti der i-te Unterbaum von u Für alle v ∈ Ti und alle Schlüssel „ s ∈ v„“ gilt : s ≤ si , falls i = 1 si −1 ≤ s ≤ si , falls 1 < i < l si −1 ≤ s, falls i = l Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 42 Zugriff auf (a,S): Starte in Wurzel w und suche den kleinsten Schlüssel si in w mit a ≤ si . Falls si existiert: if a = si then gefunden else w ← i - tes Kind von w ; suche rekursiv weiter fi Falls si nicht existiert : w ← rechtestes Kind ; suche rekursiv weiter Laufzeit: O((log k n ) ⋅ k ) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 43 Einfügen (a,S): (Erfolglose) Suche ende in Blatt b mit Elternknoten v, welcher l Kinder hat. Sei si der kleinste Schlüssel in v mit a<si (falls existent). Füge neuen Schlüssel a in v ein und neues Blatt b′ für a, sodass a links von si , falls i=1 a zwischen si-1 und si , falls 1<i<l a rechts von sl-1 , falls si nicht existent Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 44 Also: v s1 s2 ... sl-1 14444 4244444 3 l Blätter s1 s2 ... si-1 a si ... sl-1 144444 42444444 3 l + 1 Blätter Falls l < 2k − 1 ⇒ OK. Falls l = 2k − 1 : Spalte v in zwei Knoten v′ und v′′ mit jeweils k Kindern Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 45 Bild: w v sk w s1 s2 ... s2k-1 v ′ s1 . . . sk-1 v′′ sk+1 . . . s2k-1 14444244443 2k Kinder w bekommt ein Kind mehr und auch einen Schlüssel sk mehr. Setze Aufspalten falls nötig zur Wurzel des B-Baums hin fort. Beachte: Tiefe des Gesamtbaums bleibt erhalten, außer wenn die Wurzel aufgespalten werden muss. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 46 Streichen eines Schlüssels aus einem B-Baum: Streiche (a,S) Annahme: a = sj kommt in Knoten u vor. Mittels Zugriff (a,S) suche zunächst Knoten u, in dem a als Schlüssel sj vorkommt. Wir nehmen an, die Suche ende erfolgreich. allg. Situation: .......... sj-1 Tj sj ............. u Tj+1 Fallunterscheidung: 1.) Falls Tj ein Blatt ist, so lösche sj und Tj. 2.) Tj ist kein Blatt: Sei s der rechteste Schlüssel in Tj. Ersetze sj durch s und lösche s samt „rechtestem“ Blatt in Tj. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 47 Situation: .... sj-1 sj sj+1 .... v s .... sj-1 s sj+1 .... v (ohne s) Sei v der Knoten, in dem s (rechts außen) vorkomme. Zahl der Kinder in v ist damit um 1 verringert: Sei r die ursprüngliche Zahl der Kinder in v mit k ≤ r ≤ 2k − 1. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 48 a) Falls r > k (bzw. r > 2, falls v Wurzel), so fertig, da B-BaumEigenschaft gewahrt bleibt. b) Falls r = 2 und v Wurzel ist, so hat v nach Entfernung von s nur noch ein Kind. Dann „streiche“ die Wurzel. Alle Blätter bleiben auf gleicher Tiefe, die Baumhöhe verringert sich um 1. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 49 c) Sei r = k und v keine Wurzel. Sei w Elternknoten von v und v´ ein „direkter“ Geschwisterknoten links von v. Weiter sei s´ der Schlüssel in w zwischen den Verweisen auf v und v´. Also: .... s´´ s´ .... s1´ .... sl´ v´ k ≤ l + 1 ≤ 2k − 1 Verschmelze v und v´: .... s´´ .... w s1 s2 .... sk-2 v nur k-1 Kinder, zu wenig w s1´ .... sl´ s´ s1 .... sk-2 vneu vneu hat jetzt mind. 2k-1 und höchstens 3k-2 Kinder. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 50 α) Falls vneu mehr als 2k-1 Kinder hat, so spalte vneu wieder in zwei Knoten auf (wie beim Einfügen), um die B-Baum-Eigenschaft zu erfüllen: Jedes der Kinder hat dann mind. k und 3k höchstens - 1 Kinder. 2 β ) Falls vneu genau 2k-1 Kinder hat, so muss nicht gespalten werden. Jedoch hat w nun ein Kind verloren und so muss rekursiv mit w fortgefahren werden. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 51 Zusammenfassend ergibt sich: Satz: Zugriff / Einfügen / Streichen kann in B-Bäumen der Ordnung k, welche n Schlüssel verwalten, in Zeit O(k ·logk n) durchgeführt werden. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 52 Nachtrag zu B-Bäumen • in vielen Lehrbüchern wird eine leicht veränderte Definition von B-Bäumen verwendet (anderes fan-out): Modifizierte Definition von B-Bäumen: Ein B-Baum der Ordnung k ist ein Baum, - dessen Blätter alle gleiche Tiefe haben, - die Wurzel mindestens 2 Kinder und jeder andere - innere Knoten mind. k+1 Kinder hat und - jeder innere Knoten höchstens 2k+1 Kinder besitzt. Lemma: Sei T ein B-Baum der Ordnung k mit Höhe h und N gespeicherten Elementen. Dann gilt: h +1 h 2 ⋅ (k + 1) ≤ N + 1 ≤ (2k + 1) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 53 • Hierbei werden bei B-Bäumen die Datensätze sowohl in den inneren Knoten als auch in den Blättern gespeichert. • Unter Verwendung dieser Definition ergibt Logarithmieren log ( 2 k +1) ( N + 1) − 1 ≤ h ≤ log k +1 Vorlesung Algorithmen (RN/MK/AZ) N +1 2 WSI für Informatik, Universität Tübingen 54 Beispiel für Problem beim Einfügen in B-Bäumen 5 11 16 21 1 2 3 4 6 7 8 10 k=2 h=1 12 13 14 15 17 18 19 20 22 23 24 25 Einfügen (9) 6 7 8 9 10 5 8 11 16 21 11 5 8 1 2 3 4 6 7 Baum wird um eine Stufe höher 16 21 9 10 Vorlesung Algorithmen (RN/MK/AZ) h=2 12 13 14 15 17 18 19 20 22 23 24 25 WSI für Informatik, Universität Tübingen 55 5.4 B*-Bäume B*-Bäume sind eine Datenstruktur, die ebenfalls für Zugriff auf externe Speicher entworfen wurde. Sie ist allerdings blattorientiert, d.h. alle Informationen (Records in DBSystemen) werden in den Blättern gespeichert, die inneren Knoten dienen nur zur Suche. Definition: Ein B*-Baum der Ordnung k ∗ ≥ 2 ist ein Baum, – – – – – – bei dem alle Einträge in den Blattknoten gespeichert sind, jedes Blatt hat mindestens k und höchstens 2k Einträge jeder Pfad vom Wurzelknoten zu einem Blatt hat die Länge h*, jeder innere Knoten hat mindestens k* + 1 Söhne, die Wurzel ist entweder ein Blatt oder hat mindestens 2 Söhne, jeder Knoten hat höchstens 2k* + 1 Söhne. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 56 • Beispiel für einen B*-Baum k* = 2 k=2 h=2 25 73 8 13 20 33 45 61 67 78 86 Blätter prev 69 data69 70 data70 71 data71 72 data72 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen next 57 Prinzipien bei B*-Bäumen: • möglichst hohes fan-out ( 2k ∗ ≈ 1000 ), um die Zahl der Knotenzugriffe zu minimieren. Ein Knoten ist meist mit einer Hauptspeicherseite (page) identisch. • Blätter werden zusätzlich durch Zeiger nach links und rechts verbunden, um auch eine schnelle sequentielle Bearbeitung (Lesen) der Daten zu ermöglichen, ohne immer über die Baumstruktur gehen zu müssen • Für die Zahl der Datenelemente eines B*-Baumes gilt: ∗ 2 ⋅ (k + 1) h −1 ( ∗ ) h ⋅ k ≤ N ≤ 2k + 1 ⋅ 2k h N h −1 ∗ ∗ (k + 1) ≤ ≤ 2k + 1 2k ( Vorlesung Algorithmen (RN/MK/AZ) ) WSI für Informatik, Universität Tübingen 58 B*-Baum mit minimaler #Elementen, max. Höhe 2 k* = 2, k = 2, h=2 B*-Baum mit maximaler #Elementen, min. Höhe 2k*+1 2k*+1 k*+1 k k k k k k 2k 2k 2k 2k 2k 2k 2k 2k 2k 2k N ≤ (2k ∗ + 1) h ⋅ 2k 2 ⋅ (k ∗ + 1) h −1 ⋅ k ≤ N Hieraus erhält man wieder durch Logarithmieren: N N log ( 2 k *+1) ≤ h ≤ 1 + log k *+1 2k 2k Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 59 Weiteres über B*-Bäume • Rebalancierung geschieht analog zu B-Bäumen • B*-Bäume spielen eine sehr große Rolle als Indexstrukturen für Datenbanksysteme. • Alle relationalen DB-Systeme verwenden sie als Index für Primärschlüssel, in versch. Varianten • Wurzelseite des B*-Baums wird i.A. im Hauptspeicher als „nicht ersetzbar“ markiert • In DB-Implementierungen wird oft ein Seiten-Unterlauf toleriert, weil er meist durch spätere Einfügungen wieder kompensiert wird. Vermeidet locking auf Indexseiten. • Ggf. spätere Garbage-Collection Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 60 5.5. Mengenoperationen mit Suchbäumen Mengen werden häufig entweder als Bitvektoren (wenn das Universum U der mögl. Mengenelemente klein ist) oder als Suchbäume gespeichert (wenn U groß ist). Wir betrachten im Folgenden die Speicherung von Mengen als Suchbäume 1. Ist S als Suchbaum T gespeichert, so lässt sich die Operation Seq(T) (S der Größe nach sortiert ausgeben) in Zeit O(||S||) ausführen. Beweis: T in inorder-Reihenfolge durchlaufen. 2. Ist S als Folge x1 < x2 < ... < xn gegeben, so lässt sich in Zeit O(||S||) ein Suchbaum erstellen, der gleichzeitig AVL und BB[1/3]-Baum ist. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 61 Gewünschte Mengenoperationen: if S1 ⊆ S 2 then true else false • IstTeilmenge (S1, S2) S3 ← S1 ∪ S 2 , S3 Suchbaum • Vereinigung (S1, S2, S3) S3 ← S1 ∩ S 2 , • Durchschnitt (S1, S2, S3) S3 ← S1 − S 2 , • Differenz (S1, S2 , S3) S 2 ← S1, • Kopie (S1, S2) • Anhängen (S1, S2 , S3) if max(S1 ) < min( S 2 ) then • Spalten (S1, a, S2 , S3) S 2 ← {x ∈ S1 x ≤ a}, Vorlesung Algorithmen (RN/MK/AZ) S3 ← S1 ∪ S 2 , S3 ← {x ∈ S1 x > a} WSI für Informatik, Universität Tübingen 62 Lemma: Bei Speicherung von Mengen als Suchbäume können die Operationen IstTeilmenge, Vereinigung, Durchschnitt und Differenz in Zeit O(||S1||+||S2||), die Operation Kopie in Zeit O(||S1||) ausgeführt werden. Beweis: a) Kopie ist klar b) Seien T1 und T2 Suchbäume für S1 und S2. i) Bilde Seq(T1) und Seq(T2), ii) Führe die Operationen auf den geordneten Folgen aus i) aus (dies kann gleichzeitig mit i) geschehen iii) bilde aus der Folge aus ii) einen Suchbaum Zeitbedarf insgesamt: O(||S1||+||S2||). Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 63 Im Folgenden nehmen wir an, dass die Mengen als AVLBäume gespeichert sind. Hilfsalgorithmus Anhängen*(T1, a, T2, T3) Gegeben: AVL-Bäume T1, T2 für S1, S2, sowie Element a. Es gelte max(S1) < a < min(S2) Gesucht: AVL-Baum T3 für S3 = S1 ∪ {a}∪ S 2 Beispiel: T1 T2 10 v a 25 20 u 15 7 22 30 5 8 12 18 35 4 6 9 16 3 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 64 1. Versuch: Sei o.B.d.A. Höhe(T1 ) ≥ Höhe(T2 ) a) Steige in T1 ganz rechts hinab bis zum Knoten u mit Höhe(Tu) = Höhe(T2). b) i) u ist Wurzel von T1: a Mache a zum Vater von T1 und T2 T1 T2 Höhe (T1) = Höhe (T2) ii): u hat Vater v: w1 T1 Mache a zum Vater von T2 a v und zum Vater von u, mache v zum Vater von a u Fehlversuch! Warum funktioniert das nicht immer? Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen hu h2 w2 T2 65 Gründe für den Fehlversuch: 1. Knoten u existiert nicht immer, denn die Höhe der Bäume kann beim Absteigen um mehr als je 1 vermindert werden (im Beisp. Folie 64: Höhe(10) = 4, Höhe(15) = 2) 2. Der neue Baum ist i. allg. kein AVL-Baum und lässt sich auch nicht durch einfaches Rebalancieren dazu machen. Analyse: Sei T AVL-Baum und sei v Vater von u. v Seien hu, hv die Höhen von u bzw. v. u a) Es gilt hv > hu ≥ hv − 2 , da T AVL-Baum b) Wenn u einziger Sohn von v ist, folgt hu = 0 c) hu = hv − 2 gdw. der Teilbaum von v, in dem u liegt, ist kleiner als der andere Teilbaum von v. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 66 Folgerung: Beim Abstieg ganz rechts im Baum sinkt die Höhe der Unterbäume um 1 oder 2 bis zur Höhe 1 oder 0. 2. Versuch. Sei o.B.d.A. Höhe(T1 ) ≥ Höhe(T2 ) Algorithmus Anhängen*(T1, T2, a, T3) 1. Steige in T1 ganz rechts ab bis zum ersten Knoten u mit hu ≤ Höhe(T2 ) + 1 T1 =: T3 w 1 2. Mache a zum Vater von u und T2. a Falls u in T1 einen Vater v hatte, v mache a zum rechten Sohn von v T2 w 2 h u 2 3. Rebalanciere ab v aufwärts. hu Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 67 Korrektheit des Algorithmus: a) der neue Baum T ist Suchbaum für S3 = S1 ∪ {a}∪ S 2 b) T ist AVL-Baum, denn 1. u existiert nach Folgerung, d.h. T existiert 2. Sei h2 = Höhe(T2), h:= hu also h2 ≤ hu = h ≤ h2 + 1 , daher a in Balance v a h* hu=h u h+1 h2 w2 T2 3 Fälle: h* = h-1, h* = h, h* = h+1. Vorlesung Algorithmen (RN/MK/AZ) zu zeigen jeweils: lokale Rebalancierungen auf dem Suchpfad liefern AVL-Baum WSI für Informatik, Universität Tübingen 68 Fall 2.1: h* = h-1, daraus folgt h = h2+1, denn dann wurde der rechte Teilbaum von T1 in Einerschritten abwärts bis hu = h = h2+1 traversiert. u h+1 v h+2 DRot.L(v) a h a h+1 h v h*=h-1 hu=h u h2=h-1 w2 h´ h´´ Fall 2.2: h* = h v h+2 a h*=h h+1 hu=h u h2=h-1 w2 Vorlesung Algorithmen (RN/MK/AZ) h*=h-1 h´ h´´ h-1 w2 in Balance, nicht höher als vorher, Rebalancierung fertig in Balance, höher geworden, Aufstieg und Rebalancierung fortsetzen WSI für Informatik, Universität Tübingen 69 Fall 2.3: h* = h+1 v h+2 h*=h+1 a h+1 hu=h u in Balance, nicht höher als vorher, Rebalancierung fertig h2=h w2 Zeitbedarf: O(Höhe(T1) – Höhe(T2)), denn man muss ganz rechts in T1 einen Weg der Länge Höhe(T1) – Höhe(T2)+c ab- und evtl. wieder aufsteigen. Bem. Der Fall Höhe(T1 ) < Höhe(T2 ) geht analog Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 70 Algorithmus Anhängen (S1, S2 , S3) • Sei Ti AVL-Suchbaum für Si mit i = 1, 2; • sei max(S1 ) < min( S 2 ) 1. Lösche größtes a aus S1 in T1 (a ist rechtester Knoten), es entstehe T1´, a, T2 2. Anhängen* (T1´, a, T2 , T3). 3. Dann ist T3 AVL-Suchbaum für S3 = S1 ∪ S 2 Zeitbedarf: 1. O(Höhe(T1)) 2. O( Höhe( S1 ) − Höhe( S 2 )) ≤ O(max( Höhe(T1 ), Höhe(T2 ))) = O (max(log S1 , log S 2 )) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 71 Algorithmus Spalten (S1, a, S2 , S3) Sei T1 AVL-Suchbaum für S1; Verwalte linke und rechte Liste von Knoten u. Teilbäumen 1. Steige in den Suchpfad durch Suche(a) hinab. Sei v aktueller Knoten: v a) Suchpfad führt zu rechtem Sohn von v: Nimm T, v in linke Liste auf. b) Suchpfad führt zu linkem Sohn von v: Nimm v, T in rechte Liste auf. c) Suchpfad endet bei v = a: Nimm T´, v in linke Liste auf, Nimm T´´ in rechte Liste auf. d) Suchpfad endet bei v = b mit b ≠ a Falls a < b, nimm v, T in rechte Liste auf, falls a > b, nimm T, v in linke Liste auf. Vorlesung Algorithmen (RN/MK/AZ) T v T a T´ T´´ b b WSI für Informatik, Universität Tübingen T T 72 • Es entstehen Listen, jeweils aufsteigend sortiert sind. Abarbeitung links: T1´, a1´, T2´, a2´, ... Tl´, al´. rechts: (am´´), Tm´´, ... a2´´, T2´´, a1´´, T1´´. Abarbeitung 2. Wende sukzessiv Anhängen* auf die linke und rechte Liste an, kleine Bäume zuerst: links: Einfügen (Tl´, al´) = Tl* * ′ ′ For i:= l downto 2 do Anhängen*( Ti −1 , ai −1 , Ti , Ti *−1 ) es entstehe T2 rechts: Einfügen (Tm´´, am´) = Tm* * For i:= m downto 2 do Anhängen*( Ti , ai′′−1 , Ti′−′1 , Ti *−1 ) es entstehe T3 Es gilt: T2 und T3 sind AVL-Suchbäume für S 2 = {x ∈ S1 x ≤ a}, S3 = {x ∈ S1 x > a} Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 73 Beispiel für Spalten (S1, a, S2 , S3) a=18 T1 12 8 6 links von 18: 20 25 15 22 13 18 33 30 16 19 T1´, a1´, T2´, a2´, T3´, a3´. 8 12 13 15 16 18 Abarbeitung 6 rechts von 18: T2´´, a1´´, T1´´. 19 Abarbeitung 20 25 22 33 30 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 74 Aufbau der Teilbäume durch Einfügen und Anhängen* links von 18: T1´, a1´, T2´, a2´, T3´, a3´. 8 12 13 15 16 18 6 16 Einfügen (T3´, a3´) = T3* T2* T2 = T1* 8 6 Abarbeitung 12 18 15 13 16 15 18 13 16 18 * ′ ′ T , a , T , T Anhängen*( 2 2 3 2 ) * * Anhängen*( T1′, a1′, T2 , T1 ) Vorlesung Algorithmen (RN/MK/AZ) * WSI für Informatik, Universität Tübingen 75 Aufbau der Teilbäume durch Einfügen und Anhängen* rechts von 18: T2´´, a1´´, T1´´. 19 Abarbeitung 20 25 22 20 T2* 19 19 25 20 33 19 22 30 33 30 T2 = T1* 25 Rot.Links(20) ist Teil v. 22 33 Anhängen*(T2* , a1′′, T1′,′ T1* ) 30 * * T Zwischenzustand Anhängen*( 2 , a1′′, T1′,′ T1 ) Einfügen (T2´´, a2´) = T2* Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 76 Zeitbedarf von Spalten (S1, a, S2 , S3): Sei hi′ = Höhe(Ti′), hi ∗ = Höhe(Ti ∗ ), Es gilt a) hi′+1 ≤ hi′, umständlich zu zeigen, b) h′ − h ∗ ≤ h′ − h′ + 2 hier ohne Beweis i −1 i i −1 i ∗ ∗ ( ) Also Aufbau von Ti −1 aus Ti′−1 , Ti kostet c ⋅ hi′−1 − hi ∗ + 1 ∗ T Zeit für den Aufbau von 1 aus T1′, ...Tl′ : 2 ( ) 2 c ⋅ ∑ hi′−1 − hi + 1 ≤ c ⋅ ∑ (hi′−1 − hi′ + 3) wegen b) i =l ∗ i =l ≤ c ⋅ Höhe(T ) Also Zeit für linke und rechte Liste: jeweils O(Höhe(T)) Daher Gesamtzeit des Algorithmus O(Höhe(T)) = O(log ||S||) Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 77 5.5. Optimale Suchbäume Vor.: Die verwaltete Menge S sei statisch, auf die Elemente x aus S werde mit unterschiedlicher Häufigkeit zugegriffen Idee: T ist ein guter Suchbaum für S, falls die häufig gesuchten Elemente geringe Tiefe haben Def. (Zugriffsverteilung): Sei S = {x1 ,..., xn } . Sei β i die Wahrscheinlichkeit für die Suche nach xi, i = 1, ... n, und sei α i die Wahrscheinlichkeit für die Suche nach einem x mit xi < x < xi+1. Dann heißt (α , β ) = (α 0 , β1 , α1 ,..., β n , α n ) die Zugriffsverteilung für die Suche in S. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 78 Beachte: n n • Es muß gelten 0 ≤ α j , β i ≤ 1 und ∑ β i + ∑ α j = 1 i =1 j =0 • Häufig hat man relative Häufigkeiten (Zähler) α j , β i ≥ 0 für die Suche nach den xi bzw. (xi, xi+1). Setzt man A = ∑n β i + ∑n α j i =1 α j = α j A, j =0 β =β /A so ist (α , β ) = (α 0 , β1 , α1 ,..., β n , α n ) eine Zugriffswahrscheinlichkeit. • Sei T ein mit Blättern (xi, xi+1) erweiterter Suchbaum für S, sei bi die Tiefe von Knoten xi in T, sei ai die Tiefe des Blattes (xi, xi+1) in T. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 79 • Dann benötigt Suche (x, S) – bi +1 – ai Vergleiche, falls x = xi, Vergleiche, falls xi < x < xi+1, • also ist die mittlere #Vergleiche für Suche (x, S) C = ∑i =1 β i (1 + bi ) + ∑ j =0 α j a j n n Def.: Sei T ein erweiterter Suchbaum mit Gewichten β i für die Knoten xi und α j für die Blätter (xj, xj+1) und seien bi = Tiefe (xi), aj = Tiefe (xj, xj+1). n n T P = ∑i =1 β i (1 + bi ) + ∑ j =0 α j a j Dann heißt die gewichtete Weglänge von T. Sie heißt n n normiert, falls 0 ≤ α j , β i ≤ 1 und ∑i =1 β i + ∑ j =0 α j = 1 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 80 • Beispiel: Suchbaum mit 4 Knoten S = {10, 20, 30, 40} und Zugriffshäufigkeiten i 0 1 2 3 4 1/6 0 0 1/8 5/12 αi -1/24 1/8 1/8 0 βi T 1/8 30 1/24 10 ...,10 Tiefe 0 40 0 1/8 20 30,40 40,... 1/6 10,20 20,30 1/8 5/12 0 P = ∑i =1 β i (1 + bi ) + ∑ j =0 α j a j n T n = 1 / 24 ⋅ 2 + 1 / 8 ⋅ 3 + 1 / 8 ⋅1 + 0 ⋅ 2 + 1 / 6 ⋅ 2 + 0 + 0 + 1 / 8 ⋅ 2 + 5 / 12 ⋅ 2 =2 T ist optimaler Suchbaum für S 0 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 81 Def.: Sei T ein erweiterter Suchbaum für S = {x1, ... xn} und sei (α , β ) = (α 0 , β1 , α1 ,..., β n , α n ) eine Zugriffsverteilung. T heißt optimaler Suchbaum für S und (α , β ), falls für jeden Suchbaum T´ für S gilt P T ≤ P T ′ . Problem: wie bestimmt man einen optimalen Suchbaum für eine gegebene Menge S und Zugriffsverteilung (α , β ) ? Lösung: Dynamisches Programmieren Zerlege das Problem in nicht disjunkte Teilprobleme, von denen die kleinsten Teilprobleme direkt gelöst und in eine Tabelle (Matrix) eingetragen werden. Größere Teilprobleme werden aus den Lösungen kleinerer Probleme mit Hilfe der Tabelle bestimmt. Unterschied Teile & Beherrsche: dort disjunkte Teilprobleme Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 82 Dynamisches Programmieren für opt. Suchbäume: • wir bestimmen opt. Suchbäume Tij für {xi, ... xj}. • Sei wij = α i −1 + β i + α i + ... + β j + α j das Gewicht von Tij, xrij = xm sei die Wurzel von Tij mit i ≤ rij ≤ j . Pij sei die gewichtete Weglänge von Tij Pij/wij sei die normierte gewichtete Weglänge von Tij Idee: Baum Tij besteht aus einem Wurzelknoten xm und Teilbäumen Ti,m-1 und Tm+1,j, die beide optimale Suchbäume für ihre Teilmengen {i, ..., m-1} und {m+1, ..., j} sind. Bestimme m so, dass Tij minimale xm gewichtete Weglänge hat. Ti,m-1 Tm+1,j Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 83 Lemma 1: Sei Tij ein opt. Suchbaum für {xi, ... xj} mit Wurzel xm und linkem bzw. rechtem Teilbaum Tl bzw. Tr und gewichteten Weglängen Pl bzw. Pr. Dann gilt: a) Pij = Pl + Pr + wij. b) Tl ist opt. Suchbaum für {xi, ... xm-1}, c) Tr ist opt. Suchbaum für {xm+1, ... xj}. Beweis: Seien akl, bkl akr, bkr ak, bk Dann gilt Tiefen der Blätter/Knoten in Tl, Tiefen der Blätter/Knoten in Tr, Tiefen der Blätter/Knoten in Tij. bzw. ak = 1+akl ak = 1+akr bk = 1+bkr bzw. bk = 1+bkl Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 84 Pij = β m ⋅1 + ∑k =i β k (1 + 1 + bk ) + ∑k =i −1α k (1 + ak ) m −1 m −1 l l + ∑m +1 β k (1 + 1 + bk ) + ∑k = m α k (1 + ak ) j r j r = wij + Pl + Pr b) + c) Wäre Tl oder Tr nicht optimal, so wäre auch Tij nicht optimal Folgerung: die Tij lassen sich mit einer Laufvariablen k = j – i für k = 0, 1, ..., n-1 so berechnen: k=0: xi xi-1,xi xi,xi+1 k>0: bestimme m = rij aus {i, ..., j} so, dass Pi,m-1 + Pm+1,j + wij minimal ist Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 85 wij = wi , j −1 + α j + β j Setze Pij = wij + Pi ,m −1 + Pm +1, j Beachte: rij = m zerlegt die Menge {xi, ... xj} in {xi, ... xm-1}, {xm}, {xm+1, ... xj}, also legen die rij alle Teilbäume Tij eindeutig fest. Beispiel: T k = 0: r = 1, r = 2, r = 3, r = 4, 11 22 33 44 P11=5/24, P22=1/8, P33=2/8, P44=13/24 30 Tiefe 0 k = 1: r12 = 1, r23 = 3, r34 = 4, 1/8 P12=11/24, P23=1/2, P34=22/24, 1/24 10 40 0 1/8 k = 2: r13 = 3, r24 = 4, ...,10 20 30,40 40,... P13 = 25/24, P24 = 31/24, k = 3: r14 = 3, 1/6 10,20 20,30 1/8 5/12 P14 = 48/24 = 2 0 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 0 86 Algorithmus: Optimaler Suchbaum mit Dyn. Prog. 1. begin 2. for i:= 0 to n do Pi+1,i := 0, wi+1,i := αi endfor 3. for k:= 0 to n – 1 do 4. for i:= 1 to n – k do 5. j:= i + k /* k = j – i */ wij = wi , j −1 + α j + β j 6. 7. Bestimme m so, dass Pi,m-1 + Pm+1,j minimal, i≤m≤ j 8. rij:= m 9. Pij = wij + Pi ,m −1 + Pm +1, j 10. endfor 11. endfor 12. end Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 87 • Korrektheit: siehe Lemma 1 + Folgerung. • Platzbedarf: 3 quadratische Felder Pij, wij, rij: Θ(n 2 ) • Zeitaufwand: Θ(n) – Zeile 2) kostet Zeit Θ(k + 1) – Zeile 7) kostet Zeit n −1 n−k – Zeilen 3) – 11) kosten T ( n) = ∑ ∑ Θ( k + 1) k =0 i =1 = ∑k =0 Θ((k + 1)(n − k )) n −1 = Θ( n 3 ) • Frage: Geht es auch schneller? • Untersuche innerste Schleife ri,m-1 (Zeile 7) xi Vorlesung Algorithmen (RN/MK/AZ) xm ri,j rm+1,j xm-1 xm+1 xj WSI für Informatik, Universität Tübingen 88 Lemma 2: Es gibt optimale Suchbäume Tij für {xi, ... xj} mit ri,j-1 Wurzel rij, so dass ri+1,j i ≤ ri , j −1 ≤ ri , j ≤ ri +1, j ≤ j i i+1 j-1 j Beweis: Siehe Knuth: Optimal Binary Search Trees, Acta Informatica 1 (1973), S. 14-25. Verbesserter Algorithmus: Ändere Zeile 7) zu 7. Bestimme m so, dass Pi,m-1 + Pm+1,j minimal, für ri , j −1 ≤ m ≤ ri +1, j Zeitbedarf: siehe nächste Folie Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 89 T (n) = ∑k =0 ∑i =1 (ri +1, j − ri , j −1 + 1) n −1 n−k = ∑k =0 ∑i =1 (ri +1,i + k − ri ,i + k −1 + 1) wegen j = i + k n −1 n−k = ∑k =0 (rn − k +1,n − r1,k + n − k ) Summanden kürzen sich weg n −1 ≤ ∑ k = 0 ( 2 n − k ) = Θ( n 2 ) n −1 Satz: Für S = {x1, ... xn} und Zugriffswahrscheinlichkeit (α , β ) läßt sich mit dynamischem Programmieren in Zeit T (n) = Θ(n 2 ) ein optimaler Suchbaum berechnen. Bemerkung: „nahezu optimale“ Suchbäume lassen sich in linearer Zeit berechnen. Siehe Mehlhorn, Effiziente Algorithmen, Teubner Verlag, 1977 Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 90 5.6 Kantenmarkierte Suchbäume (Tries) • Bisher wurde die Suche in Bäumen durch Vergleiche x < y mit x, y ∈ S, gesteuert. Für sehr lange Schlüssel über einem Alphabet Σ, d.h. S ⊆ Σ∗, sind Vergleiche der Art „1. Buchstabe von x < 1. Buchstabe von y“ sinnvoller. • Jetzt bekommen die Knoten eines Baumes mehrere Söhne, a-Söhne, mit a ∈ Σ . Definition: Sei Σ ein festes, endliches Alphabet. a) Ein Baum T = (V, E) heißt Σ-markiert, falls gilt: i) Jede Kante (u, v) von E ist mit einem a aus Σ markiert, v heißt dann a-Sohn von u. ii) Jeder Knoten hat höchstens einen a-Sohn. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 91 ∗ b) Sei T = (V, E) Σ-markiert, φ : V → Σ definiert durch φ (v) = e (leeresWort), falls v Wurzel ist, φ (v) = φ (u )a, falls v der a - Sohn von u ist. ∗ φ (v ) ∈ Σ Wir sagen: v definiert das Wort φ (v) ist das Wort, das entsteht, wenn man die Buchstaben auf dem Weg von der Wurzel zu v hintereinander schreibt. ∗ S ⊆ Σ c) Sei . T heißt Kanten-markierter Suchbaum für S (engl. Trie mit „ie“), falls gilt: i) Für jedes Blatt u in T ist φ (u ) Anfangswort eines x ∈ S. ii) Zu jedem x ∈ S gibt es genau ein Blatt u, so dass φ (u ) Anfangswort von x ist. Das Blatt u trägt als Information das x ∈ S , das mit φ (u ) beginnt (Blatt-orientierte Speicherung). Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 92 Beispiel für Trie mit Σ = {A,..., Z } : S = {Bauer, Baum, Feld, Hahn, Haus, Hof, Huhn, Hund, Katze} B K F H A E U E A O L M D R Baum Feld H N U A U FH S Hahn Haus Hof N T N Huhn D Hund Z E Katze Bauer Beachte: einen Trie gibt es nur für Mengen S, die präfix-frei sind, d.h. kein x aus S ist echtes Anfangswort eines y aus S. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 93 • Nimmt man im Beispiel noch BAU in S auf, so ist S nicht mehr präfix-frei. • Präfix-Freiheit lässt sich stets erreichen, indem ein neuer Buchstabe $ an jedes Wort aus S angehängt wird. Dann ist S präfix-frei, z.B. Bau$ kein Präfix mehr von Baum$. • Auf Σ sei eine Ordnung definiert (z.B. A < B < ... < Z). Dies liefert eine lexikographische Ordnung auf Σ*. Ordnet man die Söhne jedes Knotens v so, dass der a-Sohn links vom b-Sohn steht (für alle a, b aus Σ, a < b), so sind in den Blättern die Elemente von links nach rechts aufsteigend sortiert. Es ist dann leicht, S sortiert auszugeben. • Algorithmen für Suche, Einfügen, Löschen sind offensichtlich. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 94 Nachteile von Tries: • Tries sind oft sehr dünn besetzt, d.h. fast alle Knoten haben weniger als ||Σ|| Söhne. • Implementierung der Verweise auf die Söhne als – – Feld: viele Verweise haben den Wert nil/null. Liste: der Zugriff ist umständlich. • Es kann lange Wege ohne Verzweigungspunkte geben, z.B. bei BAUM, BAUER Ausweg: a) Setze Σ = {0, 1}, d.h. ||Σ|| = 2, und betrachte die Binärcodierung von Buchstaben und Wörtern. b) Ziehe die Wege ohne Verzweigungspunkte zu einem Knoten zusammen. Dies ergibt Patricia-Bäume Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 95 Patricia-Bäume (Practical Algorithm To Retrieve Information Coded In Alphanumerics) • Patricia-Bäume sind geeignet für sehr lange Schlüssel unterschiedlicher Länge. • Patricia-Bäume sind binäre Bäume, deren linker/rechter Sohn immer der 0/1-Sohn ist. Jeder innere Knoten hat ein Feld „Skip“, das angibt, wie lang der Weg ist, den dieser Knoten repräsentiert, d.h. wie viele Buchstaben überlesen werden müssen. In den Blättern stehen die Schlüssel oder Verweise darauf. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 96 Beispiel für Patricia-Bäume File-Inhalt: THIS IS THE HOUSE THAT JACK BUILT Position: 1 6 9 13 19 24 29 S = {BUILT, HOUSE, IS, JACK, THAT, THE, THIS} Binär-Codierung (hier einfach A = 00001, B = 00010, ...) BUILT HOUSE IS JACK THAT THE THIS USA 00010 11000 01010 01101 10111 01000 10000 11000 10110 00101 01010 10110 1 0 01011 00001 00011 01100 29 10111 01000 00001 10111 BUILT 10111 01000 00101 13 10111 01000 01010 10110 HOUSE 1 6 11 16 11000 10110 00001 Vorlesung Algorithmen (RN/MK/AZ) 0 0 0 11 1 1 1 19 9 THIS 1 2 1 24 THAT THE 6 IS 1 JACK WSI für Informatik, Universität Tübingen 97 • Patricia-Tree: In den Knoten steht das Skip-Feld, d.h. die Anzahl der Zeichen, die bis zur nächsten Entscheidung überlesen werden müssen Suchen (p, x) /* p ist Zeiger auf Wurzel, x Suchschlüssel */ while p zeigt auf inneren Knoten do überlies p^.Skip Zeichen if nächstes Zeichen = 0 then p := p^.LSohn = 1 then p := p^.RSohn else if .... else (d.h. x abgearbeitet): Stop (x nicht in S) endwhile /* p zeigt jetzt auf ein Blatt u mit Wert j */ Vergleiche im File ab Stelle j, ob hier wirklich x steht. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 98 • Im Beispiel: Suche (p, THAT) 1+ 0 = 1. Buchstabe = 1: rechts 1+11 = 12. Buchstabe = 0: links 12+ 1 = 13. Buchstabe = 0: links Blatt liefert Index 19 im File, dort steht THAT, also THAT in S. • Im Beispiel: Suche (p, USA) 1+ 0 = 1. Buchstabe = 1: rechts (alles wie bei THAT) 1+11 = 12. Buchstabe = 0: links 12+ 1 = 13. Buchstabe = 0: links Blatt liefert Index 19 im File, dort steht nicht USA, also USA nicht in S. Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 99 Anwendungen: 1. Frage: Gegeben Wort y aus {0, 1}*. Welche x aus S beginnen mit y? Lösung: Suche (Wurzel, y) liefere Knoten v. Nur die Blätter unter v können Adressen für solche x enthalten, die mit y beginnen. 2. Bestimme maximales gemeinsames Anfangswort zweier beliebiger Elemente aus S (nicht vorgegeben) Lösung: Sei Tiefe (v) die Summe der Skip-Werte auf dem Weg von der Wurzel nach v. Durchlaufe T und bestimme inneren Knoten v0 maximaler Tiefe Übung: Algorithmen für Einfügen und Löschen Vorlesung Algorithmen (RN/MK/AZ) WSI für Informatik, Universität Tübingen 100