Comment saisir des enregistrements avec les clés d'une arborescence B + initialement vide?

11

Afficher le résultat de la saisie des enregistrements avec les clés dans l'ordre (1, 2, 3, 4, 5) sur un arbre B + initialement vide d'ordre m = 3. En cas de dépassement, diviser le nœud et ne pas redistribuer clés des voisins. Est-il possible de saisir les enregistrements avec des clés dans un ordre différent pour avoir un arbre de moindre hauteur?

Extrait de Relational DBMS Internals, chapitre 5: Dynamic Tree-Structure Organizations, p.50

Je ne suis pas bon sur ce point mais j'ai essayé de faire ≤ à gauche et> à droite:

Jusqu'à insertion de 1,2:

entrez la description de l'image ici

Ensuite, dans la mesure où nous devons diviser le nœud et ne pas redistribuer les clés aux voisins (je le comprends comme fils-nœuds), j'ai inséré uniquement à droite de la cellule avec 2:

entrez la description de l'image ici

Et j'ai continué à faire de même avec lors de l'insertion de 5:

entrez la description de l'image ici

Mais c'est assez étrange, je n'ai jamais vu de nœuds vides comme ceux-ci ... Et je ne sais pas si cela respecte certaines propriétés très basiques des arbres B:

  • chaque nœud a au plus (m-1) clés et au moins (⌈ (m / 2) ⌉-1) clés à moins qu'une clé ne puisse être vide et je comprendrais la clé comme un "pointeur".

Première tentative: une erreur sur la commande a révélé un arbre ambigu

Au début, j'ai mal compris ce qu'était une "commande" (le nombre maximum d'enfants par nœud). J'ai donc pensé qu'un nœud pouvait avoir trois espaces (et donc 4 enfants. Je créais un arbre d'ordre 4 je pense:

Jusqu'à insertion de 1,2,3:

entrez la description de l'image ici

Insertion de 4, dans la mesure où nous devons diviser le nœud et ne pas redistribuer les clés aux voisins (ce qui semble contradictoire) je laisserais 1,2,3 et 4,5 sur la feuille de droite après 3:

B arbre d'ordre 3 après insertion des 4 & 5

Revolucion pour Monica
la source

Réponses:

6

Je pense que vous avez votre création de page à l'envers. Lorsqu'un nœud se divise, il ne crée pas plus de nœuds dans la hiérarchie (nœuds fils dans votre nomenclature). Au lieu de cela, il crée plus vers le haut , vers la racine. Comme le dit le livre

Notez que la croissance est au sommet de l'arbre, et c'est une caractéristique intrinsèque d'un arbre B pour garantir les propriétés importantes qu'il a toujours toutes les feuilles au même niveau, et chaque nœud différent de la racine est au moins 50% plein.

(C'est moi qui souligne.)

De l'ebook lié:

Définition 5.1 AB – arbre d'ordre m (m ≥ 3) ... chaque nœud contient au plus m - 1 clés

L'exercice est pour m = 3, donc au plus 2 clés par nœud.

Les deux premières touches sont faciles - elles vont dans la première page:

A:[1,2]

Je vais utiliser l'art ASCII. Je vais étiqueter chaque page dans la séquence de création et afficher les clés / pointeurs dans la page. La page P contenant les valeurs clés k1 et k2 sera donc P:[k1,k2].

Maintenant, la clé 3 arrive. Selon la section 5.2.1 ... Insertion, la première tâche consiste à rechercher. Cela détermine que la clé 3 doit être sur la page A - la seule page que nous ayons. De plus "si [ce nœud] est plein, il sera divisé en deux nœuds". La page est pleine, elle doit donc être divisée. Nous avons maintenant

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

Mais ce n'est pas un arbre! Comme le dit le livre:

le pointeur vers [le nouveau nœud], .. est inséré dans le nœud père .. du [nœud actuel], répétant l'opération d'insertion dans ce nœud [c'est-à-dire le nœud père]. Ce processus de fractionnement et de remontée peut se poursuivre si nécessaire jusqu'à la racine, et si cela doit être fractionné, un nouveau nœud racine sera créé.

(Mon accent pour montrer que le traitement continue vers le haut de l'arbre vers la racine, pas vers les feuilles.)

Il faut donc mettre un pointeur sur la nouvelle page (B) dans le père de la page courante (A). Il doit y avoir un nouveau nœud racine:

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

J'ai les pointeurs dans les pages non-feuilles pointant vers la valeur la plus élevée dans un nœud enfant (fils). Votre texte lié peut faire cela différemment, mais le résultat sera équivalent.

La valeur clé 4 arrive; en suivant l'algorithme que nous recherchons pour trouver sur quelle page il doit se trouver. Cela devrait être la page B. Il y a de la place pour cela, donc nous mettons à jour cette page et le pointeur sur la page C:

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

Ensuite, nous insérons la clé 5. Elle devrait aller à la page B mais elle est pleine. Par conséquent, il se divise

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

Nous devons mettre à jour le nœud père. Il est également plein, donc il se divise:

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

Le fractionnement se propage et un nouveau nœud racine se forme:

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

En poussant vers le haut, l'arbre conserve une profondeur identique dans chaque branche. Ceci est important pour des performances prévisibles. (Certains disent que le B dans B-Tree signifie "équilibré" pour cette raison même.)


Quant à la deuxième partie - "Est-il possible de saisir les enregistrements avec des clés dans un ordre différent pour avoir un arbre de moindre hauteur?" Avec 5 clés et deux clés par nœud, nous avons besoin d'au moins 3 nœuds feuilles pour contenir toutes les valeurs et une hauteur de 3 pour former l'arbre. Mon arrangement est donc optimal pour les données, la séquence et l'algorithme donnés.

Le livre utilise un arrangement de pointeur très différent de ce que j'utilise et un arrangement de division de page différent. Ce sera important, conduisant à des pages partiellement remplies. Qu'il y ait une section à la page 42 intitulée "Chargement des données" qui montre comment des pages plus complètes peuvent être obtenues en chargeant la séquence de touches prend en charge mon intuition. Cependant, j'espère que je vous ai donné suffisamment de pointeurs et que vous pourrez utiliser la structure de pointeurs du livre pour résoudre cela par vous-même.


Je suis tombé sur cette simulation interactive de la croissance d'un arbre B.

Michael Green
la source