Está en la página 1de 10

168

Cap tulo 4. Representacin de conjuntos mediante rboles o a

En cuanto al tiempo de ejecucin, bsicamente podemos aplicar el mismo anlisis o a a que en la insercin. El tiempo total para una supresin ser proporcional al nivel de la o o a clave buscada en el AVL, puesto que el tiempo en cada nivel es constante (o limitado por una constante). Como el nivel mximo est en un O(log n), el tiempo de ejecucin a a o ser tambin un O(log n). a e Ejemplo 4.3 En un rbol AVL inicialmente vac almacenamos nmeros enteros. Insera o u tamos los siguientes elementos: 7, 14, 32, 9, 40, 8, 3, 4. Despus eliminamos del rbol los e a valores: 9, 32, 3. Vamos a ver la estructura del arbol despus de aplicar cada operacin, e o indicando los casos en los que ocurre desbalanceo y la rotacin que se aplica. o El resultado aparece en la gura 4.22. Se puede ver que en la insercin se requieren o en total 3 rotaciones, para 8 inserciones. Por otro lado, de las 3 eliminaciones ocurren desbalanceos en 2 de ellas.

4.4.

Arboles B

Los rboles B 14 constituyen una categor muy importante de estructuras de datos, a a que permiten una implementacin eciente de conjuntos y diccionarios, para operaciones o de consulta y acceso secuencial. Existe una gran variedad de arboles B: los arboles B, B+ y B*; pero todas ellas estn basadas en la misma idea, la utilizacin de rboles de a o a bsqueda no binarios y con condicin de balanceo. u o En concreto, los arboles B+ son ampliamente utilizados en la representacin de o ndices en bases de datos. De hecho, este tipo de rboles estn diseados espec a a n camente para aplicaciones de bases de datos, donde la caracter stica fundamental es la predominancia del tiempo de las operaciones de entrada/salida de disco en el tiempo de ejecucin o total. En consecuencia, se busca minimizar el nmero de operaciones de lectura o escritura u de bloques de datos del disco duro o soporte f sico.

4.4.1.

Arboles de b squeda no binarios u

En cierto sentido, los arboles B se pueden ver como una generalizacin de la idea o de rbol binario de bsqueda a rboles de bsqueda no binarios. Consideremos la reprea u a u sentacin de rboles de bsqueda binarios y n-arios de la gura 4.23. o a u En un ABB (gura 4.23a) si un nodo x tiene dos hijos, los nodos del subrbol a izquierdo contienen claves menores que x y los del derecho contienen claves mayores que x. En un rbol de bsqueda no binario (gura 4.23b), cada nodo interno puede contener q a u a claves x1 , x2 , . . ., xq , y q + 1 punteros a hijos que estn situados entre cada par de claves y en los dos extremos. Las claves estarn ordenadas de menor a mayor: x1 < x2 < . . . < xq . a Adems, el hijo ms a la izquierda contiene claves menores que x1 ; el hijo entre x1 y x2 a a contiene claves mayores que x1 y menores que x2 ; y as sucesivamente hasta el hijo ms a a la derecha que contiene claves mayores que xq .
14

La B viene de balanceados.

4.4. Arboles B
I(7)
7

169
I(14)
7

I(32)
14

7 14

Caso DD(7) RSD(7)

14 7 32

I(9)
7

14 32 9

I(40)

32

I(40)
7

14 32 9

I(8)
7 40 8

14 32 9

Caso DI(7) RDD(7)

14 8 32 9 40

I(3)
8 7 3

14 32 9

I(2)

40

40

I(4)
8 7 3 4

14 32 9

Caso ID(7) RDD(7)

14 8 32 9 7

E(9)
8 40 h2 3 4 7

14 32 9 h1

Caso h1=h2 RSI(8)

14 4 32 8 7

E(32)

40 3

40

40

E(32)
4 3 7

14 32 8 40 h2 3 7 4

14 40 8 h1

Caso h1>h2 RDI(14)

8 4 14 7 40

E(3)
4 7

8 14 40

