B⁺-tree es una estructura de datos basada en un B-tree , un árbol de búsqueda equilibrado con un número variable pero a menudo grande de elementos secundarios por nodo. Un árbol B⁺ consta de una raíz, nodos internos y hojas, la raíz puede ser una hoja o un nodo con dos o más hijos.
Inicialmente, la estructura estaba destinada a almacenar datos para una búsqueda eficiente en un entorno de almacenamiento orientado a bloques, en particular, para sistemas de archivos; La aplicación se debe al hecho de que, a diferencia de los árboles de búsqueda binarios, los árboles B⁺ tienen un factor de ramificación muy alto (el número de punteros de un nodo padre a los hijos suele ser del orden de 100 o más), lo que reduce el número de Operaciones de E/S que requieren buscar un elemento en el árbol.
Una variante del árbol B⁺, en la que todos los valores se almacenaban en nodos de hoja, se revisó sistemáticamente en 1979 [1] , y se señaló que IBM ha utilizado tales estructuras en la tecnología de acceso a archivos de mainframe VSAM desde al menos 1973.
La estructura se usa ampliamente en sistemas de archivos: NTFS , ReiserFS , NSS , XFS , JFS , ReFS y BFS usan este tipo de árbol para indexar metadatos; BeFS también usa árboles B⁺ para almacenar directorios. Los sistemas de administración de bases de datos relacionales como DB2 , Informix , Microsoft SQL Server , Oracle Database (desde la versión 8), Adaptive Server Enterprise y SQLite admiten este tipo de árbol para índices de tablas. Entre los DBMS NoSQL que trabajan con el modelo clave-valor, la estructura de datos se implementa para el acceso a datos en CouchDB , MongoDB (cuando se usa el subsistema de almacenamiento WiredTiger ) y Tokyo Cabinet .
Un árbol B⁺ es un árbol de búsqueda de orden (o grado) balanceado que satisface las siguientes propiedades:
La construcción de un árbol B⁺ puede requerir la reconstrucción de la estructura intermedia, esto se debe al hecho de que el número de claves en cada nodo (excepto la raíz) debe ser de a donde es el grado (u orden) del árbol. Cuando intenta insertar la tecla ( )-ésima en el nodo, es necesario separar este nodo; la tecla ( )-ésima, que se coloca en el nivel adyacente del árbol, actúa como la tecla separadora de las ramas formadas . Un caso especial es la división de la raíz, ya que en este caso aumenta el número de niveles del árbol. Una característica de dividir una hoja de un árbol B⁺ es que se divide en partes desiguales. Dividir un nodo interno o raíz da como resultado nodos con el mismo número de claves. Dividir una hoja puede causar una "reacción en cadena" de nodos divididos, que terminan en la raíz.
La raíz del árbol B⁺ es el punto de partida para todo el rango de valores, en el que cada nodo interno es un subintervalo.
Por ejemplo, digamos que necesitamos encontrar el valor de una clave en un árbol B⁺. Para hacer esto, buscamos un nodo hoja que contenga el valor En cada nodo interno, necesitamos averiguar qué nodo secundario posterior seguir, el nodo interno del árbol B⁺ tiene como máximo hijos, donde cada uno de ellos representa un subintervalo separado. El nodo apropiado se selecciona buscando en los valores clave del nodo:
Función : buscar ( k ) return tree_search ( k , root ); Función : tree_search ( k , nodo ) si el nodo es una hoja , devuelve el nodo ; switch k do case k < k [ 0 ] return tree_search ( k , p [ 0 ]); case k [ i ] ≤ k < k [ i + 1 ] return tree_search ( k , p [ i + 1 ]); case k [ d ] ≤ k return tree_search ( k , p [ d + 1 ]);(Este pseudocódigo asume que se ignoran los duplicados).
Para agregar una nueva clave o una nueva entrada, primero debe encontrar el nodo donde desea agregarlos. En este caso, el algoritmo es:
Los árboles B, a diferencia de los árboles B⁺, se expanden desde el lado de la raíz, no desde las hojas.
Para eliminar una clave o entrada, primero debe encontrar el nodo de hoja en el que reside. Algoritmo para eliminar de un nodo hoja:
La unión puede extenderse hasta la raíz, en cuyo caso la altura del árbol disminuye.
La complejidad computacional de cada operación en el peor de los casos: donde es el orden del árbol o el factor de ramificación; es el número de elementos en el árbol de ramas en los nodos del árbol.
Árbol (estructura de datos) | |
---|---|
Árboles binarios | |
Árboles binarios autoequilibrados |
|
árboles B |
|
árboles de prefijo |
|
Partición binaria del espacio | |
Árboles no binarios |
|
Rompiendo el espacio |
|
Otros árboles |
|
Algoritmos |