Arboles B - 1.0
Arboles B - 1.0
Como se ve, se puede tener varios índices a la vez sobre el mismo archivo,
organizando a cada índice por un atributo de búsqueda diferente, sin tocar
la estructura del archivo original, y sin que esos índices dependan el uno del
otro...
Si bien en la gráfica mostramos a cada índice como un árbol binario, está claro
que en la práctica un índice para un archivo debe cumplir ciertos requisitos
esenciales, pues de otro modo el proceso de indexación fallaría o no tendría un
tiempo de búsqueda aceptable. Por lo pronto, el árbol de búsqueda no debería
ser binario: si el archivo a indexar tiene una gran cantidad de registros (lo
cual en la práctica es lo común...) entonces el árbol tendría demasiados
niveles y por lo tanto su altura sería también grande. Aún cuando se supone que el
árbol implementa algún mecanismo de equilibrado, una gran altura va en
contra de un tiempo aceptable de búsqueda.
Y por otra parte, parece obvio que el árbol no debería organizarse en
memoria principal: si el archivo es muy grande el índice podría no entrar en
memoria, y aún si entra podría no quedar lugar para otros índices que se
requieran para ese achivo.
Hasta 1972 no se había ideado una estructurade índice que realmente fuera
eficiente en el acceso rápido a archivos. Las diversas técnicas de equilibrado de
árboles clásicas (como los árboles AVL), eran claramente insuficientes para
indexar grandes archivos. Pero entonces algo cambió.
2.)Arboles B.
En 1972, dos desarrolladores llamados R. Bayer y E. McCreight, trabajando
para la Boeing Corporation, publicaron un artículo (con el título de "Organization
and Maintenance of Large Ordered Files") en el número 1 de la revista
especializada Acta Informática que pasaría a la historia como el artículo de
presentación de los Arboles B. Dos o tres décadas más tarde, los árboles B eran
ya el estándar indiscutido en cuanto a soporte de índices para acceso rápido a
grandes archivos de registros. El contenido de la publicación original de
estos dos autores, se anexa en un documento pdf adjunto a esta ficha.
Un árbol B es esencialmente un árbol de búsqueda multicamino (n-ario)
balanceado, almacenado en disco, y usado como soporte muy eficiente para
índices de grandes archivos. Garantiza un tiempo de búsqueda de orden
logarítmico, al mismo tiempo que logra un muy buen balance en cuanto al
uso del espacio de almacenamiento del índice. Hoy en día los árboles B
están en el corazón de todos los sistemas de indexación de bases de
datos comerciales, aunque en forma de variantes respecto del planteo
original de Bayer y McCreight.
Anecdóticamente, digamos que sus creadores nunca dijeron porqué llamaron B al
árbol B... Se ha especulado con que esa B viene de balanceado.
Otrasespeculaciones sugieren que la B es una especie de propaganda subliminal
a la firma Boeing para la que ambos trabajaban. Y muchos directamente han
asumido que la B es por Bayer, llegando incluso a designar como árboles de
Bayera los árboles B... Pero si bien esto último parece un justo tributo a R. Bayer,
la pregunta que nos hacemos es: ¿qué hubo de McCreight en ese caso?
Como se dijo, un árbol B es un árbol de búsqueda de caminos múltiples. Esto
implica que cada nodo del árbol puede tener varios hijos, y a su vez implica
que cada nodo puede tener varias claves o valores (de hecho, la forma típica de
implementar el conjunto de claves de un nodo es a través de un arreglo
ordenado). En el léxico propio de los árboles B, un nodo se designa como página.
La idea central es que un árbol B se graba en un archivo (el archivo índice) página
por página. Cuando el índice se abre, se carga en memoria la página raiz del
árbol, y sólo la página raiz. La clave deseada se busca en esa página, y si
está en ella se detiene el proceso (que en este caso sólo llevó una operación de
acceso a disco). Si la clave no está, se determina en cuál de las hijas de la raiz
debería estar, y se carga esa página. Otra vez, se busca la clave, y así se
prosigue, de forma que la raiz siempre esté en memoria y cada nueva página que
se carga reemplace a la última cargada. Si la cantidad de claves que se
almacena en cada página es adecuada, veremos que se puede garantizar
que un árbol B encontrará la clave (o verá que no existe) en no más de dos
accesos directos (seeking) a disco incluso si el archivo tiene un número tan
desopilante como un millón de registros...
Las características estructurales de un árbol B se resumen en cuatro reglas,
que enunciamos:
i.)Sea n un parámetro que designaremos como el orden del árbol. Entonces
cada página del árbol (salvo eventualmente la página raiz) debe tener un mínimo
de n claves en todo momento.
ii.)El número máximo de claves que una página puede tener es 2*n.
iii.)Hay sólo dos tipos de páginas: las hojas (que no tienen hijos) y las
páginas que tienen exactamente m + 1 páginas hijas, siendo m el número de
claves que efectivamente hay en esa página.
iv.)Todas las páginas hoja deben aparecer juntas en el mismo nivel (que no puede
ser otro que el último nivel... como es obvio...).
Estas cuatro reglas indican en forma taxativa lo que se puede y no se puede hacer
al ir formando un árbol B. Veremos a continuación, que cada una de ellas
cumple un papel importante en cuanto al proceso de auto-balanceo del
árbol: al igual que un árbol AVL, los árboles B insertan una clave y luego
verifican si esa inserción provocó algún tipo de desbalance, procediendo a
restaurar el equilibrio si fuera el caso.Supongamos que se quiere mostrar la forma
en que va creciendo un árbol B de orden 2 (n=2)a medida que se insertan
claves.
Supongamos que el árbol arranca vacío, y que se quieren insertar las
siguientes primeras cuatro claves: 10, 20, 40 y 30. Como el árbol está
vacío, no contiene ninguna página aún. Debemos crear la página raiz
entonces. La regla ii) nos dice que debemos prever lugar máximo para 2*n claves
= 4 claves. Lo común es dibujar cada página como si fuera un arreglo de tamaño
2*n. Las claves que se insertan (al igual que en un árbol de búsqueda común)
se insertan como parte de una hoja, y dentro de la hoja huésped se
almacenan ordenadas de menor a mayor. La raiz quedaría así luego de
crearla e insertar las primeras cuatro claves citadas (note que la regla i exige
que una página siempre tenga al menos n = 2 claves, pero la raiz está
exenta de esa regla: de otro modo, nunca podríamos tener un árbol B vacío o
con menos de nclaves cuando recién se crea...)
Supongamos que ahora queremos insertar la clave x = 25. La única página que
tiene el árbol ya no tiene lugar para una nueva clave, por lo tanto debemos crear al
menos una página nueva. Sin embargo, no podemos crear páginas de cualquier
forma... Las reglas estructurales del árbol sugieren que hay sólo una forma
de hacerlo: suponga que x = 25 realmente pudo insertarse. En ese caso, la
secuencia ordenada quedaría así:
Puede verse que ahora el número de claves es impar (2*n + 1 claves) y por lo
tanto el valor del medio de la secuencia es la mediana de la misma. Lo que se
hace es tomar el valor mediano, y promoverlo a la página que estuviera en el
nivel superior de esta que fue rebalsada. Si no hubiera ninguna página en
el nivel superior (pues la página rabalsada es la raiz) entonces se crea una
nueva raiz que sólo contendrá al valor promovido (el 25 en nuestro caso). Pero
en la página original quedan exactamente 2*n claves, tales que la mitad son
menores que el promovido y la otra mitad son mayores... se arman dos
páginas con esos valores, que quedarán como hijas de la raiz:
Como se ve, en el árbol resultante se cumplen todas las reglas: las dos
páginas hoja están juntas en el último nivel. Ninguna página (salvo la raiz) tiene
menos de n = 2 claves. Y la única página que tiene hijos, tiene exactamente 2
hijos, los cual es igual al número m de claves que tiene esa página (la raiz, con
m = 1 clave efectivamente contenida) más uno.
Note que el árbol ha crecido un nivel: de altura h = 1 mientras sólo tenía cuatro
claves, pasó a tener altura h = 2 con la quinta clave. Veremos que en el único
caso en que el árbol gana alturaes cuando se parte la raiz (lo que ocurrió en este
caso...)
Supongamos que ahora se quieren insertar las claves 5, 15 y 23. Las claves
entran por la raiz, y bajan por el árbol buscando una hoja con lugar libre para
insertarse. Las claves 5 y 15 no tendrán problemas, pero la clave 23 provocará
un desborde de la página izquierda del 25:
Observe que se partió una página pero el árbol no ganó altura: el impacto del
quiebre de la página fue absorbido "a lo ancho" en el árbol (lo cual no produce
merma en el rendimiento de una búsqueda: mientras no crezca la altura, el
crecimiento horizontal no es problema). Podemos decir entonces que los
árboles B son muy estables en cuanto a su crecimiento en altura: debe
quebrarse la raiz para que la altura crezca, pero ese acontecimiento depende que
primero se quiebre una larga serie de páginas inferiores antes de provocar el
La solución: se crea una nueva raiz con el 45. El árbol crece un nivel, y las
páginas se reparten así:
En nuestro modelo hemos supuesto que el orden n del árbol es 2, y eso
sirve a los efectos didácticos. Pero en la práctica, el orden del árbol se elige de
forma tal que cadapágina pueda tener un número alto de claves: De hecho, se
suele hacer que el orden elegido garantice que el tamaño final en bytes de una
página sea un múltiplo de 512, de forma que el tamaño de una página coincida o
sea múltiplo del factor de paginación usado por el sistema operativo
huésped: de esta forma, se aprovecha al máximo la capacidad de lectura y
grabación del sistema.
Note que si el orden del árbol es n = 500, entonces una página puede tener hasta
1000 claves. Si la raiz tiene 1000 claves, deberá tener 1001 páginas hijas que
pueden a su vez tener hasta 1000 claves cada una... Eso implica que el árbol
podrá contener un millón de claves... en sólo dos niveles de árbol. En la práctica,
la página raiz está siempre en memoria mientras el índice está abierto (sólo se
accede a disco para cargarla la primera vez, cuando el índice se abre). Por
lo tanto, encontrar una clave requerirá como máximo dos operaciones de
acceso directo a disco (que en la práctica es sólo una... pues dijimos que
la raiz sólo se levanta de disco una vez, al principio...).
Esa notable eficiencia se ve incrementada con otras características destacables: la
regla iestructural del árbol garantiza que al ir a disco a buscar una página,
esa página tendrá un número razonable de claves (50% llena) que haga que
valga la pena la pérdida de tiempo de ir al disco a buscarla. Y la regla ii nos
protege de la posibilidad de levantar una página tan llena de claves que no
quepa en memoria. La regla iii garantiza que no iremos a disco nunca a
buscaruna página vacía. Y la iv es la que finalmente fuerza a que el árbol
se mantenga siempre en equilibrio, y se expanda hacia lo ancho en lugar de
hacerlo hacia arriba.
Bibliografía:
Deitel, H.,Deitel, P. (2005 o posterior). "Java Cómo Programar" . México:
Prentice Hall. ISBN: 970-26-0518-0 [disponible en biblioteca del
Departamento de Sistemas]
https://es.wikipedia.org/wiki/%C3%81rbol-B#/media/Archivo:B-
tree_example.svg
https://es.wikipedia.org/wiki/%C3%81rbol-B
https://www.google.com/search?
q=Arbol+B+trabajo+completo+de+Investigacion&rlz=1C1SQJL_es__829__
829&oq=Arbol+B+trabajo+completo+de+Investigacion&aqs=chrome..69i57.
13487j0j7&sourceid=chrome&ie=UTF-8
https://www.buenastareas.com/ensayos/Arboles-b/24957866.html
https://www.google.com/search?
q=Arbol+B+trabajo+completo+de+Investigacion&rlz=1C1SQJL_es__829__
829&oq=Arbol+B+trabajo+completo+de+Investigacion&aqs=chrome..69i57.
13487j0j7&sourceid=chrome&ie=UTF-8
https://www.academia.edu/7420315/Arboles_B
https://es.wikipedia.org/wiki/%C3%81rbol-
B#/media/Archivo:Arbolbelimnodom.jpg
http://decsai.ugr.es/~jfv/ed1/tedi/cdrom/docs/arb_B.htm
https://estructurasite.wordpress.com/arbol-2/
https://sites.google.com/site/clasearbolesb/arboles-b
https://prezi.com/ouwn09j4gcjs/arboles-b/
https://studylib.es/login
https://es.wikipedia.org/wiki/%C3%81rbol-B