Quelles sont les différences entre les arbres B et les arbres B +?

293

Dans un arbre b, vous pouvez stocker les clés et les données dans les nœuds internes et feuilles , mais dans un arbre b +, vous devez stocker les données dans les nœuds feuilles uniquement .

Y a-t-il un avantage à faire ce qui précède dans un arbre b +?

Pourquoi ne pas utiliser les arbres b au lieu des arbres b + partout, car intuitivement ils semblent beaucoup plus rapides?

Je veux dire, pourquoi avez-vous besoin de répliquer la clé (données) dans un arbre b +?

simplfuzz
la source
37
Je pense que ce qu'ils disent est "B-Tree" contre B + -Tree. Ils signifient un trait d'union, pas un signe moins.
stu

Réponses:

421

L'image ci-dessous permet de montrer les différences entre les arbres B + et les arbres B.

Avantages des arbres B +:

  • Étant donné que les arbres B + n'ont pas de données associées aux nœuds intérieurs, davantage de clés peuvent tenir sur une page de mémoire. Par conséquent, il faudra moins de ratés de cache pour accéder aux données qui se trouvent sur un nœud feuille.
  • Les nœuds foliaires des arbres B + sont liés, de sorte que l'analyse complète de tous les objets d'un arbre nécessite un seul passage linéaire à travers tous les nœuds foliaires. Par contre, un arbre AB nécessiterait une traversée de chaque niveau de l'arbre. Cette traversée d'arbre complet impliquera probablement plus de ratés de cache que la traversée linéaire de feuilles B +.

Avantage des arbres B:

  • Étant donné que les arborescences B contiennent des données avec chaque clé, les nœuds fréquemment consultés peuvent se trouver plus près de la racine et, par conséquent, être accessibles plus rapidement.

Arbre B et B +

Rose Perrone
la source
2
Leur contrainte est-elle sur le nombre d'entrées dans le nœud feuille?
TLE
38
@TLE Bonne question! Oui. Un disque dur accède à au moins une page de mémoire à la fois, nous voulons donc tenir tous les pointeurs dans une seule page de mémoire. Nous voulons exiger une seule lecture de disque par accès feuille, donc nous ne voulons pas affecter plus d'une taille de page de pointeurs à une feuille. Si nous remplissons une feuille avec une taille de page de pointeurs, puis que nous voulons ajouter un autre pointeur à cette feuille, nous créons deux enfants de ce nœud et donnons la moitié des pointeurs de la feuille à chaque nouvel enfant. Bien sûr, il peut y avoir un remaniement pour s'assurer que la hauteur de l'arbre est réduite au minimum. est-ce que cela aide?
Rose Perrone
le dernier pointeur de chaque nœud feuille de B-tree devrait pointer vers le nœud feuille suivant, non?
camino
8
Désolée d'avoir heurté un fil aussi ancien, mais le commentaire de @ Babyburger sur la façon dont le commentaire de camino était correct n'est pas vrai; un arbre B n'a pas, en fait, de nœuds feuilles connectés. Un B +, bien sûr.
Jason
Merci pour l'excellente réponse, quel est un cas d'utilisation où une analyse complète des objets serait nécessaire dans une arborescence B / B + dans un contexte de base de données? Puisqu'il est principalement utilisé pour l'indexation, les recherches n'auraient presque jamais besoin de balayer entièrement l'arborescence vers la droite et de la parcourir via le chemin d'index, est-ce correct?
Siddhartha
113

Le principal avantage des arbres B + par rapport aux arbres B est qu'ils vous permettent d'intégrer plus de pointeurs vers d'autres nœuds en supprimant des pointeurs vers les données, augmentant ainsi le fanout et potentiellement diminuant la profondeur de l'arbre.

L'inconvénient est qu'il n'y a pas de sorties anticipées lorsque vous avez peut-être trouvé une correspondance dans un nœud interne. Mais comme les deux structures de données ont d'énormes fanouts, la grande majorité de vos correspondances seront de toute façon sur les nœuds feuilles, ce qui rendra en moyenne l'arbre B + plus efficace.

