345 votes

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

Dans un arbre B, vous pouvez stocker à la fois les clés et les données dans les nœuds internes et les nœuds feuilles, mais dans un arbre B+ vous devez stocker les données dans les nœuds feuilles seulement.

Y a-t-il un avantage à faire cela dans un arbre B+?

Pourquoi ne pas utiliser des arbres B à la place 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+?

42 votes

Je pense qu'ils veulent dire "Arbre-B" par rapport à Arbre-B+. Ils veulent dire un trait d'union, pas un signe négatif.

482voto

Rose Perrone Points 14478

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

Avantages des arbres B+ :

  • Parce que les arbres B+ n'ont pas de données associées aux nœuds intérieurs, plus 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 feuilles des arbres B+ sont liés, donc faire un balayage complet de tous les objets dans un arbre ne nécessite qu'un seul passage linéaire à travers tous les nœuds feuilles. Un arbre B, en revanche, nécessiterait un parcours de chaque niveau dans l'arbre. Ce parcours complet de l'arbre entraînera probablement plus de ratés de cache que le parcours linéaire des feuilles B+.

Avantage des arbres B :

  • Parce que les arbres B contiennent des données avec chaque clé, les nœuds fréquemment accessibles peuvent être plus proches de la racine et donc être accessibles plus rapidement.

Arbres B et B+

6 votes

Y a-t-il une contrainte sur le nombre d'entrées dans un nœud feuille??

47 votes

@TLE Bonne question! Oui. Un disque dur accède à un minimum d'une page de mémoire à la fois, donc nous voulons adapter tous les pointeurs dans une seule page de mémoire. Nous voulons exiger seulement une lecture de disque par accès de feuille, donc nous ne voulons pas attribuer plus d'une taille de page de pointeurs à une feuille. Si nous remplissons une feuille avec une taille de page de pointeurs, et que nous voulons ajouter un autre pointeur à cette feuille, nous créons deux enfants pour ce nœud, et nous donnons la moitié des pointeurs de la feuille à chaque nouvel enfant. Bien sûr, il peut y avoir un certain réarrangement pour garantir que la hauteur de l'arbre est maintenue à un minimum. Est-ce que cela aide?

0 votes

Le dernier pointeur de chaque nœud feuille de l'arbre B doit pointer vers le prochain nœud feuille, n'est-ce pas?

129voto

Vic E Points 546

Le principal avantage des arbres B+ par rapport aux arbres B est qu'ils vous permettent d'emballer plus de pointeurs vers d'autres nœuds en supprimant les pointeurs vers les données, ce qui augmente le facteur de ventilation et diminue potentiellement la profondeur de l'arbre.

L'inconvénient est qu'il n'y a pas de sortie anticipée lorsque vous pourriez avoir trouvé une correspondance dans un nœud interne. Mais comme les deux structures de données ont des facteurs de ventilation énormes, la grande majorité de vos correspondances seront de toute façon sur des nœuds feuilles, ce qui rend en moyenne l'arbre B+ plus efficace.

2 votes

Je préfère la réponse de Jeff, car elle met l'accent sur la différence d'efficacité lors de l'analyse complète.

1 votes

Je suis vraiment confus car parcourir un arbre b en utilisant un parcours en ordre lira toutes les valeurs dans l'ordre trié en temps O(n). Si chaque nœud de l'arbre est de taille optimale pour la taille de la page physique, il semble que les choses ne deviennent pas plus optimales. En revanche, le coût pour accéder à la première valeur (la plus petite) dans un arbre b+ est O(log n) et ensuite parcourir chaque feuille est O(n) donc le coût total est O(log n + n). Cela représente plus de travail et plus de lectures de disque ce qui a du sens car l'arbre contient toutes ces données supplémentaires. Je ne comprends pas.

0 votes

Quel serait un autre mot pour 'fanout' dans la phrase ci-dessus?

42voto

Jeff Mc Points 1741

Les B+ arbres sont beaucoup plus faciles et plus performants à numériser entièrement, c'est-à-dire à regarder chaque donnée indexée par l'arbre, car les nœuds terminaux forment une liste chaînée. Pour effectuer une numérisation complète avec un arbre B, vous devez effectuer une traversée complète de l'arbre pour trouver toutes les données.

En revanche, les B-arbres peuvent être plus rapides lorsque vous effectuez une recherche (recherche d'une donnée spécifique par clé), surtout lorsque l'arbre réside en RAM ou dans un autre stockage non bloquant. Étant donné que vous pouvez élever les nœuds couramment utilisés dans l'arbre, moins de comparaisons sont nécessaires pour accéder aux données.

2 votes

Est-ce que vous seriez d'accord alors qu'un arbre B+ serait utilisé pour des situations où il peut y avoir une lecture séquentielle sur l'ensemble des données et être capable de parcourir les feuilles. Alors que l'arbre B serait idéal pour des situations d'accès aléatoire?

1 votes

@JDPeckham très curieux(se) de votre question également

42voto

Sharif Points 1387
  1. Dans une recherche B-tree, les clés de recherche et les données sont stockées dans des nœuds internes ou des feuilles. Mais dans un B+-tree, les données sont stockées uniquement dans les feuilles.
  2. La recherche complète d'un B+ tree est très facile car toutes les données se trouvent dans les feuilles. La recherche complète d'un B-tree nécessite un parcours complet.
  3. Dans un B-tree, les données peuvent être trouvées dans les feuilles ou les nœuds internes. La suppression des nœuds internes est très compliquée. Dans un B+ tree, les données se trouvent uniquement dans les feuilles. La suppression des feuilles est facile.
  4. L'insertion dans un B-tree est plus compliquée que dans un B+ tree.
  5. Les B+ trees stockent des clés de recherche redondantes mais les B trees n'ont pas de valeur redondante.
  6. Dans un B+ tree, les données de feuille sont ordonnées comme une liste chaînée séquentielle mais dans un B tree, la feuille ne peut pas être stockée en utilisant 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 B+ tree.

11voto

Charlie Martin Points 62306

Définissez "beaucoup plus rapide". Asymptotiquement, ils sont à peu près les mêmes. Les différences résident dans la manière dont ils utilisent le stockage secondaire. Les articles de Wikipedia sur les arbres B et arbres B+ semblent plutôt fiables.

2 votes

Je suis d'accord avec Charlie. Comme un nœud d'un arbre B 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 consommant du temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X