Está en la página 1de 17

1

rboles B+

Definicin

Un rbol B+ permite aceder a una estructura de datos, aleatoria y
secuencialmente. Recurdese que un rbol B puede aceder datos
aleatoriamente, pero se perde gran cantidad de tiempo subiendo y bajando
por el rbol cuando se necesita una acceso secuencial. Un ndice de rbol B+
es un ndice multicamino, pero con una estructura que difiere ligeramente del
ndice multinivel de un archivo secuencial. La pginas de un rbol B+ son
distintas si se trata de una pgina interior a si estamos frente a las pginas
hoja. Pueden contener hasta m-1 claves de bsqueda K
1
,K
2
,...,K
m-1
y m
punteros P
1
,P
2
,...,P
m
. Como en los rboles B, los valores de la clave de
bsqueda de un nodo se mantienen ordenados; as, si i<j, entonces K
i
<K
j
. La
figura-1 muestra un nodo tpico de un rbol B+.







Nodos Hoja

Consideraremos primero la estructura de los nodos hoja. Para
i=1,2,...,m-1, el puntero P
i
apunta a un puntero que apunta a un
registro del archivo con valor de la clave de bsqueda K
i
. El puntero P
n

tiene un propsito especial que discutiremos ms adelante.

En la figura-2 se muestra un nodo hoja en el rbol B+ de un supuesto
archivo cuenta, donde el orden del rbol es n=1 y la clave de bsqueda es
nombre-sucursal, los punteros en el nodo hoja apuntan directamente al
archivo.














P
1
K
1
P
2 P
n-1
K
n-1
P
n
Figura-1. Nodo tpico de un rbol B+
Figura-2. Nodo hoja para el ndice del rbol B+ de cuenta

Barcelona

Daimiel

Barcelona
Daimiel
Daimiel

C-212
C-101
C-110

112.000
80.000
90.000

Archivo cuenta
Nodo hoja
2


Ahora que se ha visto la estructura de un nodo hoja, consideraremos cmo
los valores de la clave de bsqueda se asignan a nodos concretos. Cada hoja
puede guardar hasta 2n valores. Est permitido que los nodos hoja contengan
al menos n valores. Los rangos de los valores en cada hoja no se solapan.
As, si L
i
y L
j
son nodos hoja e i<j, entonces cada valor de la clave de
bsqueda en L
i
es menor que cada valor de la clave en L
j
. Si el ndice de rbol
B+ es un ndice denso, cada valor de la clave de bsqueda debe aparecer en
algn nodo hoja.

Ahora se puede explicar el uso del puntero P
n
. Dado que existe un orden
lineal en las hojas basado en los valores de la clave de bsqueda que
contienen, se usa P
n
para encadenar juntos los nodos hoja en el orden de la
clave de bsqueda. Esta ordenacin permite un procesamiento secuencial
eficaz del archivo.

Nodos Internos

Los nodos internos del rbol B+ forman un ndice multinivel (disperso)
sobre los nodos hoja. La estructura de los nodos internos es la misma que la
de los nodos hoja, excepto que todos los punteros son punteros a nodos del
rbol. Un nodo interno podra guardar hasta 2n+1 punteros y debe guardar al
menos n+1 punteros. El nmero de punteros de un nodo se llama grado de
salida del nodo.

Consideremos un nodo que contiene m punteros. Para i=2,3,..,m, el puntero
P
i
apunta al subrbol que contiene los valores de la clave de bsqueda
menores que K
i
y mayor o igual que K
i-1
. El puntero P
m
apunta a la parte del
subrbol que contiene los valores de la clave mayores o iguales que K
m
, y el
puntero P
1
apunta a la parte del subrbol que contiene los valores de la clave
menores que K
1
.

El requisito de que cada nodo interno mantenga al menos m punteros se
impone en todos los niveles del rbol, excepto en la raz. En la figura-3 se
muestra un rbol B+ completo para el archivo cuenta (m=3). Por simplicidad,
se omiten los punteros al propio archivo y los punteros nulos. Como un
ejemplo de un rbol B+ en el cual la raz debe tener menos de n valores, en
la figura-4 se muestra un rbol B+ para el archivo cuenta con m=5. Para
cualquier valor de m, siempre es posible construir un rbol B+ cuyos nodos
internos contengan al menos m punteros.