Vice
la source
1
Je préfère la réponse de Jeff, car elle souligne la différence d'efficacité lors d'une analyse complète.
Rose Perrone
Je suis vraiment confus car parcourir un arbre b en utilisant une traversée dans l'ordre lira toutes les valeurs dans l'ordre trié en temps O (n). Si chaque nœud d'arbre est dimensionné de manière optimale pour la taille de la page physique, il semble que les choses ne deviennent plus optimales. Inversement, le coût pour atteindre la première valeur (la plus petite) dans un arbre b + est O (log n), puis pour parcourir chaque feuille est O (n), donc le coût total est O (log n + n). C'est plus de travail et plus de lectures de disque, ce qui est logique car l'arborescence contient toutes ces données supplémentaires. Je ne comprends pas.
Eric
Que serait-ce un autre mot pour «fanout» dans la phrase ci-dessus?
Jorge Bucaran
3
@JorgeBucaran fanout = nombre d'arêtes sortant d'un nœud
bantmen
33

Les arbres B + sont beaucoup plus faciles et plus performants pour effectuer une analyse complète, comme pour chaque élément de données indexé par l'arbre, car les nœuds terminaux forment une liste liée. Pour effectuer une analyse complète avec un B-Tree, vous devez effectuer une traversée complète de l'arborescence pour trouver toutes les données.

D'un autre côté, les B-Trees peuvent être plus rapides lorsque vous effectuez une recherche (en recherchant une donnée spécifique par clé), en particulier lorsque l'arborescence réside dans la RAM ou dans un autre stockage non-bloc. Étant donné que vous pouvez élever les nœuds couramment utilisés dans l'arborescence, moins de comparaisons sont nécessaires pour accéder aux données.

Jeff Mc
la source
1
Seriez-vous d'accord alors qu'un arbre B + serait utilisé pour les situations dans lesquelles il pourrait y avoir une lecture séquentielle de toutes les données et ainsi pouvoir traverser les feuilles. Alors que l'arbre B serait idéal pour les situations d'accès aléatoire?
JDPeckham
31
  1. Dans une arborescence B, les clés de recherche et les données sont stockées dans des nœuds internes ou feuilles. Mais dans un arbre B +, les données ne sont stockées que dans les nœuds feuilles.
  2. L'analyse complète d'un arbre B + est très facile car toutes les données se trouvent dans les nœuds foliaires. L'analyse complète d'un arbre B nécessite une traversée complète.
  3. Dans un arbre B, les données peuvent être trouvées dans des nœuds feuilles ou des nœuds internes. La suppression des nœuds internes est très compliquée. Dans un arbre B +, les données se trouvent uniquement dans les nœuds foliaires. La suppression des nœuds foliaires est facile.
  4. L'insertion dans l'arbre B est plus compliquée que l'arbre B +.
  5. Les arbres B + stockent les clés de recherche redondantes mais l'arbre B n'a pas de valeur redondante.
  6. Dans une arborescence B +, les données du nœud feuille sont classées sous forme de liste chaînée séquentielle, mais dans une arborescence B, le nœud feuille ne peut pas être stocké à l'aide d'une liste chaînée. De nombreuses implémentations de systèmes de bases de données préfèrent la simplicité structurelle d'un arbre B +.
androidcodehunter
la source
15

Exemple de concepts de système de base de données 5e

Arbre B + Arbre B +

arbre B correspondant Btree

camino
la source
5
Je ne pense pas qu'un arbre B ait des liens avec les enfants du nœud. Par exemple, formez le Clearview bucketau Mianus Bucket. Cela n'aurait pas beaucoup de sens de toute façon, car entre les deux, vous avez Downtown bucketbeaucoup à rechercher dans le cas où vous souhaitez effectuer un balayage d'index dans un arbre B (nécessite un retour arrière). Où est-ce que tu as eu çà?
Evan Carroll
1
@EvanCarroll Database system concepts 5th, peut-être que vous devez confirmer avec l'auteur :)
camino
11

Définissez "beaucoup plus vite". Asymptotiquement, ils sont à peu près les mêmes. Les différences résident dans la façon dont ils utilisent le stockage secondaire. Les articles de Wikipedia sur les arbres B et les arbres B + semblent assez fiables.

Charlie Martin
la source
2
Je suis d'accord avec Charlie. Puisqu'un nœud d'un B-Tree représente une page ou un bloc de mémoire secondaire, le passage d'un nœud à un autre nécessite un changement de page long.
11

Adegoke A, Amit

Je suppose qu'un point crucial que vous manquez est la différence entre les données et les pointeurs comme expliqué dans cette section.

Pointeur: pointeur vers d'autres nœuds.

Données: - Dans le contexte des index de base de données, les données ne sont qu'un autre pointeur vers des données réelles (ligne) qui résident ailleurs.