Figura 4.22: Insercin y eliminacin de elementos en un AVL, segn las operaciones del o o u ejemplo 4.3. Denicin de rbol B o a Un rbol B de orden p es bsicamente un rbol de bsqueda n-ario donde los a a a u nodos tienen p hijos como mximo, y en el cual se aade la condicin de balanceo de que a n o todas las hojas estn al mismo nivel. La denicin formal de arbol B es la siguiente. e o Denicin 4.6 Un rbol B de orden p, siendo p un entero mayor que 2, es un arbol o a con las siguientes caracter sticas: 1. Los nodos internos son de la forma (p1 , x1 , p2 , x2 , . . ., xq1 , pq ), siendo pi punteros a nodos hijos y xi claves, o pares (clave, valor) en caso de representar diccionarios. 2. Si un nodo tiene q punteros a hijos, entonces tiene q 1 claves.

170

Cap tulo 4. Representacin de conjuntos mediante rboles o a

x
a) b)

x1

x2

x3

x4

<x

>x

<x1

>x1 <x2

>x2 <x3

>x3 <x4

>x4

Figura 4.23: Estructura de los arboles de bsqueda. a) Arbol binario de bsqueda. b) u u Arbol de bsqueda n-ario. u 3. Para todo nodo interno, excepto para la ra p/2 q p. Es decir, un nodo puede z, tener como m nimo p/2 hijos y como mximo p. El valor p/2 1 indicar el a a m nimo nmero de claves en un nodo interno y se suele denotar por d. u 4. La ra puede tener 0 hijos (si es el unico nodo del arbol) o entre 2 y p. z 5. Los nodos hoja tienen la misma estructura, pero todos sus punteros son nulos. 6. En todos los nodos se cumple: x1 < x2 < . . . < xq1 . 7. Para todas las claves k apuntadas por un puntero pi de un nodo se cumple: Si i = 1 entonces k < x1 . Si i = q entonces xq1 < k. En otro caso, xi1 < k < xi . 8. Todas los nodos hoja estn al mismo nivel en el arbol. a Los rboles B+ son una variante de los arboles B, que se utiliza en representacin a o de diccionarios. La estructura de los nodos hoja es distinta de la de los nodos internos. En esencia, la modicacin consiste en que en los nodos internos slo aparecen claves, o o mientras en los nodos hoja aparecen las asociaciones (clave, valor). Por otro lado, tenemos la variante de los rboles B*. Su principal caracter a stica es que si en los rboles B teniendo en cuenta la anterior denicin los nodos deben estar a o ocupados como m nimo hasta la mitad, en los B* tienen que estar ocupados ms de dos a tercios del mximo. En adelante nos centraremos en el estudio de los arboles B. En la a gura 4.24 se muestra un ejemplo de arbol B de orden p = 5. Representacin del tipo rbol B o a Pasando ahora a la implementacin de rboles B de cierto orden p, lo normal es o a reservar espacio de forma ja para p hijos y p 1 elementos. La denicin, suponiendo o que el tipo almacenado es T, podr ser como la siguiente. a tipo

4.4. Arboles B

171

39 13 20 30 49 62

4 9

15 16

22 25 29

33 34

41 42 45 47

52 57

63 73

Figura 4.24: Ejemplo de arbol B de orden p = 5. Cada nodo interno excepto la ra debe z, tener entre 3 y 5 hijos o, equivalentemente, entre 2 y 4 entradas.

ArbolB[T,p] = Puntero[NodoArbolB[T,p]] NodoArbolB[T,p] = registro q: entero // Nmero de punteros no nulos del nodo u x: array [1..p-1] de T ptr: array [1..p] de ArbolB[T,p] nregistro En aplicaciones reales de bases de datos, el valor de p se ajusta de forma que un nodo ocupe exactamente un bloque de disco. Por ejemplo, si suponemos que los enteros, punteros y valores de tipo T ocupan 4 bytes, un nodo ser de tamao 2 4p bytes; si los a n bloques de disco son de 4.096 bytes, entonces usar amos un p = 512. La implementacin de la operacin de bsqueda consistir simplemente en empezar o o u a por la ra y descender hacia la rama correspondiente, segn el valor de la clave buscada. z u Por ejemplo, la operacin Miembro sobre conjuntos podr ser como la siguiente. o a operacin Miembro (b: ArbolB[T,p]; c: T): booleano o si b = NULO entonces devolver false sino para i:= 1, ..., b.q-1 hacer si c = b.x[i] entonces devolver verdadero sino si c < b.x[i] entonces devolver Miembro(b.ptr[i], c) nsi npara devolver Miembro(b.ptr[b.q], c) nsi Claramente, el tiempo de ejecucin depende de la altura del rbol que, como veremos o a adelante, crece logar tmicamente con el nmero de nodos. En concreto, por cada nivel de u la clave buscada habr una llamada recursiva a Miembro. a

