Wie gebe ich Datensätze mit Schlüsseln für einen anfangs leeren B + -Baum ein?

11

Zeigen Sie das Ergebnis der Eingabe der Datensätze mit Schlüsseln in der Reihenfolge (1, 2, 3, 4, 5) zu einem anfangs leeren B + -Baum der Reihenfolge m = 3. Teilen Sie den Knoten bei Überlauf auf und verteilen Sie ihn nicht erneut Schlüssel zu den Nachbarn. Ist es möglich, die Datensätze mit Schlüsseln in einer anderen Reihenfolge einzugeben, um einen Baum mit geringerer Höhe zu erhalten?

Aus relationalen DBMS-Interna, Kapitel 5: Dynamische Baumstrukturorganisationen, S. 50

Ich bin noch nicht gut darin, aber ich habe versucht, ≤ links und> rechts zu tun:

Bis zum Einfügen von 1,2:

Geben Sie hier die Bildbeschreibung ein

Dann, soweit wir den Knoten teilen und die Schlüssel nicht an die Nachbarn weitergeben müssen (ich verstehe es als Sohnknoten), habe ich nur rechts von der Zelle mit 2 eingefügt:

Geben Sie hier die Bildbeschreibung ein

Und ich machte dasselbe mit dem Einfügen von 5:

Geben Sie hier die Bildbeschreibung ein

Aber das ist ziemlich seltsam, ich habe noch nie leere Knoten wie diese gesehen ... Und ich weiß nicht, ob es einige sehr grundlegende Eigenschaften von B-Bäumen berücksichtigt:

  • Jeder Knoten hat höchstens (m-1) Schlüssel und mindestens (⌈ (m / 2) ⌉-1) Schlüssel, es sei denn, ein Schlüssel kann leer sein und ich würde den Schlüssel als "Zeiger" verstehen.

Erster Versuch: Ein Fehler in der Bestellung ergab einen mehrdeutigen Baum

Am Anfang habe ich falsch verstanden, was eine "Reihenfolge" ist (die maximale Anzahl von Kindern pro Knoten). Also dachte ich, ein Knoten könnte drei Leerzeichen haben (und damit 4 Kinder. Ich habe einen Baum der Ordnung 4 erstellt, denke ich:

Bis zum Einfügen von 1,2,3:

Geben Sie hier die Bildbeschreibung ein

Einfügen von 4, soweit wir den Knoten teilen und die Schlüssel nicht an Nachbarn weitergeben müssen (was widersprüchlich erscheint), würde ich nach 3 1,2,3 und 4,5 auf dem rechten Blatt lassen:

B Baum der Ordnung 3 nach dem Einfügen von 4 & 5

Revolution für Monica
quelle

Antworten:

6

Ich denke, Sie haben Ihre Seitenerstellung auf den Kopf gestellt. Wenn sich ein Knoten teilt, werden in der Hierarchie keine weiteren Knoten erstellt (Sohnknoten in Ihrer Nomenklatur). Stattdessen erzeugt es mehr nach oben in Richtung der Wurzel. Wie das Buch sagt

Beachten Sie, dass sich das Wachstum am oberen Rand des Baums befindet. Dies ist ein wesentliches Merkmal eines B-Baums, um die wichtigen Eigenschaften sicherzustellen, dass alle Blätter immer auf derselben Ebene liegen und jeder Knoten sich von der Wurzel unterscheidet 50% voll.

(Meine Betonung.)

Aus dem verlinkten eBook:

Definition 5.1 AB - Baum der Ordnung m (m ≥ 3) ... jeder Knoten enthält höchstens m - 1 Schlüssel

Die Übung ist für m = 3, also höchstens 2 Schlüssel pro Knoten.

Die ersten beiden Tasten sind einfach - sie gehen auf die erste Seite:

A:[1,2]

Ich werde ASCII-Kunst verwenden. Ich beschrifte jede Seite in der Reihenfolge, in der sie erstellt wurden, und zeige die Schlüssel / Zeiger auf der Seite. Seite P mit den Schlüsselwerten k1 und k2 wird also sein P:[k1,k2].

Jetzt kommt Schlüssel 3. Gemäß Abschnitt 5.2.1 ... Einfügen besteht die erste Aufgabe in der Suche. Dies bestimmt, dass Schlüssel 3 auf Seite A sein sollte - der einzigen Seite, die wir haben. Weiter "wenn [dieser Knoten] voll ist, wird er in zwei Knoten aufgeteilt." Die Seite ist voll und muss geteilt werden. Wir haben nun

A:[1,2]    B:[3, ]

Aber das ist kein Baum! Wie das Buch sagt:

der Zeiger auf [den neuen Knoten], .. in den eingefügten Vater - Knoten .. [das aktuellen Knotens], in diesem Knoten des Einführvorgang zu wiederholen [dh des Vater - Knoten]. Dieser Aufteilungs- und Verschiebungsprozess kann bei Bedarf bis zum Stamm fortgesetzt werden. Wenn dieser aufgeteilt werden muss, wird ein neuer Stammknoten erstellt.

(Meine Betonung darauf, die Verarbeitung zu zeigen, setzt sich den Baum hinauf zur Wurzel und nicht hinunter zu den Blättern.)

Wir müssen also einen Zeiger auf die neue Seite (B) in den Vater der aktuellen Seite (A) setzen. Es muss einen neuen Wurzelknoten geben:

      C:[2,3]
      /     \
A:[1,2]    B:[3, ]

Ich habe die Zeiger auf Nicht-Blattseiten, die auf den höchsten Wert in einem untergeordneten (Sohn-) Knoten zeigen. Ihr verlinkter Text kann dies anders machen, aber das Ergebnis ist gleichwertig.

Schlüsselwert 4 kommt an; Nach dem Algorithmus suchen wir, auf welcher Seite es sein soll. Es sollte Seite B sein. Es ist Platz dafür, also aktualisieren wir diese Seite und den Zeiger auf Seite C:

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]