Par conséquent, dans le cas de l'arbre B, chaque nœud possède trois clés d'information, des pointeurs vers les données associées aux clés et un pointeur vers les nœuds enfants.

Dans l'arborescence B +, le nœud interne conserve les clés et les pointeurs vers le nœud enfant tandis que le nœud feuille conserve les clés et les pointeurs vers les données associées. Cela permet un plus grand nombre de clés pour une taille de nœud donnée. La taille du nœud est déterminée principalement par la taille du bloc.

L'avantage d'avoir plus de clés par nœud est expliqué bien ci-dessus, donc je vais économiser mon effort de frappe.

Saket
la source
10

Les arbres B + sont particulièrement adaptés au stockage basé sur des blocs (par exemple: disque dur). dans cet esprit, vous obtenez plusieurs avantages, par exemple (du haut de ma tête):

  • fanout élevé / faible profondeur: cela signifie que vous devez obtenir moins de blocs pour accéder aux données. avec des données entremêlées avec les pointeurs, chaque lecture obtient moins de pointeurs, vous avez donc besoin de plus de recherches pour accéder aux données

  • stockage de blocs simple et cohérent: un nœud interne a N pointeurs, rien d'autre, un nœud feuille a des données, rien d'autre. cela facilite l'analyse, le débogage et même la reconstruction.

  • une densité de clé élevée signifie que les nœuds supérieurs sont presque certainement dans le cache, dans de nombreux cas, tous les nœuds internes sont rapidement mis en cache, donc seul l'accès aux données doit aller sur le disque.

Javier
la source
2
principalement pour les arbres en mémoire; mais il existe d'autres options populaires, comme les arbres rouge-noir, les listes à sauter, etc.
Javier
Les arbres B sont également conçus pour un stockage basé sur des blocs efficace, limitant le nombre asymptotique d'accès aux nœuds. Sinon, si vous utilisez un support de stockage de type mémoire à accès aléatoire, vous pouvez utiliser un arbre binaire à équilibrage automatique tel qu'un arbre rouge-noir pour obtenir de meilleurs résultats.
dionyziz
votre premier point ne devrait-il pas dire «moins de recherches» plutôt que «plus de recherches». Plus petite profondeur -> moins de recherches
Jesse
1
@Jesse: fanout élevé => faible profondeur => moins de recherches, mais le mélange de données et de pointeurs signifie moins de pointeurs => faible fanout => plus de profondeur => plus de recherches
Javier
1
@AdegokeA: un arbre B + a deux types de nœuds: nœuds intérieurs avec uniquement des clés et des pointeurs, pas de données; et les nœuds feuilles, avec des données et sans pointeurs. qui permet un nombre maximum de clés sur chaque nœud interne. si vous stockez des données sur un nœud interne, vous pouvez adapter moins de pointeurs et votre arbre devient plus grand.
Javier
5

Dans B + Tree, puisque seuls les pointeurs sont stockés dans les nœuds internes, leur taille devient considérablement plus petite que les nœuds internes de B tree (qui stockent à la fois les données + la clé). Par conséquent, les index de l'arborescence B + peuvent être récupérés à partir du stockage externe dans une seule lecture de disque, traités pour trouver l'emplacement de la cible. S'il s'agit d'une arborescence B, une lecture de disque est requise pour chaque processus décisionnel. J'espère avoir fait comprendre mon point! :)

VS7
la source
4

**

L'inconvénient majeur de B-Tree est la difficulté de parcourir les touches de manière séquentielle. L'arbre B + conserve la propriété d'accès aléatoire rapide de l'arbre B tout en permettant un accès séquentiel rapide

** ref: Structures de données utilisant C // Auteur: Aaro M Tenenbaum

http://books.google.co.in/books?id=X0Cd1Pr2W0gC&pg=PA456&lpg=PA456&dq=drawback+of+B-Tree+is+the+difficulty+of+Traversing+the+keys+sequential&source=bl&ots=pGcPQSEJMS&sig= F9MY7zEXYAMVKl_Sg4W-0LTRor8 & hl = en & sa = X & ei = nD5AUbeeH4zwrQe12oCYAQ & ved = 0CDsQ6AEwAg # v = onepage & q = drawback% 20of% 20B-Tree% 20is% 20the% 20diff 20%

Kapil Kumar
la source
1
Cela aurait dû être la bonne réponse. En bref: localité de référence.
Theodore Zographos
2

