5.6 Ausgeglichene MehrwegMehrweg-Suchbäume Wünschenswerte Eigenschaft von Suchbäumen mit n Knoten: Suchen, Einfügen, Löschen auch im schlechtesten Fall O(log n) Methoden: lokale Transformationen (AVL-Baum) Stochastische Algorithmen / Datenstrukturen ("Randomisierung"). Aber nur Wahrscheinlichkeitsaussagen zu Laufzeit / Speicherplatz! Vergrößern der Knoten: Mehrwegbäume mit geeigneten Eigenschaften. hs / fub – alp3-19-Bbaum-1 1 5.6.1 BB-Baum: Ausgeglichener MehrwegMehrweg-Suchbaum 30 20 25 10 15 18 22 23 24 35 27 29 Rudolf Bayer, Edward M. McCreight: Organization and Maintenance of Large Ordered Indices. Acta Informatica Vol 1,173-189 1972 40 50 31 34 37,39 45 47 60 - Innere Knoten haben minimale und maximale Anzahl Kinder k. Hier: 2 <= k <= 4 - Anzahl Werte(Schlüssel) eines Knotens mit k Kindern: k-1 - Suchbaumeigenschaft: vi, vi+1 Werte im Knoten k , dann ist enthält Unterbaum, auf den zwischen vi und vi+1 verwiesen wird, nur Werte v mit vi <= v < vj 1 Def. BB-Baum - Mehrweg-Baum mit variablem Grad k, t <= k <=2 t , t: Minimalgrad Wurzel: 1 <= k <= 2t. - Knoten mit vom Grad k enthalten k-1 Werte (Werte und/oder Schlüssel ). - Knoten (v1,v2,...,vk-1) ist Blatt oder besitzt k Unterbäume t1,...,tk mit : f. alle x ∈ ti, y ∈ ti+1: x <= vi < y, i = 1,..,k-1 (Suchbaum). - Alle Blätter haben gleiche Tiefe (ausgeglichen). t=2: (2,4)-Baum, manchmal (2,3,4)-Baum Typische Verwendung: Hintergrundspeicherverwaltung, großer Verzweigungsgrad "Fanout") => großes t (-> später). hs / fub – alp3-19-Bbaum-1 3 Diskussion B-Baum Ausgeglichenheit bei fester Anzahl Werte pro Knoten nur aufwendig zu garantieren. insert(5) 20 25 5 10 15 22 23 27 Alle Knoten betroffen bei Wiederherstellen der Invarianten (!) Lösung bei B-Bäumen: a) Zulassen, dass Anzahl Werte pro Knoten variabel b) Geschickte Änderungsalgorithmen. hs / fub – alp3-19-Bbaum-1 4 2 Diskussion B-Baum: Höhe Eigenschaft: Die Höhe h eines B-Baums mit Minimalgrad t und n Knoten ist durch h <= log t ((n +1)/2) beschränkt. Asymptotische Laufzeit wie binärer Suchbaum, aber... Großes t macht Baum flacher. Konstante wichtig für Externspeicherdatenstruktur. Z.B. ist ausgeglichener binärer Suchbaum durchschnittlich um Faktor 5.6 (= ln 50 / ln 2) höher als B-Baum mit Minimalgrad t = 50. hs / fub – alp3-19-Bbaum-1 5 Datenstruktur public class BTreeN { int T = 20, MAX_T = 2*T; // minimal degree protected Comparable keys[]; // (t-1) <= values <= 2*t-1 in this node protected BTreeN subtrees[]; // t < number of subtrees < 2*t protected BTreeN parent; // the parent node, null if root protected boolean leaf=true; // Leafnode? protected int count=0; // number of keys public BTreeN ( ){ keys = new Comparable [MAX_T]; subtrees = BTreeN [MAX_T]; // DISK_WRITE the serialized node if used as an //external index } hs / fub – alp3-19-Bbaum-1 6 3 5.6.2 (2,4)(2,4)-Bäume als Spezialfall von BB-Bäumen Operationen Suche in B-Baum (fast) wie in binärem Suchbaum 12 search (9) 5 10 15 t=2: 2,4-Baum 3 4 6 8 11 1314 17 not found Traversieren des durch den Suchschlüssel bestimmten Pfades zu dem Knoten, der Schlüssel enthält (oder nicht gefunden). hs / fub – alp3-19-Bbaum-1 7 Operationen Einfügen - immer in dem Knoten am Ende des Suchpfades einfügen 12 - das ist ein Blatt insert(9) 5 10 3 4 Fall 1: Kein Problem für Knoten mit weniger als 2*t (hier: 4) Werten 6 8 15 11 1314 17 689 hs / fub – alp3-19-Bbaum-1 8 4 Operationen Einfügen: der kritische Fall Fall 2: Teilen eines Knotens mit 2*t-1 Werten (Split-Knoten). => Elternknoten hat ein Kind mehr => ein Wert wandert in Elternknoten. 12 insert(7) 5 10 3 4 15 ? 68 9 12 11 13 14 17 5 8 10 8 6 15 9 3 4 67 9 11 1314 17 hs / fub – alp3-19-Bbaum-1 9 Invarianten nach Knotenspaltung Baum nach Einfügen ausgeglichen ("Wächst zur Wurzel hin"!). Grad-Invariante bleibt erhalten: Split-Knoten enthielt 2*t-1 Werte, => neue Knoten enthalten max. (2*t-2) / 2 +1 Werte. Suchbaum-Invariante erfüllt. Alternativen für Einfügealgorithmus: a) Bottom-up-Split: Suche Blatt, in das einzufügen ist, Wenn es 2*t-1 Schlüssel (= Werte) enthält, spalten! Rekursives Spalten bis zur Wurzel möglich. hs / fub – alp3-19-Bbaum-1 10 5 Spalten beim Einfügen: Einfügen: TopTop-Down b)Top-Down-Split: Beim Einfügen jeden Knoten auf dem Suchpfad spalten, der 2*t-1 Schlüssel enthält insert(7) 12 34 5 10 2 4 6 9 5 12 11 13 14 17 2 4 15 10 3 4 15 6 79 11 13 14 17 - Einfacher Algorithmus (Eine Wurzel-Blatt-Traversierung) - Gelegentlich vorzeitige Split-Operationen hs / fub – alp3-19-Bbaum-1 11 Einfügen in (2,4)(2,4)-Baum schematisch Spaltung (Split) a a y xyz analog: x a <= x <= y<=z z ggf. rekursiv "nach oben" fortsetzen a b aby xyz x z hs / fub – alp3-19-Bbaum-1 12 6 Zusammenfassung: Zusammenfassung: Einfügen in (2,4)(2,4)-Baum Schritt 1: Suche des Knotens K, in den einzufügen ist (Blattknoten!) Schritt 2: K enthält weniger als 2*t –1 Schlüssel ((2,4)-Baum: 3): einfügen! K enthält 2*t-1 Schlüssel x1,…x2t-1: K spalten in K1, K2 mit je t-1 Schüsseln, mittleren Schlüssel xt, x1 <= x2 <=… xt-1 <= xt<=…. <=x2t-1 in Elternknoten E von K übernehmen , K1 und K2 neue Kinder von E anstelle von K . Top-Down Variante: In Schritt 1 jeden traversierten Knoten mit 2*t-1 Knoten spalten. hs / fub – alp3-19-Bbaum-1 13 Operationen: Operationen: Löschen - lösche in Blatt mit mindestens t Schlüsseln. - lösche in innerem Knoten: analog binärem Suchbaum. delete(6) 34 5 10 2 4 6 delete(5) 12 9 3 5 10 15 11 13 14 12 17 2 4 6 9 15 11 13 14 17 Einfach: Beide Fälle verletzen nicht die Invariante für die Anzahl Schlüssel hs / fub – alp3-19-Bbaum-1 14 7 Unterlauf durch Löschen - Lösche in Blatt mit t-1 Schlüsseln. delete(4) 12 34 5 10 2 4 6 9 12 34 6 10 15 11 13 14 17 2 5 15 11 9 17 13 14 Schlüssel auf Vaterknoten entnehmen 4 Unterbäume, nur 2 verbliebene Schlüssel: => Transfer aus Kind-Knoten. hs / fub – alp3-19-Bbaum-1 15 Löschen: Löschen: Unterlauf vermeiden delete(12) 34 5 10 34 5 10 2 13 12 2 4 6 9 15 15 11 13 14 17 4 6 9 11 14 17 Führt zu Unterlauf! hs / fub – alp3-19-Bbaum-1 16 8 Unterlauf durch Löschen (3) delete(12) 11 12 34 5 34 5 10 2 4 6 9 15 15 2 14 11 4 17 14 6 9 10 17 Unterlauf nicht vermeidbar: Entfernen von Vorgänger oder Nachfolger des Lösch-Schlüssels führt zu Unterlauf. hs / fub – alp3-19-Bbaum-1 17 TopTop-DownDown-Löschen mit Unterlauf delete(14) 11 Innerer Knoten enthält nur t-1 Schlüssel 34 5 2 4 15 6 9 10 14 Nachbar (.3.5.) besitzt t Schlüssel => Transfer 17 5 5 10 15 43 43 11 15 2 2 4 6 9 10 14 4 6 9 11 14 17 17 hs / fub – alp3-19-Bbaum-1 18 9 TopTop-DownDown-Löschen mit Unterlauf und Höhenreduktion delete(14) 11 43 1 2 15 4 5 6 14 17 3 11 15 4 1 2 4 5 6 14 17 Transfer + Löschen hs / fub – alp3-19-Bbaum-1 19 Löschen in BB-Baum schematisch: schematisch: Löschen x in Blatt mit k > t Schlüsseln: Invarianten bleiben alle erfüllt. a xyz Löschen x in innerem Konten: Ersetze x durch Vorgänger (immer in einem Blatt b), wenn b mehr als t-1 Elemente hat, sonst durch den Nachfolger. s hier: Nachfolger ... ... r txy hs / fub – alp3-19-Bbaum-1 20 10 Löschen in BB-Baum schematisch: schematisch: Unterlauf, Transfer von Nachbar Löschen r in Blatt b mit t-1 Schlüsseln, Nachbar enthält k > t-1 Schlüssel s Transfer: txy r Nachbar(b) -> Elternknoten(b) -> b Keine Änderung der Anzahl Knoten. hs / fub – alp3-19-Bbaum-1 21 Löschen B-Baum schematisch Unterlauf, Verschmelzen Löschen von r in Blatt b führt zu Unterlauf, der nicht durch Transfer zu beheben ist. Top-Down-Löschen: .. q q s.. Vorgänger hat mindestens t Elemente (Sonderfall: r Vorgänger ist Wurzel): b mit Nachbarn verschmelzen. Teilungsschlüssel zwischen b und Nachbarn in verschmolzenen Knoten Höhe ändert sich nicht. t hs / fub – alp3-19-Bbaum-1 22 11 Löschen B-Baum schematisch Unterlauf, Verschmelzen, Höhenreduktion (Top-Down-Löschen) s Wurzel enthält t-1 Schlüssel Linker und rechter Nachfolger des Trennschlüssels s haben je t-1 Schlüssel Kein Transfer möglich Wurzel mit Nachfolgern verschmelzen r t … Löschen im Unterbaum hs / fub – alp3-19-Bbaum-1 23 Laufzeiteigenschaften Suche in einem B-Baum: O(log n) Einfügen: Einfügeknoten suchen: O(log n) Split, Transfer: O(1) -> O(log n) Löschen: Split, Transfer, Verschmelzung je O(1) -> O(log n) Warum sind B-Bäume wichtig? (2,4) Bäume sind (fast) Rot-Schwarz-Bäume. Wichtigste Indexstruktur für sehr große Datenmengen. hs / fub – alp3-19-Bbaum-1 24 12