4.5 B-Bäume
B-Bäume sind ähnlich wie binäre Suchbäume, allerdings erlauben wir nun, dass ein Knoten mehrere Schlüssel speichert. Wir führen folgende Schreibweise ein: wenn- jedes Blatt gleichen Abstand der Wurzel hat,
-
jeder innere Knoten, der
Kinder
hat, eine Folge von genau Schlüsseln speichert, so dass gilt.
Ich gebe zu, es ist kein schöner Anblick, dass der Elternknoten von delete
-Operation zumindest zeitweise ertragen müssen.
Das obige Beispiel ist also kein
Als Datenstruktur ist ein
Die Laufzeiten aller Operationen insert, find, delete
werden
propotional zur Höhe des Baumes und somit
find
geht so wie in BSTs, nur dass wir in Knoten mit zwei Schlüsseln den gesuchten Schlüssel im Allgemeinen mit und mit vergleichen müssen, um zu bestimmen, in welchem Teilbaum wir fortfahren.insert x
sucht zu allererst den tiefsten inneren Knoten und fügt ihn dort an der richtigen Stelle ein (ich zögere, Blatt zu sagen, weil nach Definition die Blätter keine Schlüssel speichern und in den obigen Abbildungen auch gar nicht gezeichnet wurden). Wenn in dem untersten Knoten noch Platz ist, dann ist alles in Ordnung:Der Knoten ist nun zu schwer geworden und zerfällt zwei Teilknoten und sendet den mittleren Schlüssel nach oben. Der Knoten darüber, also
, wird dadurch zu und zerfällt seinerseits. Wir stellen das in dieser kleinen Animation dar:Der Zyklus zu schwer - zerbrechen - Mittelschlüssel nach oben weiterschieben wird wiederholt, bis der Schlüssel in einen Elternknoten hochgeschoben wird, der noch Kapazität hat (also zuvor nur einen Schlüssel), oder bis zur Wurzel. Wenn die Wurzel zerfällt, entsteht ein neuer Wurzelknoten mit nur einem Schlüssel, und die Höhe des Baumes wächst um 1. Auch in diesem Fall finde ich das konkrete Beispiel fast weniger lehrreich als den "graphischen Pseudocode" für
insert:
Die Buchstaben
stehen für die Teillisten Baum/Schlüssel.../Baum, die links bzw. rechts von dem Pfeil stehen und von denen einen auch leer sein kann.delete x
ist etwas komplizierter alsinsert
. Zuerst lokalisieren wir (falls , dann werden wir das feststellen, wenn wir an einem Blatt landen, und müssen nichts weiter tun); wenn in einem untersten Knoten liegt, löschen wir es einfach erst mal; ansonsten, wenn weiter oben liegt, sei das Maximum im linken Teilbaum von ; der Schlüssel liegt in einem untersten Knoten; wir verschieben an die Position von und sind nun in einer Situation, als hätten wir gelöscht. -Baum und wir müssen nichts weiter tun. Anders sieht es aus, wenn im untersten Knoten der letzte Schlüssel gelöscht wird, wir also nun 0 Schlüssel haben. Im allgemeinen werden wir mit der Situation konfrontiert sein, dass es (genau einen) Knoten gibt, der 0 Schlüssel (und somit genau ein Kind) hat, und dieser Knoten muss nicht unbedingt ganz unten liegen. In diesem Falle gibt es drei Möglichkeiten, den Fehler zu "reparieren":- 1. Den kleinen Bruder anschnorren.
Wenn der leere Knoten einen linken Geschwisterknoten hat und dieser
ein Element entbehren kann, können wir eine Rechtsrotation
durchführen:
- 2. Die große Schwester anschnorren.
Dies ist symmetrisch zum vorherigen Fall:
-
Verschmelzen.
Eventuell können wir keine der zwei vorherigen Maßnahmen durchführen,
z.B. weil die Geschwister selbst nur einen Schlüssel besitzen.
In diesem Falle müssen wir zwei Geschwister verschmelzen.
Zuerst beachten Sie, dass der leere Knoten in jedem Fall mindestens
ein Geschwister hat: der Elternknoten selbst ist nicht leer (es wird
temporär nur maximal ein Knoten leer sein) und hat somit mindestens zwei
Kinder. Im folgenden zeige ich die Operation, die durchzuführen ist,
wenn der leere Knoten einen kleinen Bruder hat, der selbst nur
einen Schlüssel enthält:
Rechnen wir nach: kleiner Bruder und leerer Knoten hatten zusammen drei Kinder und einen Schlüssel; nach der Operation hat der entstandene Knoten zwei Schlüssel und drei Kinder. Der Elternknoten hatte
Schlüssel und Kinder; nun verliert er einen Schlüssel , und die Zahl der Kinder nimmt durch das Verschmelzen um 1 ab: er hat nun also Schlüssel und Kinder. Wir erhalten also einen gültigen B-Baum. Wenn , dann ist das sogar ein -Baum; wenn , dann ist nun der Elternknoten leer und hat nur ein Kind; wir müssen nun also die gleiche Reparaturoperation am Elternknoten fortsetzen. Dies kann sich bis zur Wurzel fortsetzen; wenn der Wurzelknoten selbst leer geworden ist (und ein Kind hat), dann löschen wir den Wurzelknoten und ernennen sein Kind zur neuen Wurzel; die Tiefe des Baumes nimmt nun um 1 ab.
- 1. Den kleinen Bruder anschnorren.
Wenn der leere Knoten einen linken Geschwisterknoten hat und dieser
ein Element entbehren kann, können wir eine Rechtsrotation
durchführen:
Es sollte klar sein, dass für Operationen die Laufzeit
proportional zur Höhe des Baumes und somit
Verallgemeinerung.
Ein B-Baum heiße delete
und
insert
ansehen.
Bei delete
kann ein "zu leichter" Knoten entstehen, der also
nur
Betrachten wir nun eine insert
-Operation.
Dabei kann ein "zu schwerer" Knoten mit
Solange also