172

Cap tulo 4. Representacin de conjuntos mediante rboles o a

4.4.2.

Insercin en un rbol B o a

Adems de mantener la estructura de arbol de bsqueda, el procedimiento de insera u cin en un rbol B debe asegurar la propiedad que impone que todas las hojas estn al o a e mismo nivel. La nueva entrada debe insertarse siempre en un nodo hoja15 . Si hay sitio en la hoja que le corresponde, el elemento se puede insertar directamente. En otro caso aplicamos un proceso de particin de nodos, que es mostrado en la o gura 4.25. El proceso consiste en lo siguiente: con las p 1 entradas de la hoja donde se hace la insercin ms la nueva entrada, se crean dos nuevas hojas con (p 1)/2 y o a (p 1)/2 entradas. La entrada m que est en la mediana aparece como una nueva clave a de nivel superior, y tiene como hijas las dos hojas recien creadas. El proceso se repite recursivamente en el nivel superior, en el que habr que insertar a m. Si m cabe en el nodo interno correspondiente, se inserta. En otro caso, se parte el nodo interno y se repite el proceso hacia arriba. Si se produce la particin a nivel de la o ra entonces tenemos el caso donde la profundidad del arbol aumenta en uno. z En denitiva, el esquema del algoritmo de insercin de una clave x en un rbol B o a de orden p ser el siguiente. a 1. Buscar el nodo hoja donde se deber colocar x, usando un procedimiento parecido a a la operacin Miembro. Si el elemento ya est en el rbol, no se vuelve a insertar. o a a 2. Si la hoja contiene menos de p 1 entradas, entonces quedan sitios libres. Insertar x en esa hoja, en la posicin correspondiente. o 3. Si no quedan sitios libres, cogemos las p 1 entradas de la hoja y x. La mediana m pasa al nodo padre, as como los punteros a sus nuevos hijos: los valores menores que m forman el nodo hijo de la izquierda y los valores mayores que m forman el nodo hijo de la derecha. 4. Si el nodo padre est completo, se dividir a su vez en dos nodos, propagndose el a a a proceso de particin hasta la ra o z. El algoritmo garantiza las propiedades de arbol B: todas las hojas estn al mismo a nivel y los nodos internos (excepto, posiblemente, la ra estn llenos como m z) a nimo hasta la mitad. Por otro lado, el tiempo de ejecucin depende de la altura del rbol. Pero, o a adems, el tiempo en cada nivel no es constante; el proceso de particin tardar un O(p) a o a en el peor caso. No obstante, ya hemos visto que realmente el factor a considerar es el nmero de nodos tratados, ms que las operaciones que se realicen dentro de cada nodo. u a

4.4.3.

Eliminacin en un rbol B o a

Igual que la insercin en un rbol B hace uso de la particin de un nodo en dos, la o a o eliminacin se caracteriza por el proceso de unin de dos nodos en uno nuevo, en caso o o de que el nodo se vac hasta menos de la mitad. No obstante, hay que tener en cuenta e todas las situaciones que pueden ocurrir en la supresin. o
15

Ya que recordemos que los nodos internos deben tener un puntero ms que claves. a

4.4. Arboles B

173

a) Insertar 23 13 20 30 13 20 30

22 23 25 29 b) Insertar 21 13 20 30
PARTIR EL NODO

22 23 25 29

13 20 23 30

13 20 23 30

21 22 23 25 29

21 22

25 29

21 22

25 29

c) Insertar 26, 27, 28 PARTIR 13 20 23 30

EL NODO

13 20 23 27 30

PARTIR EL NODO

23 39 27 30 28 29

13 20 25 26 27 28 29 25 26 28 29 25 26

