Arbre B comparé à un arbre R - N'est-ce pas juste un tas de listes liées reliées entre elles?


10

Je connais assez bien un arbre B, je dois principalement garder les bases de données bien alimentées en électricité, en climatisation et en espace disque dur. Je m'associe à une liste chaînée double (doubl [ie, ey]?).

Aujourd'hui, l'un des développeurs au déjeuner a mentionné un arbre R.

J'ai sauté sur Wikipédia et j'ai commencé à lire. Cela ressemblait à un horrible arbre B plus grand. Malheureusement, le fait de ne pas avoir une formation approfondie en mathématiques rend difficile la compréhension de ce dont certains de mes collègues parlent.

J'espérais que quelqu'un pourrait clarifier quelques différences entre un arbre B et un arbre R. Je finirai probablement par demander aux gars de toute façon, mais rien ne garantit qu'ils répondront à ma question. Plus que probablement, ils commenceront à divaguer sur Dieu sait quoi. . .


un BTree n'est certainement pas comme une double liste chaînée. Un arbre permet d'accéder aux opérations log (n) au lieu d'être proportionnelles à n, comme sur les listes.
Javier

@Javier: les nœuds feuilles d'un index b-tree sont généralement une liste doublement liée pour permettre une récupération rapide par les frères et sœurs des nœuds d'index.
Jordan

1
Étant une question purement technique, cela appartient à StackOverflow (veuillez ne pas le republier là-bas cependant, il sera automatisé si suffisamment de personnes votent pour le fermer ici).
Péter Török

1
C'est sur le sujet ici: Programmers.SE est pour les questions de concept sur la programmation. Stack Overflow est pour quand vous avez réellement du code avec lequel vous avez besoin d'aide.

2
@Peter Torok: Sous l'ancien système, cela SERAIT être une question SO. Mais maintenant que ce site existe.
surfasb

Réponses:


7

Un arbre R peut être considéré comme la généralisation d'un arbre b. Lorsqu'un arbre b fournit un accès O (log n) sur une "plage limitée" des clés qu'il contient, un arbre R fournit un accès O (log n) sur une "région dimensionnelle K" des clés qu'il contient.

Si vous souhaitez mapper des codes postaux sur des noms de comté, vous pouvez utiliser un arbre B, car vous pouvez lui demander "Quels sont tous les comtés avec des codes postaux entre 60000 et 61000?" Cependant, un B-Tree serait mal adapté pour cartographier les coordonnées GPS des noms de comté pour des requêtes comme "Quels sont tous les comtés à moins de 100 miles de Chicago?", Car il ne commande ses clés que sur une seule dimension. Un R-Tree décompose ses clés en fonction des boîtes englobantes qui se chevauchent, et c'est donc un moyen naturel de stocker les clés lorsque vous devez interroger sur plusieurs dimensions.


J'aime l'analogie.
surfasb

1
Plus un exemple concret qu'une analogie, c'est exactement comment ces algorithmes d'index sont utilisés.
SingleNegationElimination

6

La plupart des structures arborescentes peuvent être réduites à une forme de liste liée, tant que vous ignorez comment la liste est construite (en particulier, comment les éléments sont ajoutés et supprimés, et comment les nœuds sont rééquilibrés, le cas échéant). C'est essentiellement l'algorithme d'insertion / suppression / récupération qui distingue une structure de données d'une autre.

Les nœuds dans une arborescence R contiennent généralement un cadre de délimitation, qui vous permet d'indexer efficacement les emplacements, comme vous pourriez en avoir besoin si vous souhaitez rechercher des enregistrements "près" d'un emplacement particulier. Les éléments d'un arbre B ont un ordre plus simple; vous pouvez directement comparer si quelque chose est supérieur ou égal à un autre élément. Dans un arbre R, le but de chaque entrée est de déterminer quels éléments sont contenus dans une boîte englobante.

Un B-Tree vous permet de rechercher efficacement des éléments pouvant être commandés dans la mémoire secondaire (comme un disque dur), et un R-Tree vous permet de rechercher efficacement des éléments qui sont "à" ou "près" d'un point particulier ou d'une boîte englobante, également dans la mémoire secondaire.


Il semble que l'arbre R commence à montrer sa distinction à mesure que le nombre d'éléments augmente, n'est-ce pas? Ou est-ce un peu trop simplifié?
surfasb

Je pense qu'étant donné un nombre similaire de nœuds, vous ne verriez pas de différence particulière dans l'utilisation de l'espace, sauf pour le coût linéaire des données de la boîte englobante aux nœuds non foliaires. Mais vous ne pouvez tout simplement pas représenter efficacement les cadres de délimitation dans la définition conventionnelle d'un arbre B, donc vous utiliseriez certainement beaucoup plus d'espace si vous tentiez de représenter des informations spatiales dans un arbre B. L'arbre R est pour les relations spatiales, l'arbre B ne prend en charge que l'ordre à une dimension.
JasonTrue

2
@JasonTrue: En fait, il existe des moyens efficaces de linéariser les boîtes englobantes pour l'indexation B-Tree: en.wikipedia.org/wiki/Geohash . Bien que les hachages soient "efficaces", ils ne sont pas particulièrement pratiques. Une requête de boîte englobante arbitraire prendra probablement 9 requêtes distinctes pour un espace à 2 dimensions, et si la boîte chevauche un axe principal (disons, The International Dateline), le nombre de requêtes peut doubler ou quadrupler et cela devient très lourd à utiliser. Malgré cela, c'est toujours une option lorsque les index linéaires sont le seul type disponible.
SingleNegationElimination
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.