Prenons un exemple - vous avez un tableau avec d'énormes données par ligne. Cela signifie que chaque instance de l'objet est Big.

Si vous utilisez l'arborescence B ici, la plupart du temps est consacré à la numérisation des pages contenant des données, ce qui est inutile. Dans les bases de données, c'est la raison d'utiliser les arbres B + pour éviter d'analyser les données des objets.

B + Les arbres séparent les clés des données.

Mais si la taille de vos données est inférieure, vous pouvez les stocker avec la clé, ce que fait l'arbre B.

Amit
la source
1
"Si vous utilisez l'arborescence B ici, la plupart du temps est consacré à la numérisation des pages contenant des données" - pas nécessaire. Les nœuds B-tree ne peuvent conserver que des "pointeurs" vers les données sur disque, pas les données elles-mêmes.
TT_
2

La principale distinction entre l'arbre B et l'arbre B + est que l'arbre B élimine le stockage redondant des valeurs de clé de recherche.Comme les clés de recherche ne sont pas répétées dans l'arbre B, il se peut que nous ne puissions pas stocker l'index en utilisant moins de nœuds d'arbre. que dans l'index de l'arbre B + correspondant. Cependant, comme la clé de recherche qui apparaît dans les nœuds non-feuilles n'apparaît nulle part ailleurs dans l'arbre B, nous sommes obligés d'inclure un champ de pointeur supplémentaire pour chaque clé de recherche dans un nœud non-feuille. Ce sont des avantages d'espace pour l'arbre B, car la répétition ne se produit pas et peut être utilisée pour les grands indices.

Marie
la source
1
Intéressant, les réflexions sur la répétition sont uniques parmi les réponses ici et ont plus de sens que la traversée ordonnée de l'arbre b + étant plus efficace que la traversée ordonnée d'un arbre b. Pour autant que je sache, ce n'est pas tout à fait raison, ou pas toute l'histoire car, dans l'ordre, la traversée d'un arbre b est O (n) et trouver le plus petit nœud dans un arbre b + est O (log n), puis traversant chaque feuille est O (n) en plus de cela. Cependant, si vous indexiez quelque chose avec une petite plage de valeurs, comme un champ booléen, l'arbre b + a beaucoup plus de sens qu'un arbre b en raison de sa gestion en double.
Eric
1

Un arbre B + est un arbre équilibré dans lequel chaque chemin de la racine de l'arbre à une feuille est de la même longueur, et chaque nœud non-feuille de l'arbre a entre [n / 2] et [n] enfants, où n est fixe pour un arbre particulier. Il contient des pages d'index et des pages de données. Les arbres binaires n'ont que deux enfants par nœud parent, les arbres B + peuvent avoir un nombre variable d'enfants pour chaque nœud parent

Vivek Rakholiya
la source
1
Pour plus de clarté, les arbres B ne sont pas des arbres binaires. En fait, les arbres B et les arbres B + sont plus proches les uns des autres dans la construction et l'utilisation que les arbres binaires. Les articles wiki peuvent aider à dégager les définitions - Arbre B + , B Arbre et Binary Tree
uutsav
1

Une utilisation possible des arbres B + est qu'ils conviennent aux situations où l'arbre devient si grand qu'il ne tient pas dans la mémoire disponible. Ainsi, vous vous attendez généralement à effectuer plusieurs E / S.
Il arrive souvent qu'une arborescence B + soit utilisée même lorsqu'elle tient en fait dans la mémoire, et que votre gestionnaire de cache puisse la conserver en permanence. Mais c'est un cas spécial, pas le cas général, et la politique de mise en cache est distincte de la maintenance de l'arborescence B + en tant que telle.

De plus, dans une arborescence B +, les pages feuilles sont liées entre elles dans une liste chaînée (ou liste doublement chaînée), ce qui optimise les parcours (pour les recherches par plage, le tri, etc.). Le nombre de pointeurs est donc fonction de l'algorithme spécifique utilisé.

programmeur de pile
la source
C'est en réponse à la question: pourquoi ne devrions-nous pas utiliser des arbres B au lieu d'arbres B + partout :)
programmeur de pile
3
Mais vous ne décrivez qu'un seul côté, à notre connaissance, avec votre réponse, les arbres b pourraient fonctionner exactement de la même manière. Le PO a demandé d'expliquer les différences et vous n'avez parlé que de l'un et pas de l'autre. Vous ne pouvez pas avoir un diagramme Venn avec un seul cercle!
Malfist