Figura 4.25: Insercin de claves en el rbol B de orden p = 5 de la gura 4.24. a) Insercin o a o sin necesidad de particin. b) La insercin de 21 obliga a partir una hoja. c) Despus de o o e insertar 28, hay que partir la hoja, y despus otra vez a nivel superior. e Dada una clave x a eliminar de un arbol B, en primer lugar debemos buscar el nodo donde se encuentra x. Si se encuentra dentro de un nodo interno, no se puede suprimir de forma directa. En ese caso, habr que sustituir x en el rbol por la siguiente clave en a a orden es decir, la mayor del subrbol izquierdo o la menor del subrbol derecho de x y a a se contina con la eliminacin como si se hubiera producido en la posicin sustituida. Por u o o ejemplo, si en el rbol de la gura 4.24 eliminamos la clave 39, deber a amos colocar en su lugar 34 o bien 41, y seguir con el proceso de supresin a partir de la hoja correspondiente. o De esta forma, el grueso del proceso de eliminacin siempre parte de un nodo hoja. o Si la clave a eliminar est en una hoja a la que llamamos la hoja de supresin o a o se ha aplicado la sustitucin explicada antes, entonces podemos encontrarnos varios casos. o Recordemos que un nodo debe contener como m nimo d = p/2 1 entradas. Los casos dependen del nmero de entradas de la hoja de supresin, en relacin con d. u o o Si la hoja de supresin tiene ms de d entradas, se puede eliminar la clave directao a mente. Acabar la operacin sin ms modicaciones. a o a

174

Cap tulo 4. Representacin de conjuntos mediante rboles o a Si la hoja contiene exactamente d entradas, entonces al eliminar la clave se queda con d 1. Ser necesario aadirle alguna entrada, pero cul? Algn nodo hermano a n a u podr prestarle una entrada, si tiene alguna de sobra. Pueden ocurrir dos casos. a Si existe algn nodo hermano, adyacente a la hoja de supresin y que tenga u o ms de d entradas, entonces le hace un prstamo: la entrada del padre comn a e u 16 pasa a la hoja de supresin y la entrada adecuada del nodo hermano pasa a o la posicin del padre. Este proceso se muestra en la gura 4.26b). o Si todos los hermanos adyacentes a la hoja de supresin tienen d entradas, o entonces no se puede producir el prstamo. En ese caso, la solucin es unir e o dos nodos en uno. Con las d 1 entradas del nodo de supresin, ms las o a d entradas de un hermano y la entrada del padre comn, se forma un nuevo u nodo con 2d entradas. En la gura 4.26c) aparece un ejemplo de supresin que o acarrea una unin de nodos. o

Hay que tener en cuenta que el ultimo caso, la unin de dos nodos, da lugar a o la eliminacin de una entrada a nivel superior. Por lo tanto, el proceso de eliminacin o o deber repetirse en ese nivel superior. Es decir, si el nodo interno el padre de la hoja a de supresin contiene ms de d entradas, se puede eliminar directamente. Si tiene d o a entradas, entonces ocurrir uno de los dos casos anteriores: si algn hermano tiene ms a u a de d entradas le presta una; y en otro caso se juntan dos nodos en uno. En denitiva, el proceso se ir repitiendo sucesivamente desde las hojas hasta la ra a z. Est claro que el nodo ra no tiene hermanos, por lo que nunca podr recibir a z a prstamos o unirse con un hermano. Bsicamente, esta es la razn por la que en los e a o rboles B se permite que la ra tenga menos de d entradas. a z Si en el proceso de eliminacin se suprime una entrada de la ra (al juntarse dos o z hijos suyos) y la ra slo ten esa entrada, entonces tenemos un caso donde la altura del z o a rbol disminuye en uno. Por ejemplo, si en el arbol de la gura 4.26d) eliminamos el valor a 63, habr que unir nodos, formando una hoja con 47, 52, 62 y 73. La unin se repetir a a o a nivel superior, dando lugar a un nuevo nodo interno con 20, 30, 39 y 45. Este nodo sera la nueva ra de manera que el arbol tendr ahora altura uno. z, a

4.4.4.

Anlisis de eciencia de los rboles B a a