Als nächstes fügen wir Schlüssel 5 ein. Er sollte auf Seite B stehen, ist aber voll. Deshalb spaltet es sich

      C:[2,4]
      /     \
A:[1,2]    B:[3,4]   D:[5, ]

Wir müssen den Vaterknoten aktualisieren. Es ist auch voll, so dass es sich teilt:

      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

Die Aufteilung breitet sich aus und ein neuer Wurzelknoten bildet sich:

            F:[4,5]
            /     \
      C:[2,4]    E:[5, ]
      /     \         \
A:[1,2]    B:[3,4]   D:[5, ]

Durch das Aufwachsen behält der Baum in jedem Ast die gleiche Tiefe bei. Dies ist wichtig für eine vorhersehbare Leistung. (Einige sagen, dass das B in B-Tree aus genau diesem Grund für "ausgeglichen" steht.)


Zum zweiten Teil: "Ist es möglich, die Datensätze mit Schlüsseln in einer anderen Reihenfolge einzugeben, um einen Baum mit geringerer Höhe zu erhalten?" Mit 5 Schlüsseln und zwei Schlüsseln pro Knoten benötigen wir mindestens 3 Blattknoten, um alle Werte zu halten, und eine Höhe von 3, um den Baum zu bilden. Meine Anordnung ist also optimal für die gegebenen Daten, Sequenzen und Algorithmen.

Das Buch verwendet eine ganz andere Zeigeranordnung als ich und eine andere Anordnung zum Teilen von Seiten. Dies ist von Bedeutung und führt zu teilweise vollständigen Seiten. Dass es auf Seite 42 einen Abschnitt mit dem Titel "Laden von Daten" gibt, der zeigt, wie vollere Seiten durch Laden aus einer Schlüsselsequenz erzielt werden können, unterstützt meine Vermutung. Ich hoffe jedoch, dass ich Ihnen genügend Hinweise gegeben habe und Sie die Zeigerstruktur des Buches verwenden können, um dies selbst herauszufinden.


Ich bin auf diese interaktive Simulation gestoßen, wie ein B-Baum wächst.

Michael Green
quelle