Vorlesung Datenstrukturen B-Baum Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 422 Mehrwegsuchbäume Einordnung Wir hatten den Binärbaum als Spezialfall eines M-ären Baumes, dessen Knoten genau M Nachfolger haben, kennengelernt. Binäre Suchbäume deklarierten wir als Binärbäume, die einem Ordnungskriterium unterworfen sind, das die Anordnung der beiden Teilbäume eines Knotens in Abhängigkeit vom Wert einer Schlüsselkomponente gestaltete. Analog der Betrachtung eines Binärbaums als M-ärer Baum mit M=2 können wir auf umgekehrtem Wege binäre Suchbäume zu M-ären bzw. M-Wege-Suchbäumen verallgemeinern. M-Wege-Suchbaum (M-ärer Suchbaum) • ist ein Baum, dessen Knoten jeweils genau M Kinder und M–1 Schlüssel besitzen • Die M–1 Schlüssel eines Knotens sind aufsteigend sortiert • Die Schlüssel in den ersten i Kindknoten sind kleiner als der i-te Schlüssel • Die Schlüssel in den letzten M–i Kindknoten sind größer als der i-te Schlüssel Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 423 Mehrwegsuchbäume Anwendung Mehrwegsuchbäume dienen dem selben Zweck wie binäre Suchbäume: Bereitstellung einer schnellen Zugriffsmethode auf geordnete Datenmengen. Warum mehr als zwei Wege? Zur Organisation sehr großer Datenmengen, z.B. bei Datenbanken reicht der Hauptspeicher eines Rechners oft nicht aus und man muss auf den Sekundärspeicher (z.B. Festplatte, SSD) zurückgreifen. Da die benötigte Zeit für den Zugriff auf den Sekundärspeicher um Größenordnungen höher liegt als beim Hauptspeicherzugriff, spielt die Tiefe eines Baumes (die zur Anzahl der Zugriffe auf den Sekundärspeicher korrespondiert) eine wesentliche Rolle bei der Verarbeitung großer Datenmengen. Vergleich bei hundert Millionen Elementen Tiefe eines perfekt balancierten binären Suchbaums: log2108 = 27 Tiefe eines perfekt balancierten 100-Wege Suchbaums: log100108 = 4 Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 424 Mehrwegsuchbäume Nachteile allgemeiner Mehrwegsuchbäume Leider weisen Mehrwegsuchbäume prinzipiell die selben Schwächen wie binäre Suchbäume auf, da sie auch degenerieren können. Insbesondere bei langsamen Sekundärspeicheroperationen wirkt sich der Grad der Unbalanciertheit eklatant aus. Abhilfe B-Bäume (Bayer und McCreight, 1972) stellen einen für Sekundärspeicher optimierten Mehrwegsuchbaum dar. Die Größe eines B-Baumknotens kann hier so gewählt werden, dass sie zur Blockgröße des Sekundärspeichers korrespondiert. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 425 B-Baum B-Baum der Ordnung M • die Wurzel besitzt mindestens zwei Teilbäume, sofern sie kein Blatt ist • alle Nichtwurzel- und alle Nichtblattknoten enthalten k–1 Schlüssel und k Verweise auf ihre Teilbäume • jeder Blattknoten enthält k–1 Schlüssel • alle Blätter befinden sich auf einer Ebene • für k gilt: !" M 2 #$ < k ≤ M Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 426 Struktur eines B-Baum-Knotens Knoteninhalt eines B-Baumknotens Meist dienen B-Bäume als Zugriffsstrukturen (z.B. für Datensätze einer Datenbank oder Dateien einer Festplatte). Demzufolge benötigen wir für jeden Schlüssel zwei Verweise, einen auf den Teilbaum mit dem nächst größeren Schlüssel und einen auf den zugehörigen Datensatz. Zusätzlich brauchen wir je B-Baumknoten noch einen Verweis auf den Teilbaum mit den kleineren Elementen. Beispiel für M=5 struct keyNode { int key; data* info; bNode* right; }; // // // // Schlüssel-Knoten für jeden Schlüssel eines B-Baumknotens Schlüssel Zeiger auf eigentliche Daten rechter Teilbaum mit größeren Elementen als key struct bNode { // eigentlicher B-Baumknoten bNode* left; // linker Teilbaum keyNode iNod[4];// ein B-Baumknoten enthält vier Schlüssel-Knoten }; Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 427 Eigenschaften eines B-Baums Eigenschaften Nach der gegebenen Definition ist sichergestellt, dass • B-Bäume immer mindestens zur Hälfte gefüllt sind • eine geringe Höhe besitzen (in Abhängigkeit von M) • perfekt balanciert sind Weganzahl eines B-Baums Da ein B-Baumknoten oft der Größe eines Blocks des Sekundärspeichers entspricht, ergibt sich die Anzahl der Wege M des Baums aus dieser Größe, d.h. aus der Anzahl der Knoten des Typs keyNode, die sich in einem Sekundärspeicherblock unterbringen lassen. Damit determiniert neben der Blockgröße hauptsächlich der Speicherbedarf der Schlüsselkomponente die Anzahl der Wege eines B-Baums. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 428 Suchen im B-Baum B-Baumknoten enthalten in der Regel mehrere Schlüssel ➔ zweistufige Suche nötig: 1. Suchen im B-Baum: Verfolgen der Verzeigerung wie im binären Suchbaum 2. Suchen innerhalb eines B-Baumknotens: sequentielle Suche bei kleinem M, sonst binäre Suche Fallunterscheidung bei Suche nach Schlüssel w • w liegt zwischen den direkt benachbarten Schlüsselwerten a und b ➔ Verfolgen der Referenz des Schlüsselknotens mit Schlüssel a • w ist größer als der Schlüsselwert des letzten ((M–1)-ten) Schlüsselknotens ➔ Verfolgen der Referenz des letzten Schlüsselknotens • w ist kleiner als der erste Schlüssel des B-Baumknotens ➔ Verfolgen des Zeigers auf den linken Teilbaum des B-Baumknotens • w wird gefunden ➔ Bearbeitung des referenzierten Datensatzes • Falls irgendwo der Nullzeiger bei Zeigerverfolgung auftritt, wird die Suche abgebrochen. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 429 Einfügen in einen B-Baum (1) Hauptproblem Der Einfügealgorithmus muss sicherstellen, dass sich nach dem Einfügen weiterhin alle Blätter des Baumes auf einer Ebene befinden. Strategie Das Einfügen eines neuen Elements e erfolgt immer auf der Blattebene, dadurch wächst der Baum von unten nach oben und wird somit in perfekter Balance gehalten. Situationsbehandlung 1. Der für e geeignete Blattknoten besitzt noch freie Kapazitäten: ➔ Einordnen von e an der richtigen Stelle im Knoten 2. Einzig vorhandener Knoten ist die Wurzel und diese ist voll: ➔ siehe nächste Folie 3. Der zu e passende Blattknoten ist voll: ➔ siehe übernächste Folie Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 430 Einfügen in einen B-Baum (2) Situation Einfügen eines Elements e in eine volle Wurzel A. Ablauf • (virtuelles) sortiertes Einfügen von e in A, wobei die Verletzung des Füllkriteriums ignoriert wird • Bestimmen des Mittelelements d (an Position M/2) von A • alle Elemente mit kleinerem Schlüssel als d verbleiben in A • alle Elemente mit größerem Schlüssel als d werden in einen neuen Knoten B einsortiert • d wird in einen neuen Knoten R (die neue Wurzel) eingefügt • der (linke) Verweis von R muss dann auf A gesetzt werden • der (rechte) Verweis von d muss auf B gesetzt werden Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 431 Einfügen in einen B-Baum (3) Situation Einfügen eines Elements e in einen vollen Blattknoten A. Ablauf • (virtuelles) sortiertes Einfügen von e in A, wobei die Verletzung des Füllkriteriums ignoriert wird • Bestimmen des Mittelelements d (an Position M/2) von A • alle Elemente mit kleinerem Schlüssel als d verbleiben in A • alle Elemente mit größerem Schlüssel als d werden in einen neuen Blattknoten B einsortiert • (sortiertes) Einfügen von d in den Vater von A. Setzen des rechten Teilbaumverweises von d auf B Beachte Wenn der Vater von A ebenfalls voll ist, führt dies zu einem weiteren Aufruf des Einfügealgorithmus. Prinzipiell kann sich die Rekursion auf diese Weise bis zur Wurzel des B-Baums fortsetzen. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 432 Löschen im B-Baum (1) Hauptproblem Der Löschalgorithmus muss sicherstellen, dass sich nach dem Löschen weiterhin alle Blätter des Baumes auf einer Ebene befinden. Strategie Wir verwenden die Löschstrategie Löschen durch Kopieren, die sichergestellt, dass wir immer auf der Blattebene löschen (da sich alle Blätter in einer Ebene befinden, ist der zu löschende Knoten nach der Kopieraktion definitiv ein Blatt). Allgemeiner Ablauf 1. Löschen des Elements mittels Löschen durch Kopieren aus einem B-Baum-Blattknoten Y 2. Wiederherstellen der Ordnung in Y (z.B. durch Verschieben aller Elemente „rechts“ des gelöschten Elements um eine Position nach links bei Feldorganisation). Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 433 Löschen im B-Baum (2) Situationsbehandlung Wir müssen nach der eigentlichen Löschoperation noch untersuchen, ob Y den Kriterien eines B-Baumknotens weiterhin genügt oder anderenfalls geeignete Korrekturen durchführen. Situation 1 Y genügt den Füllkriterien eines B-Baumknotens ➔ keine weiteren Maßnahmen Situation 2 Y unterschreitet die Mindestelementanzahl eines B-Baumknotens. Hierbei unterscheiden wir zwei weitere Situationen in Abhängigkeit des Füllgrads der Geschwisterknoten von Y (X sei der linke und Z der rechte Geschwisterknoten) • Situation 2.1: Die Elementanzahl von X oder Z (oder beiden) ist größer als die minimal zulässige Elementanzahl • Situation 2.2: Die Elementanzahl von X und Z beträgt genau die minimal zulässige Elementanzahl. Dies beinhaltet sinngemäß auch den Fall, dass X oder Z nicht existieren. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 434 Löschen im B-Baum (3) Situation 2.1 Die Elementanzahl von X oder Z ist größer als die zulässige Mindestanzahl. Behandlung von Situation 2.1 Wir unterscheiden zwei Möglichkeiten: 1. Wenn X mehr Elemente als die notwendige Mindestanzahl enthält, dann wird das Elternelement von X in Y einsortiert und das größte Element von X wandert an die Stelle des entnommenen Elternelements. Dort wird auch der Verweis auf Y eingetragen. 2. Wenn Z mehr Elemente als die notwendige Mindestanzahl enthält, dann wird das Elternelement von Z in Y einsortiert und das kleinste Element von Z wandert an die Stelle des entnommenen Elternelements. Dort wird auch der Verweis auf Z eingetragen. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 435 Löschen im B-Baum (4) Situation 2.2: Die Elementanzahl von X und Z entspricht genau der Mindestanzahl. Behandlung von Situation 2.2 Wir können uns generell für eine der beiden folgenden zwei Möglichkeiten entscheiden (es sei denn, dass X nicht existiert oder Z nicht existiert): 1. Wir fügen die Elemente von Z und das Elternelement von Z in Y ein und löschen Z und das (ehemalige) Elternelement von Z 2. Wir fügen die Elemente von X und das Elternelement von X in Y ein und löschen X und das (ehemalige) Elternelement von X Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 436 Löschen im B-Baum (5) Beachte Bei Löschsituation 2.2 sinkt durch das Entfernen von X oder Z die Anzahl der Elemente im übergeordneten B-Baumknoten um Eins, wobei das Füllkriterium des übergeordneten BBaumknotens verletzt werden kann, was gegebenenfalls in der rekursiven Durchführung des Löschalgorithmus bis zur Wurzel resultiert. Sonderfall Es besteht die Möglichkeit, dass die zwei als Folge der Löschoperation zu verschmelzenden Knoten die Entnahme des letzten verbliebenen Elements der Wurzel bewirken. Lösung Der verschmolzene Blattknoten wird die neue Wurzel (und damit der einzige Knoten) des B-Baums. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 437 Weiterentwicklungen des B-Baums B*-Baum Um den teuren (zeitintensiven) Zugriff auf Sekundärspeicher zu minimieren, versucht der B*-Baum durch eine weitere Verschärfung des Füllkriteriums die Knotenanzahl des B-Baums noch weiter zu reduzieren. Maßnahmen Alle Knoten (außer der Wurzel) müssen zu mindestens 2/3 gefüllt sein. Bevor ein Knoten gesplittet wird, versucht man zunächst, dessen Elemente auf seine Geschwister zu verteilen. Ergebnis Insgesamt ergibt sich ein durchschnittlicher Füllgrad von etwa 81% (vgl. B-Baum: 69%). Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 438 Weiterentwicklungen des B-Baums B+-Baum (Wedekind, 1974) Verweise auf die Daten erfolgen nur in den Blättern des B+-Baums, die i.d.R. auch untereinander verbunden sind (d.h. ein Blatt „kennt“ seine direkt benachbarten Geschwister). Vorteil Daten können z.B. effizient sortiert ausgegeben werden, ohne eine (wesentlich kostenintensivere) Inorder-Baumtraversierung durchführen zu müssen. Alle Nichtblattknoten kann man somit als Zugriffsoptimierung (Index) der eigentlichen Daten ansehen. Dieses Konzept ist für viele Anwendungen, z.B. Datenbanken von wesentlicher Bedeutung und wird Ihnen im weiteren Studienverlauf sicher noch häufiger begegnen. Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 439 Ende der Vorlesung Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 440