En el anlisis de eciencia de los rbol B, el recurso cr a a tico es el nmero de lecu turas/escrituras de bloques del disco duro. T picamente, las operaciones de acceso a disco son varios rdenes de magnitud ms lentas que las que se realizan en memoria. En las o a implementaciones reales y ecientes de rboles B, se hace que cada nodo del arbol ocupe a exactamente un bloque de disco, lo cual se consigue ajustando el parmetro p. Por lo a tanto, hasta cierto l mite, el tiempo de las instrucciones que se ejecutan dentro de cada nodo es despreciable y el factor importante es el nmero de nodos tratados17 . u
Es decir, la mayor o la menor, segn el nodo hermano est a la izquierda o a la derecha del nodo de u e supresin. o 17 Podr amos decir algo parecido de las dems estructuras de datos estudiadas en este y en otros a cap tulos. La diferencia es que esas otras estructuras suelen encontrarse en aplicaciones que hacen uso de disco o no, mientras que los rboles B son t a picos de aplicaciones de BB.DD.
16

4.4. Arboles B

175
SUSTITUIR POR EL 47

a) Eliminar 49

49 62

47 62

41 42 45 47 b) Eliminar 57

52 57

63 73

41 42 45

52 57

63 73

47 62

EL HERMANO IZQUIERDO PRESTA EL 45

45 62

41 42 45 c) Eliminar 9

52 57

63 73

41 42

47 52

63 73

13 20 30

UNIR LAS DOS HOJAS Y 13 EN UNA NUEVA HOJA

20 30

4 9

15 16

22 25 29 33 34

4 13 15 16 22 25 29 33 34

d) rbol resultante 20 30 4 13 15 16 22 25 29 33 34

39 45 62 41 42 47 52 63 73

Figura 4.26: Eliminacin de claves en el rbol B de orden p = 5 de la gura 4.24. a) Elio a minacin en un nodo interno. b) La eliminacin de 57 requiere un prstamo del hermano. o o e c) La eliminacin de 9 produce una unin de hojas. d) Resultado nal. o o Anlisis de tiempos de ejecucin a o Igual que con las restantes estructuras arbreas, el nmero de nodos recorridos en o u las distintas operaciones es proporcional a la altura del arbol. En concreto, si la altura del rbol es h, la operacin de bsqueda de una clave acceder a h + 1 nodos; la insercin en a o u a o el peor caso tratar 2h + 1 nodos, si se debe hacer la particin a todos los niveles; y, de a o forma similar, la eliminacin visitar 3h + 1 nodos en el peor caso. o a Para obtener el nmero de nodos recorridos en funcin del nmero n de claves u o u almacenadas en el arbol B, vamos a calcular primero la funcin inversa, es decir el nmero o u n de claves que caben para una cierta altura h. Podemos distinguir dos casos: en el mejor,

176

Cap tulo 4. Representacin de conjuntos mediante rboles o a

nmejor , cada nodo interno tendr p hijos (el mximo); y en el peor, npeor , tendr 2 o d+1 si a a a es la ra o no (el m z nimo), respectivamente. Contando el nmero de claves almacenadas u en cada nivel, para una altura total h, tenemos lo siguiente. Nivel nmejor 0 p1 1 (p 1)p 2 (p 1)p2 3 (p 1)p3 ... ... h (p 1)ph npeor 1 2d 2d(d + 1) 2d(d + 1)2 ... 2d(d + 1)h1

Sumando todas las claves en las distintas alturas obtenemos nmejor y npeor .
h

nmejor (h) = (p 1)
i=0 h1

pi = ph+1 1

(4.4)

npeor (h) = 1 + 2d
i=0

(d + 1)i = 2(d + 1)h 1

(4.5)

Ahora podemos despejar la altura h y expresarla en funcin de n, que es lo que o realmente nos interesa. Tenemos. hmejor (n) = logp (n + 1) 1 hpeor (n) = logd+1 n+1 = log 2 n+1 2 (4.6) (4.7)

p/2