3


































En todos los ejemplos mostrados de rboles B+, stos estn equilibrados. Es
decir, la longitud de cada camino desde la raz a cada nodo hoja es la misma.
Esta propiedad es un requisito de los rboles B+. De hecho la B en el rbol
B+ proviene del ingls balanced (equilibrado). Es esta propiedad de
equilibrio de los rboles B+ la que asegura un buen rendimiento para las
bsquedas, inserciones y borrados.

CONSULTAS CON RBOLES B+

Se considera ahora cmo procesar consultas usando rboles B+.
Supongamos que se desea encontrar todos los registros cuyo valor de la clave
de bsqueda sea k. Primero se examina el nodo raz para buscar el menor
valor de la clave de bsqueda mayor que k. Supongamos que este valor de la
clave de bsqueda es K
i
. Seguimos el puntero P
i
hasta cierto nodo. Si K<K
1
,
entonces seguimos P
1
hasta otro nodo. Si se tienen m punteros en el nodo y
K < K
m-1
, entonces se sigue P
m
hasta otro nodo. Una vez ms se busca el
Barcelona Madrid

Daimiel Pamplona Reus

Ronda

Pamplona

Figura-3. rbol B+ para el archivo cuenta (m=3)

Reus

Madrid

Barcelona Madrid

Daimiel Pamplona

Reus

Ronda

Pamplona
Figura-4. rbol B+ para el archivo cuenta (m=5)
4
menor valor de la clave de bsqueda que es mayor que k para seguir el
puntero correspondiente. Finalmente se alcanza un nodo hoja, cuyo puntero
apunta al registro deseado.

Nmero de Accesos

De esta manera, para procesar una consulta se tiene que recorrer un
camino en el rbol desde la raz hasta algn nodo hoja. Si hay K valores de la
clave de bsqueda en el archivo, este camino no ser ms largo que log
n
(K).

En la prctica slo se accede a unos cuantos nodos. Generalmente un nodo
se construye para tener el mismo tamao que un bloque de disco, el cual
ocupa normalmente 4 Kb. Con una clave de bsqueda del tamao de 12
bytes y un tamao del puntero a disco de 8 bytes, n est alrededor de 200.
Incluso con una estimacin ms conservadora de 32 bytes para el tamao de
la clave de bsqueda, n est entorno a 100. Con n=100, si se tiene un milln
de valores de la clave de bsqueda en el archivo, una bsqueda necesita
solamente log
50
(1.000.000) =4 accesos a nodos. Por tanto, se necesita leer a
lo sumo cuatro bloques del disco para realizar la bsqueda. Normalmente, el
nodo raz del rbol es al que ms se accede y por ello se guarda en una
memoria intermedia; as solamente se necesitan tres o menos lecturas del
disco.

Diferencias con los rboles Binarios

Una diferencia importante entre las estructuras de rbol B+ y los
rboles en memoria, tales como los rboles binarios, est en el tamao de un
nodo y por tanto la altura del rbol. En un rbol binario, cada nodo es
pequeo y tiene a los sumo dos punteros. En un rbol B+, cada nodo es
grande normalmente un bloque del disco- y un nodo puede tener un gran
numero de punteros. As los rboles B+ tienden a ser bajos y anchos, en
lugar de los altos y estrechos rboles binarios. En un rbol equilibrado, el
camino de una bsqueda puede tener una longitud de log
2
(K), donde K es el
nmero de valores de la clave de bsqueda. Con K=1.000.000, como en el
ejemplo anterior, un rbol binario equilibrado necesita alrededor de 20
accesos a nodos. Si cada nodo estuviera en un bloque del disco distinto,
seran necesarias 20 lecturas a bloques para procesar la bsqueda, en
contraste con las cuatro lecturas del rbol B+.










TYPE
TArbolBMas=^TNodo;
TNodo=RECORD
NumClaves:Integer;
Claves:ARRAY[1..2N] OF TClave;
Posicion:ARRAY[1..2N] OF TPosicion;
Descendientes:ARRAY[1..2N+1] OF TArbolBMas;
Siguiente:TArbolBMas;
END;
Estructura rbol B+
5
















































