Árbol B en comparación con un árbol R: ¿no es solo un montón de listas vinculadas unidas?

10

Estoy bastante familiarizado con un árbol B, principalmente teniendo que mantener las bases de datos bien alimentadas con electricidad, aire acondicionado y espacio en el disco duro. Me asocio con una lista doble (¿duplicado [es decir, ey]?).

Hoy, uno de los desarrolladores en el almuerzo mencionó un árbol R.

Me subí a Wikipedia y comencé a leer. Parecía horrible como un árbol B más alto. Desafortunadamente, no tener un fondo matemático profundo hace que sea difícil entender de qué están hablando algunos de mis compañeros de trabajo.

Esperaba que alguien pudiera aclarar algunas diferencias entre un árbol B y un árbol R. Probablemente termine preguntando a los chicos de todos modos, pero no hay garantía de que respondan mi pregunta. Es más que probable que empiecen a divagar acerca de que Dios sabe qué. . .

surfasb
fuente
un BTree definitivamente no es como una lista de doble enlace. Un árbol permite el acceso en operaciones log (n) en lugar de proporcional a n, como en las listas.
Javier
@Javier: los nodos hoja de un índice b-tree suelen ser una lista doblemente enlazada para permitir la recuperación rápida entre hermanos de nodos índice.
Jordan
1
Siendo una pregunta puramente técnica, pertenece a StackOverflow (sin embargo, no la vuelva a publicar allí, se automatizará si suficientes personas votan para cerrarla aquí).
Péter Török
1
Esto es sobre el tema aquí: Programmers.SE es para preguntas conceptuales sobre programación. Stack Overflow es para cuando realmente tienes código con el que necesitas ayuda.
2
@ Peter Torok: Bajo el viejo sistema, esto habría sido una pregunta SO. Pero ahora que este sitio existe.
surfasb

Respuestas:

7

Un árbol R puede considerarse como la generalización de un árbol b. Cuando un árbol b proporciona acceso O (log n) sobre un "rango acotado" de las claves que contiene, un árbol R proporciona acceso O (log n) sobre una "región dimensional K" de las claves que contiene.

Si quisiera asignar códigos postales a los nombres de los condados, podría usar un B-Tree, ya que podría preguntar "¿Cuáles son todos los condados con códigos postales entre 60000 y 61000?" Sin embargo, un B-Tree no sería adecuado para asignar coordenadas GPS a los nombres de los condados para consultas como "¿Cuáles son todos los condados dentro de las 100 millas de Chicago?", Ya que solo ordena sus llaves en una sola dimensión. Un R-Tree divide sus claves de acuerdo con los cuadros delimitadores superpuestos, por lo que es una forma natural de almacenar claves cuando necesita consultar en múltiples dimensiones.

SingleNegationElimination
fuente
Me gusta la analogía.
surfasb
1
Más de un ejemplo concreto que una analogía, es exactamente cómo se utilizan estos algoritmos de índice.
SingleNegationElimination
6

La mayoría de las estructuras de árbol pueden reducirse a alguna forma de lista vinculada, siempre que ignore cómo se construye la lista (específicamente, cómo se agregan y eliminan elementos, y cómo se reequilibran los nodos, si corresponde). Es esencialmente el algoritmo de inserción / eliminación / recuperación que distingue una estructura de datos de otra.

Los nodos en un R-Tree generalmente contienen un cuadro delimitador, que le permite indexar ubicaciones de manera eficiente, como podría necesitar si desea buscar registros "cerca" de una ubicación en particular. Los elementos en un B-Tree tienen un orden más simple; puede comparar directamente si algo es mayor o igual que otro elemento. En un R-Tree, el propósito de cada entrada es determinar qué elementos están contenidos en un cuadro delimitador.

Un B-Tree le permite buscar eficientemente los elementos que se pueden pedir en la memoria secundaria (como un disco duro), y un R-Tree le permite buscar eficientemente elementos que están "en" o "cerca" de un punto particular o cuadro delimitador, también en memoria secundaria.

JasonTrue
fuente
Parece que el árbol R comienza a mostrar su distinción a medida que crece el número de elementos, ¿correcto? ¿O es eso un poco demasiado simplificado?
surfasb
Creo que dado un número similar de nodos, no vería una diferencia particular en el uso del espacio, excepto por el costo lineal de los datos del cuadro delimitador en los nodos no hoja. Pero simplemente no puede representar cuadros delimitadores de manera eficiente en la definición convencional de un B-Tree, por lo tanto, ciertamente usaría mucho más espacio si intentara representar información espacial en un B-Tree. El R-Tree es para relaciones espaciales, el B-Tree solo admite el ordenamiento unidimensional.
JasonTrue
2
@JasonTrue: En realidad, hay formas eficientes de linealizar los cuadros delimitadores para la indexación de B-Tree: en.wikipedia.org/wiki/Geohash . Aunque los hashes son "eficientes", no son particularmente convenientes. Es probable que una consulta de cuadro delimitador arbitrario tome 9 consultas separadas para un espacio bidimensional, y si el cuadro se superpone a un eje mayor (por ejemplo, The International Dateline), el número de consultas puede duplicarse o cuadruplicarse y se vuelve muy engorroso de usar. A pesar de esto, sigue siendo una opción cuando los índices lineales son el único tipo disponible.
SingleNegationElimination