Como se puede ver, en todos los casos la altura est en un O(log n) y lo mismo ocura rir con el tiempo de las operaciones sobre el arbol B, si contamos slo la entrada/salida de a o disco. Pero lo que resulta realmente interesante es la base del logaritmo. No es lo mismo18 un logaritmo en base 2 que en base 512. En la tabla 4.3 se muestran comparativamente las alturas segn el nmero n de claves, utilizando arboles AVL y B. Se muestran tambin u u e unos valores de ejemplo, suponiendo que queremos almacenar el conjunto de los DNI de todos los espaoles (alrededor de 40 millones) y que p=512. n Estructura Arbol AVL Arbol B Altura mejor caso log2 (n + 1) 1 logp (n + 1) 1 (ejemplo) 25 2 Altura peor caso log1,62 ((n + 1)/1,89) log p/2 ((n + 1)/2) (ejemplo) 35 4

Tabla 4.3: Alturas en el mejor y peor caso de un arbol AVL y un arbol B con n nodos. En el ejemplo, n= 40.000.000 y p= 512. Realmente, la comparativa deber tener en cuenta que de los veinte o treinta nodos a le dos en el AVL, puede que muchos de ellos estn en el mismo bloque de disco. El e
18

Aunque s que son iguales en cuanto a rdenes de complejidad. Es decir O(log2 x) = O(log512 x). o

Ejercicios resueltos

177

nmero de E/S ser algo menor. Sin embargo, el arbol B nos garantiza que la bsqueda u a u no requerir nunca ms de cinco E/S (una ms que la altura). a a a Por otro lado, si suponemos que tanto el arbol B como el AVL estn en memoria, a deber amos multiplicar el nmero de nodos recorridos por el tiempo en cada nodo. El u tiempo por nodo en el AVL es constante, mientras que en el arbol B depende del nmero de u entradas del nodo. Haciendo una bsqueda binaria en cada nodo, tendr u amos log2 (q +1) comparaciones en el peor caso, si el nodo tiene q entradas. Si consideramos el mejor caso de altura, q = p 1 en todos los nodos y el nmero de nodos tratados ser logp (n + 1) . u a Multiplicando los dos trminos tenemos: e log2 p logp (n + 1) log2 (n + 1) En conclusin, en el rbol B el nmero de comparaciones es un logaritmo en base o a u 2, exactamente el mismo logaritmo que con arboles AVL19 ! La ventaja de los arboles B se encuentra, por lo tanto, cuando consideramos las E/S de disco. Utilizacin de memoria o La implementacin de rboles B usando un bloque de disco de tamao jo por o a n cada nodo, implica una reserva de memoria que despus puede ser utilizada o no. Esta e situacin es comparable a lo que puede ocurrir con tablas de dispersin, donde se reservan o o muchas cubetas que despus pueden usarse o no. Algo parecido ocurre en los arboles AVL. e Por cada clave existen dos punteros, pero todos los punteros de los hijos tendrn siempre a valor nulo. En un rbol B, con un p sucientemente grande, la proporcin est en torno a o a a un puntero por clave. Por contra, en el peor caso los nodos estarn medio vac a os. Consideremos que una entrada (clave y valor) ocupa k1 bytes y un puntero k2 bytes. Un rbol AVL necesitar siempre n(k1 + 2k2 ) bytes, para almacenar n entradas. Por otro a a lado, de forma aproximada, el arbol B suponiendo que slo se ocupan los nodos hasta la o a o n a mitad, ocupar 2n(k1 +k2 ). Si los nodos se llenan con ms proporcin, el tamao tender a a n(k1 + k2 ). En denitiva, segn el porcentaje de llenado de los nodos la utilizacin de u o memoria ser ms o menos eciente. a a Ejemplo 4.4 En un rbol B de orden p=4 inicialmente vac almacenamos nmeros a o u enteros. Insertamos los siguientes elementos: 37, 14, 60, 9, 22, 51, 10, 5, 55, 70, 1. La estructura del rbol despus de cada operacin se muestra en la gura 4.27. a e o

Ejercicios resueltos
Ejercicio 4.1 En cierta aplicacin, utilizamos un rbol trie para representar palabras en o a dos o ms idiomas, por ejemplo, espaol e ingls. Queremos aadir a cada palabra una a n e n denicin de su signicado y la traduccin al otro idioma. Describir la estructura de datos, o o mostrando las deniciones de los tipos necesarios. Hay que tener en cuenta que algunas palabras pueden tener signicado en los dos idiomas, por ejemplo, can, conductor, mete, sin.
19

Se puede comprobar que tomando el peor caso tambin obtenemos un logaritmo en base 2. e

También podría gustarte