NBloque que contiene el nodo raz del rbol B+;
Leer bloque N;
Mientras (N no sea nodo hoja) hacer
Comenzar
Si K < N.K
1
(*i-simo valor dentro del array de Claves*)
Entonces NN.D
1
(*i-simo apuntador de Descendientes*)
En caso contrario Si K N.K
NumClaves

Entonces NN.D
NumClaves+1

En caso contrario
Comenzar
Buscar en el nodo N una entrada i tal que N.K
i-1
<K[N.K
i
;
NN.D
i+1

Terminar;
Leer Bloque N
Terminar;
Buscar en el bloque N la entrada (K
i
,P
i
) con K=K
i
; (*Buscar en el nodo hoja*)
Si se encuentra
Entonces Leer el bloque del archivo de datos con direccin P
i+1
y
obtener el registro (*P
i+1
, posicin dentro del fichero de datos*)
En caso contrario
El valor K no est en el archivo de datos;

Algoritmo de bsqueda
PROCEDURE Buscar (ArbolBMas:TArbolBMas;K:TClave;VAR Registro:TRegistro);
VAR
Encontrado:Boolean;
Nodo:TArbolBMas;
i:Integer;
BEGIN
Nodo:=ArbolBMas;
WHILE Nodo.Descendietes[1]<>NIL DO
BEGIN
IF K<Nodo.Clave[1] THEN Nodo:=Nodo.Descendientes[1]
ELSE IF KNodo.Clave[NumClaves] THEN
Nodo:=Nodo.Descendientes[NumClaves+1]
ELSE BEGIN
i:=2;
WHILE Nodo[i]<K DO i:=i+1;
Nodo:=Nodo.Descendientes[i+1]
END;
END;
Encontrado:=FALSE;
i:=1;
WHILE (i[NumClaves) AND (NOT Encontrado) DO
IF Nodo.Claves[i]=K THEN Encontrado:=TRUE
ELSE i:=i+1;
IF Encontrado THEN
LeerRegistro(FicheroDatos,Nodo.Posicion[i+1],Registro);
END;
Procedimiento Buscar
6

Actualizaciones en rboles B+

El borrado y la insercin son ms complicados que las bsquedas, ya que
podra ser necesario dividir un nodo que resultara demasiado grande como
resultado de una insercin, o combinar nodos si un nodo se volviera
demasiado pequeo (menor que n claves). Adems, cuando se divide un
nodo o se combinan un par de ellos, se debe asegurar que el equilibrio del
rbol se mantiene. Para presentar la idea que hay detrs del borrado y la
insercin en un rbol B+, asumiremos que los nodos nunca sern demasiado
grandes ni demasiado pequeos. Bajo esta suposicin, el borrado y la
insercin se realizan como se indica a continuacin.

Insercin. Usando la misma tcnica que para buscar, se busca un
nodo hoja donde tendra que aparecer el valor de la clave de
bsqueda. Si el valor de la clave de bsqueda ya aparece en el nodo
hoja, se inserta un nuevo registro en el archivo. Si el valor de la clave
de bsqueda no aparece, se inserta el valor en el nodo hoja de tal
manera que las claves de bsqueda permanezcan ordenadas. Luego
insertamos el nuevo registro en el archivo.

Borrado. Usando la misma tcnica que para buscar, se busca el
registro a borrar y se elimina del archivo y se borra el valor de la clave
de bsqueda del nodo hoja.

Divisin de pginas tras una insercin

Pasamos ahora a considerar un ejemplo en el que se tiene que dividir
un nodo al no ser posible el requilibrio. Por ejemplo, queremos insertar un
registro en el rbol B+ de la figura-3, cuyo valor de nombre-sucursal es
Cdiz. Usando el algoritmo de bsqueda, Cdiz debera aparecer en el
nodo que incluye Barcelona y Daimiel. No hay sitio para insertar el valor
de la clave de bsqueda Cdiz. Por tanto, se divide el nodo en otros dos
nodos. En la figura-5 se muestran los nodos hoja que resultan de insertar
Cdiz y de dividir el nodo que inclua Barcelona y Daimiel. En general,
si tenemos m valores de la clave de bsqueda (los m-1 valores del nodo hoja
ms el valor a insertar), pondremos m/2 en el nodo existente y el resto de
valores en el nuevo nodo.









Figura-5. Divisin del nodo hoja tras la insercin de Cdiz
Barcelona Daimiel

Cdiz

7
Para dividir un nodo hoja hay que insertar un nuevo nodo hoja en el rbol
B+. En el ejemplo, el nuevo nodo tiene a Daimiel como el valor ms
pequeo de la clave de bsqueda. Luego hay que insertar este valor de la
clave de bsqueda en el padre del nodo hoja dividido. En el rbol B+ de la
figura-6 se muestra el resultado de insercin. El valor Daimiel de la clave
de bsqueda se ha insertado en el padre. Ha sido posible llevar a cabo esta
insercin porque haba sitio para aadir un valor de la clave de bsqueda. Si
no hubiera sitio, se tendra que dividir el padre. En el peor de los casos, todos
los nodos en el camino hacia la raz se tendran que dividir. Si la propia raz se
tuviera que dividir, el rbol sera ms profundo.

La tcnica general para la insercin en un rbol B+ es determinar la pgina
hoja h en la cual realizar la insercin. Si es necesario dividir, se inserta la
nueva pgina dentro del padre de la pgina h. Si esta insercin produce otra
divisin procederamos recursivamente o bien hasta que una insercin no
produzca otra divisin o bien hasta crear una nueva raz.

En la figura-7 se bosqueja el algoritmo de insercin en seudo cdigo. En el
seudo cdigo L.K
i
y L.P
i
denotan al i-simo valor y el i-simo puntero en la
pgina L, respectivamente. El seudo cdigo tambin hace uso de la funcin
padre(L) para encontrar el padre del nodo L. Se puede obtener una lista de
los nodos en el camino de la raz a la hoja mientras buscamos el nodo hoja
para usarlos despus a la hora de encontrar eficazmente el padre de
cualquier nodo del camino. El seudo cdigo hace referencia insertar una
entrada (V, P) en una pgina. En el caso de nodos hoja, realmente el puntero
a una entrada precede al valor de la clave, de tal manera que efectivamente
se almacena P en el nodo hoja precediendo a V. Para los nodos internos, se
almacena P justo despus de V.




















Figura-6. I nsercin de Cdiz en el rbol B+ de la Figura-3
Barcelona Daimiel

Cdiz

Pamplona

Reus

Ronda

Madrid

Pamplona

Reus

Daimiel Madrid
8


NBloque que contiene el nodo raz del rbol B+;
Leer bloque N;
Ajustar la pila S a vaca;
Mientras (N no sea nodo hoja) hacer
Comenzar
Apilar la direccion de N en la pila S;
(*La pila S contiene los nodos padre que se requerirn en caso de haber
divisin*)
Si K < N.K
1
(*i-simo valor dentro del array de Claves*)
Entonces NN.D
1
(*i-simo apuntador de Descendientes*)
En caso contrario Si K N.K
NumClaves

Entonces NN.D
NumClaves+1

En caso contrario
Comenzar
Buscar en el nodo N una entrada i tal que N.K
i-1
<K[N.K
i
;
NN.D
i+1

Terminar;
Leer Bloque N
Terminar;
Buscar en el bloque N la entrada (K
i
,P
i
) con K=K
i
; (*Buscar en el nodo hoja*)
Si se encuentra
Entonces el registro ya est en el archivo: imposible insertar

Figura-7. Algoritmo de insercin - I


9

En caso contrario
Comenzar
Crear la entrada (K,P) donde P apunta al nuevo registro;
Si el nodo hoja N no est lleno
Entonces insertar (K,P) en la posicion correcta dentro de N

En caso contrario
Comenzar
Copiar N en Temp (* Temp es un nodo auxiliar en el que cabe
una clave adicional*)
Insertar (K,P) en Temp en la posicion correcta;
Nuevo Un nuevo nodo vaco para el rbol;
j(NumClaves)/2;
NPrimeras entradas de Temp, hasta (K
j
,P
j
);
NuevoEntradas siguientes de Temp
Nuevo.SiguienteN.Siguiente;
N.SiguienteNuevo;
KNuevo[1];
(*Hay que subir K al nodo padre*)
TerminamosFalso
Repetir
Si la pila S est vaca entonces (*no hay nodo padre*)
Comenzar (*hay que crear un nodo raz*)
Razun nuevo nodo interno vaco para el rbol
Raz<N,K,Nuevo>
TerminamosVerdadero
Terminar
En caso contrario
Comenzar
NSacar de la pila S;
Si N no est lleno entonces
Comenzar
Insertar(K,Nuevo) en la posicion correcta de N;
TerminamosVerdadero;
Terminar
En caso contrario
Comenzar
Copiar N en Temp;
Insertar (K,Nuevo) en Temp en la posicion
correcta;
NuevoUn nuevo nodo vaco;
j(NumClaves)/2;
NEntradas hasta el apuntador P
j
de Temp;
(*contiene <P
1
,K
1
,P
2
,K
2
,...,K
j-1
,P
j
>*)
NuevoEntradas desde P
j+1
de Temp;
KK
j
;
Terminar
Terminar
Hasta Terminamos
Terminar;
Terminar;
Figura-7. Algoritmo de insercin - I I

10
















































PROCEDURE Insertar (VAR ArbolBMas:TArbolBMas;K:TClave);
VAR
Encontrado,Terminamos:Boolean;
Nodo,Nuevo:TArbolBMas;
Temp:TArbolBMas1; (*Tiene capacidad para una clave ms*)
i,j,Medio:Integer;
BEGIN
Nodo:=ArbolBMas;
VaciarPila(S);
WHILE Nodo.Descendietes[1]<>NIL DO
BEGIN
Apilar (S,Nodo);
IF K<Nodo.Clave[1] THEN Nodo:=Nodo.Descendientes[1]
ELSE IF KNodo.Clave[NumClaves] THEN
Nodo:=Nodo.Descendientes[NumClaves+1]
ELSE BEGIN
i:=2;
WHILE Nodo[i]<K DO i:=i+1;
Nodo:=Nodo.Descendientes[i+1]
END;
END;
Encontrado:=FALSE;
i:=1;
WHILE (i[NumClaves) AND (NOT Encontrado) DO
IF Nodo.Claves[i]=K THEN Encontrado:=TRUE
ELSE i:=i+1;
IF Encontrado THEN
Writeln(La clave ya existe: Imposible insertar)
ELSE BEGIN
IF Nodo.NumClaves<Orden THEN
InsertarEnNodo(Nodo,K)
ELSE BEGIN
FOR i:=1 TO Nodo.NumClaves DO
BEGIN
Temp.Claves[i]:=Nodo.Claves[i];
Temp.Posicion[i]:=Nodo.Posicion[i];
END;
Temp.NumClaves:=Nodo.NumClaves;
InsertarEnNodo(Temp,K);
New(Nuevo);
Medio:=Temp.NumClaves DIV 2;
FOR i:=1 TO Medio DO
BEGIN
Nodo.Claves[i]:=Temp.Claves[i];
Nodo.Posicion[i]:=Temp.Posicion[i];
END;
Nodo.NumClaves:=Medio;
j:=1;
FOR i:=Medio+1 TO Temp.NumClaves DO

Procedimiento Insertar - I

11
















































BEGIN
Nuevo.Claves[j]:=Temp.Claves[i];
Nuevo.Posicion[j]:=Temp.Posicion[i];
j:=j+1;
END;
Nuevo.Siguiente:=Nodo.Siguiente;
Nodo.Siguiente:=Nuevo;
K:=Nuevo[1];
Terminamos:=FALSE;
REPEAT
IF PilaVacia(S) THEN BEGIN
NEW(Raiz);
Raiz.Clave[1]:=K;
Raiz.Descendiente[1]:=Nodo;
Raiz.Descendiente[2]:=Nuevo;
Terminamos:=TRUE;
END
ELSE BEGIN
Desapilar(S,Nodo);
IF Nodo.NumClaves<Orden THEN BEGIN
InsertarEnNodo(Nodo,K);
Terminamos:=TRUE;
END
ELSE BEGIN
FOR i:=1 TO Nodo.NumClaves DO
BEGIN
Temp.Claves[i]:=Nodo.Claves[i];
Temp.Posicion[i]:=Nodo.Posicion[i]
END;
Temp.NumClaves:=Nodo.NumClaves;
InsertarEnNodo(Temp,K);
New(Nuevo);
Medio:=Temp.NumClaves DIV 2;
FOR i:=1 TO Medio-1 DO
BEGIN
Nodo.Claves[i]:=Temp.Claves[i];
Nodo.Posicion[i]:=Temp.Posicion[i];
END;
Nodo.Posicion[i+1]:=Temp.Posicion[i+1];
Nodo.NumClaves:=Medio;
j:=1;
FOR i:=Medio+1 TO Temp.NumClaves DO
BEGIN
Nuevo.Claves[j]:=Temp.Claves[i];
Nuevo.Posicion[j]:=Temp.Posicion[i];
j:=j+1;
END;
Nuevo.Siguiente:=Nodo.Siguiente;
Nodo.Siguiente:=Nuevo;
K:=Temp.Claves[Medio];
END;
UNTIL Terminamos;
END;
END;
Procedimiento Insertar - II

12





















Borrado sobre una pgina-hoja

A continuacin se consideran los borrados que provocan que el rbol
se quede con muy pocos punteros. Primero se borra Daimiel del rbol de la
figura-6. Para ello se localiza la entrada Daimiel usando el algoritmo de
bsqueda. Cuando se borra la entrada Daimiel de su nodo hoja, la hoja se
queda vaca. Ya que en el ejemplo m = 3 y 0 < n (grado del rbol), este nodo
se debe borrar del rbol B+. Para borrar un nodo hoja se tiene que borrar el
puntero que le llega desde su padre. En el ejemplo, este borrado deja al nodo
padre, el cual contena tres punteros, con slo dos punteros. Ya que 2 < n, el
nodo es todava lo suficientemente grande y la operacin de borrado se
completa. El rbol B+ resultante se muestra en la figura-8.














PROCEDURE InsertarEnNodo (VAR Nodo:TArbolBMas;K:TClave);
VAR
Encontrado:Boolean;
i:Integer;
KAux:TClave;
BEGIN
Encontrado:=TRUE;
i:=1;
WHILE i<Nodo.NumClaves AND Not Encontrado DO
IF Nodo.Claves[i]<K THEN i:=i+1
ELSE Encontrado:=TRUE;
WHILE i[Nodo.NumClaves DO BEGIN
KAux:=Nodo.Claves[i];
Nodo.Claves[i]:=K;
K:=KAux;
i:=i+1;
END;
Nodo.NumClaves:=Nodo.NumClaves+1;
END;
Procedimiento Insertar en Nodo
Pamplona
Figura-8. Borrado de Daimiel del rbol B+ de la Figura-6

Reus

Madrid

Barcelona Madrid

Cdiz

Pamplona

Reus

Ronda

13

Borrado sobre una pgina interior

Cuando el borrado se hace sobre el padre de un nodo hoja, el propio
nodo padre podra quedar demasiado pequeo. Esto es exactamente lo que
ocurre si se borra Pamplona del rbol B+ de la figura-8. El borrado de la
entrada Pamplona provoca que un nodo hoja se quede vaco. Cuando se
borra el puntero a este nodo en su padre, el padre slo se queda con un
puntero. As, N de punteros = 3, n = 2 y queda tan slo un puntero que es
demasiado poco. Sin embargo, ya que el nodo padre contiene informacin
til, no podemos simplemente borrarlo. En vez de eso, se busca el nodo
hermano (el nodo interno que contiene al menos una clave de bsqueda,
Madrid). Este nodo hermano tiene sitio para colocar la informacin contenida
en el nodo que qued demasiado pequeo, as que se funden estos nodos, de
tal manera que el nodo hermano ahora contiene las claves Madrid y
Reus. El otro nodo (el nodo que contena solamente la clave de bsqueda
Reus) ahora contiene informacin redundante y se puede borrar desde su
padre (el cual resulta ser la raz del ejemplo).

En la figura-9 se muestra el resultado. Hay que observar que la raz tiene
solamente un puntero hijo como resultado del borrado, as que ste se borra
y el hijo solitario se convierte en la nueva raz. De esta manera la profundidad
del rbol ha disminuido en una unidad.















No siempre es posible fundir nodos. Como ejemplo, se borrar Pamplona
del rbol B+ de la figura-6. En este ejemplo, la entrada Daimiel es todava
parte del rbol. Una vez ms, el nodo hoja que contiene Pamplona se
queda vaco. El padre del nodo hoja se queda tambin demasiado pequeo
(nicamente con un puntero). De cualquier modo, en este ejemplo el nodo
hermano contiene ya el mximo nmero de punteros: tres. As no puede
acomodar a un puntero adicional. La solucin en este caso es redistribuir los
punteros de tal manera que cada hermano tenga dos punteros. El resultado
se muestra en la figura-10. Obsrvese que la redistribucin de los valores
Madrid

Reus
Reus

Ronda Barcelona Cdiz Madrid

Figura-9. Borrado de Pamplona del rbol B+ de la Figura-8
14
necesita de un cambio en el valor de la clave de bsqueda en el padre de los
dos hermanos.





















En general, para borrar un valor en un rbol B+ se realiza una bsqueda
segn el valor y se borra. Si el nodo es demasiado pequeo, se borra desde
su padre. Este borrado se realiza como una aplicacin recursiva del algoritmo
de borrado hasta que se alcanza la raz, un nodo padre queda lleno de
manera adecuada despus de borrar, o hasta aplicar una redistribucin.

En la figura-11 se describe el seudo cdigo para el borrado en un rbol B+.
El procedimiento intercambiar_variables (L, L) simplemente cambia de lugar
los valores (punteros) de las variables L y L; este cambio no afecta al rbol
en s mismo. El seudo cdigo utiliza la condicin muy pocos
valores/punteros. Para nodos internos, este criterio quiere decir menos que
m punteros; para nodos hoja, quiere decir menos que m-1 valores. El seudo
cdigo realiza la redistribucin tomando prestada una sola entrada desde un
nodo adyacente. Tambin se puede redistribuir mediante la distribucin
equitativa de entradas entre dos nodos. El seudo cdigo hace referencia al
borrado de una entrada (V, P) desde un nodo. En el caso de los nodos hoja,
el puntero a una entrada realmente precede al valor de la clave; as, el
puntero P precede al valor de la clave V. Para nodos internos, P sigue al valor
de la clave V.

Conclusiones de Inserciones y Borrados

Aunque las operaciones insercin y borrado en rboles B+ son complicadas,
requieren relativamente pocas operaciones. Se puede demostrar que el
nmero de operaciones necesarias para una insercin o borrado es, en el
Madrid

Figura-10. Borrado de Pamplona del rbol B+ de la Figura-6

Reus

Daimiel

Barcelona Daimiel

Cdiz

Madrid

Reus

Ronda

15
peor de los casos, proporcional a log
n
(K), donde n es el nmero mnimo de
punteros en un nodo y K es el nmero de valores de la clave de bsqueda. En
otras palabras, el coste de las operaciones insercin y borrado es proporcional
a la altura del rbol B+ y es por lo tanto bajo. Debido a la velocidad de las
operaciones en los rboles B+, estas estructuras de ndice se usan
frecuentemente al implementar las bases de datos.



Organizacin de archivos con rboles B+ (Arbol B+ como Estructura)

Como se mencion anteriormente, el inconveniente de la organizacin
de archivos secuenciales de ndices es la degradacin del rendimiento segn
crece el archivo. Se resuelve la degradacin de las bsquedas en el ndice
mediante el uso de ndices de rbol B+ en el archivo. Tambin se soluciona el
problema de la degradacin al almacenar los registros reales utilizando el
nivel de hoja del rbol B+ para almacenar los registros reales en los bloques.
En estas estructuras, la estructura del rbol B+ se usa no slo como un
ndice, sino tambin como un organizador de los registros dentro del archivo.

En la organizacin de archivo con rboles B+, los nodos hoja del rbol
almacenan registros, en lugar de almacenar punteros a registros. En la
figura-12 se muestra un ejemplo de la organizacin de un archivo con un
rbol B+. Ya que los registros son normalmente ms grandes que los
punteros, el nmero mximo de registros que se pueden almacenar en un
nodo hoja es menor que el nmero de punteros en un nodo interno. Sin
embargo, todava se requiere que los nodos hoja estn llenos al menos hasta
la mitad.




















I

Figura-12. Organizacin de archivos con rboles B+
K M

C F

(A,4) (B,8) (C,1) (D,9) (E,4) (F,7) (G,3) (H,3)
(M,4) (N,8) (P,6) (K,1) (L,6)

(I ,4) (J ,8)

16
La insercin y borrado desde una organizacin de archivo con rboles B+ se
trata del mismo modo que la insercin y borrado de entradas en un ndice de
rbol B+. Cuando se inserta un registro con un valor clave v, se localiza el
bloque que debera contener ese registro mediante la bsqueda en el rbol
B+ de la mayor clave que sea v. Si el bloque localizado tiene bastante espacio
libre para el registro, se almacena el registro en el bloque. De no ser as,
como en una insercin en un rbol B+, se divide el bloque en dos y se
redistribuyen sus registros (en el orden de la clave del rbol B+), creando
espacio para el nuevo registro. Esta divisin se propaga hacia arriba en el
rbol B+ de la manera usual. Cuando se borra un registro, primero se elimina
del bloque que lo contiene. Si como resultado un bloque B llega a ocupar
menos que la mitad, los registros en B se redistribuyen con los registros en
un bloque B adyacente. Si se asume que los registros son de tamao fijo,
cada bloque contendr por lo menos la mitad de los registros que pueda
contener como mximo. Los nodos internos del rbol B+ se actualizan por
tanto de la manera habitual.

Cuando un rbol B+ se utiliza para la organizacin de un archivo, la utilizacin
del espacio es particularmente importante, ya que el espacio ocupado por los
registros es mucho mayor que el espacio ocupado por las claves y punteros.
Se puede mejorar la utilizacin del espacio en un rbol B+ implicando a ms
nodos hermanos en la redistribucin durante las divisiones y reuniones. La
tcnica es aplicable a los nodos hoja y nodos internos y funciona como sigue.

Durante la insercin, si un nodo est lleno, se intenta redistribuir algunas de
sus entradas en uno de los nodos adyacentes para hacer sitio a una nueva
entrada. Si este intento falla porque los nodos adyacentes estn llenos, se
divide el nodo y las entradas entre uno de los nodos adyacentes y los dos
nodos que se obtienen al dividir el nodo original. Puesto que los tres nodos
juntos contienen un registro ms que puede encajar en dos nodos, cada nodo
estar lleno aproximadamente hasta sus dos terceras partes. Para ser ms
precisos, cada nodo tendr por lo menos 4n/3 entradas, donde 2n es el
nmero mximo de entradas que puede tener un nodo.

Durante el borrado de un registro, si la ocupacin de un nodo est por debajo
de 4n/3, se intentar tomar prestada una entrada desde uno de sus nodos
hermanos. Si ambos nodos hermanos tienen 4n/3 registros, en lugar de
tomar prestada una entrada, se redistribuyen las entradas en el nodo y en los
dos nodos hermanos uniformemente entre dos de los nodos y borrando el
tercer nodo. Se puede usar esta aproximacin porque el nmero total de
entradas es 3*4n/3-1, lo cual es menos que 4n. Utilizando tres nodos
adyacentes para la redistribucin, se garantiza que cada nodo pueda tener
6n/4 entradas. En general, si hay m nodos (m-1 hermanos) implicados en la
redistribucin, se garantiza que cada nodo pueda contener al menos (m-
1)2n/m entradas. Sin embargo, el costo de la actualizacin se vuelve mayor
segn haya ms nodos hermanos involucrados en la redistribucin.

17
BIBLIOGRAFA

Fundamentos de Bases de Datos
Abraham Silberschatz, Henry F. Korth y S. Sudarsan
McGraw Hill

Estructuras de datos y organizacin de archivos
Mary E.S. Loomis
Prentice Hall

Estructuras de archivos. Un conjunto de herramientas
conceptuales
Michael J . Folk
Addison-Wesley

Sistemas de Bases de Datos. Conceptos Fundamentales
Elmasri/Navathe
Addison-Wesley

También podría gustarte