Iniciamos el tutorial dedicado a los árboles multicamino, también conocidos como B-Tree y sus variantes como B+ Tree. Son estructuras pensadas para discos y SSD, donde se prioriza reducir accesos a bloques completos en lugar de optimizar rotaciones individuales como en los árboles binarios.
Trabajaremos en C y usaremos ejemplos sencillos que ponen el foco en la organización por páginas, el reparto de claves y la altura logarítmica que se mantiene sin rotaciones. Este primer tema explica por qué existen, cómo se diferencian de los BST y AVL, y dónde se aplican en la práctica.
Un árbol B es un árbol de búsqueda de más de dos hijos (multicamino) que asegura que todas las hojas están a la misma profundidad. Cada nodo almacena varias claves ordenadas y tiene punteros a sus hijos, también ordenados entre esas claves.
typedef struct BTreeNode {
int *claves; // Arreglo ordenado de claves
struct BTreeNode **hijos; // Punteros a subarboles
int cuenta; // Cantidad actual de claves
int esHoja; // 1 si es hoja, 0 si es interno
int orden; // Grado minimo t (define tamanos de nodo)
} BTreeNode;
El esqueleto anterior muestra la idea central: un nodo almacena arreglos de claves y de hijos en lugar de un par de punteros como en un árbol binario. La variable orden se usa para validar cuándo dividir o fusionar nodos.
Los discos y SSD leen por bloques; acceder a disco es mucho más costoso que procesar varias comparaciones en memoria. Los árboles multicamino explotan esto almacenando muchas claves por nodo, alineando cada nodo con el tamaño de bloque.
La idea general es pagar algunas comparaciones extra dentro de un nodo a cambio de menos viajes al medio de almacenamiento.
Un BST y un AVL son binarios: cada nodo tiene dos hijos y a lo sumo una clave. Los árboles B trabajan distinto:
O(log n) en número de nodos, pero el logaritmo se toma respecto al orden del árbol (menos niveles que un binario).Los árboles multicamino surgieron para mejorar los índices en almacenamiento secundario y siguen siendo la opción de facto:
Con esta base ya podemos profundizar en el orden del árbol, la definición exacta de los límites de claves y cómo se implementa cada operación.