El TAD Árbol Tema 3 3.6 Montículos y Colas de Prioridad El concepto de cola de prioridad es semejante al de cola, con la diferencia de que los elementos que entran en la cola de prioridad van saliendo de ella por un orden de prioridad establecido, en lugar de por orden de llegada. Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía. La implementación de colas de prioridad usando una estructura lineal ordenada consigue que todas las operaciones sean de orden constante (O(1)) menos la inserción, que es de orden lineal (O(n)). Existe una solución: Utilizar una estructura arbórea denominada montículo, que consigue una complejidad de O(log (n)) para la inserción y la eliminación. Un montículo binario de mínimos es un árbol binario semicompleto en el que el valor de la clave (prioridad) almacenada en cualquier nodo es menor que los valores de clave de sus hijos. De forma análoga se define el montículo binario de máximos. El tipo de dato de las claves (prioridades), por las que se ordena el montículo, debe poseer una relación de orden total 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 56 El TAD Árbol Tema 3 En cada operación de actualización en un montículo se deben mantener las propiedades que definen su estructura El ejemplo muestra un montículo de mínimos en el que la mayor prioridad va asociada a valores bajos de ésta (Ej. El elemento con la mayor prioridad es el que tiene 2) 2 6 5 15 26 2005 -2006 11 27 Estructuras de Datos II 37 7 13 35 I.T. en Informática de Gestión/Sistemas Universidad de Huelva 57 El TAD Árbol Tema 3 Implementación - Los árboles también puede implementarse mediante una estructura lineal sin usar campos adicionales para establecer los enlaces. - Una representación secuencial estática para árboles no resulta eficiente, puesto que se desaprovechan muchos huecos. - En el caso de los árboles completos y semicompletos, al tener prácticamente todos los nodos ocupados, podemos mantener todo su contenido de forma eficiente. - Para evitar los enlaces, habrá que establecer una fórmula que calcule la posición de cada nodo dentro de la secuencia. Esta fórmula es la siguiente: - Para los hijos: Si un nodo ocupa la posición o hueco i - Su hijo izquierdo ocupa la posición 2i - Su hijo derecho la posición 2i+1. - Para el padre: Si un nodo ocupa la posición o hueco i - El padre ocupa la posición ⎣i/2⎦ 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 58 El TAD Árbol Tema 3 Todos los nodos excepto la raíz tienen padre: Se deja sin elemento la posición 0: En esa posición se coloca un elemento centinela que sirva como padre de la raíz ⇒ simplificación de algunas operaciones Se necesita mantener un entero que indique cuántos nodos hay actualmente en el árbol Se debe mantener tanto el objeto a insertar como su prioridad. La clase Elemento almacena toda esta información Ejemplo: Representación gráfica y mediante vector de un montículo binario de máximos, en la que la prioridad mayor va asociada a valores altos de ésta. 50 22 47 50 47 22 32 44 12 19 16 3 0 1 2 3 4 5 6 7 8 9 37 41 9 10 11 12 13 14 16 2005 -2006 Estructuras de Datos II 44 32 3 I.T. en Informática de Gestión/Sistemas 37 12 41 19 9 Universidad de Huelva 59 El TAD Árbol Tema 3 Las interfaces informales de las clases Elemento y Cola de Prioridad son: template <typename T> class Elemento { public: Elemento (const T& objeto, int p); const T& getObj(); int getPrio(); void setObj (const T& objeto); void setPrio (int pr); } template <typename T> class ColaPrioridad { public: ColaPrioridad() bool esVacia(); const T& primero() throw (ColaPriorVaciaExcepcion) const; void suprimir() throw (ColaPriorVaciaExcepcion); void insertar (const Elemento& elem); } Para simplificar, se considera que la prioridad es de tipo entero, aunque podría ser de cualquier tipo de datos con una relación de orden total entre sus elementos 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 60 El TAD Árbol Tema 3 Inserción en Montículos Para insertar un nuevo elemento e en un montículo m se utiliza el siguiente algoritmo: 1.- Se inserta e como una nueva hoja en la primera posición libre del último nivel (primer hueco libre). 2.- Se “flota” el elemento e: Mientras e no se encuentre en la raíz y sea menor que su padre, se intercambia e con su padre. 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 61 El TAD Árbol Tema 3 Ejemplo - Creación de un montículo con los siguientes elementos: 15, 11, 12, 20, 5, 16, 8 11 15 15 11 11 flotar 15 11 15 15 12 12 20 11 15 20 11 12 5 flotar 20 5 5 5 12 flotar 15 11 20 11 12 20 15 5 2005 -2006 Estructuras de Datos II 12 15 15 16 5 11 20 12 16 flotar 8 11 20 8 15 16 I.T. en Informática de Gestión/Sistemas 12 Universidad de Huelva 62 El TAD Árbol Tema 3 Borrado en montículos En un montículo, el elemento que se elimina es la raíz, puesto que es el de mayor prioridad. Para eliminar la raíz de un montículo m, se utiliza el siguiente algoritmo: 1.- Si m tiene un único nodo, el resultado es el montículo vacío. Si m tiene dos o más nodos, se elimina la última hoja y se pone el elemento e que ésta contenga en el lugar de la raíz, que queda eliminada. 2.- Se “hunde” el elemento e. Mientras e ocupe una posición con hijos y sea mayor que alguno de sus hijos, se intercambia con el menor de sus hijos. 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 63 El TAD Árbol Tema 3 Ejemplo - Evolución del montículo anterior, eliminando sucesivamente algunos de sus elementos. 5 12 11 20 8 15 16 sustituir 12 11 20 8 15 16 11 20 8 hundir 16 12 20 15 16 11 12 hundir 15 16 20 11 12 hundir 15 15 20 Estructuras de Datos II 15 20 16 2005 -2006 11 12 16 12 12 hundir 15 16 20 I.T. en Informática de Gestión/Sistemas Universidad de Huelva 64 El TAD Árbol Tema 3 Implementación clase Montículo - La clase Montículo realiza la implementación de la interfaz ColaPrioridad. template <typename T> class Elemento{ public: Elemento(int p); … private: T obj; int prioridad; } 2005 -2006 Estructuras de Datos II template <typename T> class Monticulo { public: Monticulo(int tam=100, int pi); bool esVacio() const; const T& primero() throw (MonticuloVacioExcepcion); void insertar (const Elemento& elem) throw (MonticuloLlenoExcepcion); void suprimir() throw (MonticuloVacioExcepcion); int getTam() const; ~Monticulo(); private: Elemento* vector; // el vector del montículo int tamAct; // número de elementos del montículo int capacidad; // máximo número de nodos previsto // metodos auxiliares // void hundir (int hueco); // Se hunde al elemento con posición Vector[hueco] void flotar (int hueco); // Se flota al elemento con posición Vector[hueco] } I.T. en Informática de Gestión/Sistemas Universidad de Huelva 65 El TAD Árbol Tema 3 void insertar(const Elemento& elem) throw (MonticuloLlenoExcepcion); Monticulo (int tam, int pi) inicio tamAct = 0; capacidad = tam; vector = nuevo Elemento[capacidad]; vector[0] = Elemento(pi); // Prioridad inexistente, por ejemplo, 0 // Elemento centinela fin // Inserción en un montículo de mínimos inicio si (tamAct == capacidad-1) lanzar MonticuloLlenoExcepcion(); fsi; tamAct++; vector[tamAct] = elem; flotar (tamAct); fin bool esVacio() const () inicio return tamAct == 0; fin void flotar (int hueco); var Elemento e fvar inicio e = vector [hueco]; mientras (vector[hueco/2].getPrio() > e.getPrio()) hacer vector[hueco] = vector[hueco/2]; // baja al hueco el padre hueco = hueco/2 // sube un nivel en el árbol fmientras vector[hueco] = e; // sitúa el elemento en su posición fin 2005 -2006 I.T. en Informática de Gestión/Sistemas Estructuras de Datos II Universidad de Huelva 66 El TAD Árbol Tema 3 void suprimir ( ) throw (MonticuloVacioExcepcion); // Borrado en un montículo de mínimos inicio si (tamAct == 0) lanzar MonticuloVacioExcepcion(); fsi; vector[1] = vector[tamAct]; tamAct--; hundir (1); fin void hundir (int hueco) var Elemento e; int hijo; boolean esMonticulo; fvar inicio e = vector [hueco]; hijo = hueco * 2; esMonticulo = falso; mientras (hijo <= tamAct && !esMonticulo) hacer // se elige al hijo con mayor prioridad si (hijo < tamAct && vector[hijo].getPrio( ) > vector[hijo+1].getPrio( )) entonces hijo++; fsi; // si la prioridad del hijo es mayor que la del elemento a hundir // se realiza el intercambio si (vector[hijo].getPrio( ) < e.getPrio( )) entonces vector[hueco] = vector[hijo]; hueco = hijo; hijo = hueco * 2; sino // si la prioridad del elemento a hundir es mayor que la del hijo // el proceso termina esMonticulo = verdad; fsi; fmientras vector[hueco] = e; fin 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 67 El TAD Árbol Tema 3 Ordenación mediante montículos (heapsort) (I) Se puede usar el concepto de montículo para ordenar N elementos de un vector mediante el siguiente algoritmo: 1. Llamar a un procedimiento eficiente (hacerMonticulo()), que organice el vector con las características de un montículo binario de máximos (para que la ordenación sea ascendente) 2. Se recorre el vector desde el final hasta la posición 1. Para cada posición i: 2.1. Se intercambia el valor máximo (el que se encuentra en la posición 1) con el de la posición i. De esta forma, el elemento máximo ya ocupa su posición final (vector[1] ↔ vector[i]) 2.2. Se repara el montículo (pues en vector[1] puede que ya no esté el máximo) sin modificar la parte ya ordenada (a partir de la posición i el vector ya está ordenado). Para ello, se utiliza el método hundir modificado (hundirElem), indicando la posición hasta la que se quiere hundir el nodo 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 68 El TAD Árbol Tema 3 Ordenación mediante montículos (heapsort) (II) El algoritmo que reorganiza un vector para que pase a representar un montículo de máximos se basa en las siguientes ideas: Llama a la función hundirElem sobre cada nodo en sentido inverso al recorrido por niveles. Cuando se realice la llamada con el nodo i se habrán procesado todos los descendientes del nodo i con una llamada a hundirElem No hace falta ejecutar hundirElem sobre las hojas, por lo que se comienza con el nodo de mayor índice que no sea una hoja template <typename T> void hacerMonticulo(T vect[ ], int n) var int i; fvar inicio para (i = n / 2; i > 0; i --) hacer hundirElem(vect, i, n); fpara fin 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 69 El TAD Árbol Tema 3 Ordenación mediante montículos (heapsort) (III) Versión de hundir para un montículo de máximos indicando la posición hasta dónde debe hundir template <typename T> void hundirElem (T vect[ ], int hueco, int n) var Elemento e; int hijo; boolean esMonticulo; fvar inicio e = vect [hueco] hijo = hueco * 2 esMonticulo = falso mientras hijo <= n && !esMonticulo hacer si hijo < n && vect[hijo] < vect[hijo+1] entonces hijo++ fsi si vect[hijo] > e entonces vect[hueco] = vect[hijo] hueco = hijo hijo = hueco * 2 sino esMonticulo = verdad fsi fmientras vect[hueco] = e fin 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 70 El TAD Árbol Tema 3 Ordenación mediante montículos (heapsort) (IV) La complejidad temporal de heapsort viene dada por el número de veces que se llama a hundirElem, que tiene un coste logarítmico respecto al número de nodos del árbol sobre el que se hunde El montículo sobre el que se hunde siempre tiene tamaño i, así que el coste de cada una de las llamadas a hundirElem es, en el peor de los casos, de orden O(log2(i)) Si n es el número de datos a ordenar (longitud del vector), la función de complejidad temporal para heapsort es, en el peor de los casos, O(n * log2 n), ya que hay que ejecutar n veces la función hundirElem 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas template <typename T> void heapsort (T v[ ], int n) var T elem; int i fvar inicio hacerMonticulo( v, n ) para (i = n; i > 1; i - - ) elem = v[i] v[i] = v[1] v[1] = elem hundirElem(v,1, i -1) fpara fin Universidad de Huelva 71 Árboles generales Tema 3 3.7 Árboles generales Especificación algebraica La operación básica de la signatura de los árboles generales es la de “enraizar” un número indeterminado de árboles para formar un nuevo árbol La sintaxis de las especificaciones algebraicas no permite declarar operaciones con un número indeterminado de parámetros Debemos definir nuevos conceptos que nos ayuden a construir la especificación algebraica Un bosque ordenado de grado n (n ≥ 1) es una secuencia A1, …, Am (0 ≤ m ≤ n) de árboles n-arios ordenados. Si m = 0, el bosque se llama vacío Un árbol n-ario ordenado se genera a partir de un elemento r y un bosque de grado n, considerando al elemento r la raíz del nuevo árbol y el bosque como sus subárboles Definimos el tipo bosque como una lista en la que los elementos son árboles 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 72 Árboles generales Tema 3 espec arbolesGenerales usa booleanos, naturales, listas parámetro formal género elemento fpf renombrar lista<árbol> por bosque géneros árbol operaciones _ Θ _ : elemento bosque Æ árbol raíz: árbol Æ elemento hijos: árbol Æ bosque parcial subárbol: árbol natural Æ árbol numHijos: árbol Æ natural hoja?: árbol Æ booleano altura: árbol Æ natural privada altBosque: bosque Æ natural 2005 -2006 Estructuras de Datos II Gen (árbol) = Mod (árbol) = Obs (árbol) = I.T. en Informática de Gestión/Sistemas Universidad de Huelva 73 Árboles generales Tema 3 dominios de definición b: bosque; i: natural; e: elemento subárbol (e Θ b, i) está definido sólo si ecuaciones b: bosque; i: natural; e: elemento; a: árbol raíz (e Θ b) = hijos (e Θ b) = subárbol (e Θ b, i) = numHijos (e Θ b) = hoja? (e Θ b) = o también hoja? (a) = altura (a) = altBosque ([ ]) = altBosque (+izq (a, b)) = fespec 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 74 Árboles generales Tema 3 Implementación del árbol general Una forma de implementar los árboles es mediante punteros, usando una representación denominada “primogénito – siguiente hermano” ¾ Consiste en crear, para cada nodo, una lista dinámica con sus hijos La clase árbol es un puntero a un objeto con tres propiedades: la información almacenada en el nodo, un puntero al objeto correspondiente al primer hijo y otro puntero al objeto correspondiente al siguiente hermano a 3 3 14 · 15 14 9 2005 -2006 2 6 33 Estructuras de Datos II 9 15 · 2 · I.T. en Informática de Gestión/Sistemas 6 · · 33 Universidad de Huelva · · · 75 Árboles generales Tema 3 Se define una clase NodoArbol, que representa a cada uno de los nodos que forman un árbol general template <typename T> class NodoArbol { typedef NodoArbol<T>* PtrNodoArbol; public: NodoArbol(const T& objeto); NodoArbol(const T& objeto, PtrNodoArbol ph, PtrNodoArbol sh); NodoArbol(const NodoArbol& n); const T& getObj() const; PtrNodoArbol getPrimHijo() const; PtrNodoArbol getSigHermano() const; void setObj(const T& objeto); void setPrimHijo(PtrNodoArbol ph); void setSigHermano(PtrNodoArbol sh); private: T obj; PtrNodoArbol primHijo, sigHermano; }; 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 76 Árboles generales Tema 3 template <typename T> class Arbol { typedef NodoArbol<T>* PtrNodoArbol; typedef Lista< Arbol <T> > Bosque; public: Arbol(const T& objeto, const Bosque& b); Arbol(const Arbol& a); const T& getRaiz() const; const Bosque& hijos() const; int numHijos() const; const Arbol& subarbol(int i) const throw(SubarbolExcepcion); bool esHoja() const; int altura() const; bool operator==(const Arbol& a) const; ~Arbol(); private: PtrNodoArbol raiz; Arbol(PtrNodoArbol p); int altBosque(const Bosque& b) const; }; 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 77 Árboles generales Tema 3 Arbol(const T& objeto, const Bosque& b) var PtrNodoArbol antHermano Arbol hijo Bosque::Iterador it fvar inicio raiz = nuevo NodoArbol<T>(objeto) si ¬ b.esVacia() entonces it = b.principio() hijo = b.observar( it ) raiz->setPrimHijo( hijo.raiz ) antHermano = hijo.raiz it.avanzar( b ) mientras it ≠ b.final() hacer hijo = b.observar( it ) antHermano->setSigHermano( hijo.raiz ) antHermano = hijo.raiz it.avanzar( b ) fmientras fsi fin 2005 -2006 Estructuras de Datos II const Arbol<T>& subarbol(int i) const throw(SubarbolExcepcion) var PtrNodoArbol p int j fvar inicio si i<1 entonces lanzar SubarbolExcepcion() fsi p = raiz->getPrimHijo() j=1 mientras (p ≠ NULO) ∧ (j < i) hacer p = p->getSigHermano() j=j+1 fmientras si p == NULO entonces lanzar SubarbolExcepcion() fsi devolver Arbol( p ) fin I.T. en Informática de Gestión/Sistemas Universidad de Huelva 78 Árboles generales Tema 3 int altura() const inicio si esHoja() entonces devolver 1 sino devolver 1 + altBosque( hijos() ) fsi fin 2005 -2006 Estructuras de Datos II int altBosque(const Bosque& b) const var int alt, altMax Bosque::Iterador it fvar inicio altMax = 0 it = b.principio() mientras it ≠ b.final() hacer alt = b.observar(it).altura() si alt > altMax entonces altMax = alt fsi it.avanzar(b) fmientras devolver altMax fin I.T. en Informática de Gestión/Sistemas Universidad de Huelva 79 Árboles B y B+ Tema 3 3.8 Árboles B y B+ Problema de los ABB cuando se usa almacenamiento secundario: 5 la búsqueda de un elemento requeriría muchos accesos a disco (un acceso a disco es extremadamente lento si lo comparamos con un acceso a memoria) 5 Ej.: para un millón de elementos ⇒ Nº accesos a disco = O(h) = O(log2 1.000.000) ≈ 20 Solución: conseguir mayor grado de ramificación para así tener menor altura en el árbol. La altura de un árbol M-ario (multicamino) completo es O(logM N) 5 Ej.: para un millón de elementos y M = 10 ⇒ Nº accesos a disco = O(h) = O(log10 1.000.000) = 6 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 80 Árboles B y B+ Tema 3 5 Almacenar más datos en cada nodo del árbol, sin que el incremento suponga un trabajo extra de localización de un elemento en el nodo. Este nodo se llamará página p0 k1 p1 k2 p2 ...ki-1 pi-1 ki…km-1 pm-1 Una página es un nodo donde los ki son elementos tales que ki-1 < ki, donde 0 < i < m, y pi, donde 0 ≤ i < m, son apuntadores a subárboles ∀i =1..m-2, pi apunta a una página cuyas claves son mayores o iguales que ki y menores que ki+1 p0 apunta a una página cuyas claves son menores que k1 pm-1 apunta a una página cuyas claves son mayores o iguales que km-1 A cada página se accede en bloque 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 81 Árboles B Tema 3 3.8.1 Árboles B Caso especial de árboles equilibrados, cuyos nodos pueden tener más de dos hijos y cuyas ramas están ordenadas a modo de árbol binario de búsqueda Propuesto por Bayer y McCreight Su principal utilidad se encuentra en la gestión de los índices en bases de datos Formalmente: a) Cada página, excepto la página raíz y las páginas hojas, tienen entre ⎡m/2⎤ y m hijos, donde m es el orden del árbol b) Cada página, excepto la raíz, contiene entre ⎡m/2⎤ - 1 y m - 1 elementos c) La página raíz, o es una hoja o tiene entre 2 y m hijos d) Las páginas hojas están todas al mismo nivel 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 82 Árboles B Tema 3 Ej. de árbol B de orden 5: 5 Cada nodo, excepto la raíz, puede tener entre 3 y 5 hijos 5 Cada página, excepto la raíz, contiene entre entre 2 y 4 elementos 5 La página raíz tiene 2 hijos 25 3 1 2005 -2006 2 4 5 Estructuras de Datos II 9 15 10 13 37 50 16 17 28 33 39 48 I.T. en Informática de Gestión/Sistemas 52 55 67 89 Universidad de Huelva 83 Árboles B Tema 3 Operación de búsqueda Generalización del proceso de búsqueda en ABB La página sobre la cual vamos a buscar debe estar en memoria principal Sea x el elemento buscado Pasos: 1. Si n (número de elementos de la página) es suficientemente grande, se puede utilizar la búsqueda binaria. En caso contrario, una búsqueda secuencial será suficiente 2. Si la búsqueda es infructuosa se estará en una de las siguientes situaciones: 3. 2005 -2006 a. ki -1< x < ki para 1 < i ≤ n. La búsqueda continúa en la página apuntada por pi-1 b. kn < x. La búsqueda continúa en la página apuntada por pn c. x < k1. La búsqueda continúa en la página apuntada por p0 Si en algún caso el apuntador pi es nulo, es decir, si no hay página hijo, entonces no hay ningún elemento x en todo el árbol y se acaba la búsqueda Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 84 Árboles B Tema 3 Operación de inserción Pasos: 5 Se busca la clave a insertar en el árbol siguiendo el algoritmo anterior 5 Si la clave no está en el árbol, la búsqueda termina en un nodo hoja 5 Si el nodo hoja no está lleno (n < m – 1), la inserción es posible en dicho nodo y el proceso termina Ej: inserción del 45 25 3 1 2 4 9 5 15 10 13 37 50 16 17 28 33 39 48 52 55 67 89 25 3 1 2005 -2006 2 4 5 Estructuras de Datos II 9 15 10 13 37 50 16 17 28 33 39 45 48 I.T. en Informática de Gestión/Sistemas 52 55 67 89 Universidad de Huelva 85 Árboles B Tema 3 Operación de inserción Pasos: 5 Si la hoja está llena (n = m –1), se divide el nodo (incluyendo virtualmente la nueva clave) en dos nodos. La clave central sube en el árbol por el camino de búsqueda para ser insertada en el nodo antecedente. En esta ascensión puede ocurrir que se llegue al nodo raíz y éste se encuentre lleno. En ese caso, aumenta en 1 la altura del árbol Ej: inserción del 70 25 3 1 2 4 5 9 15 10 13 37 50 16 17 28 33 39 48 52 55 67 89 25 3 1 2005 -2006 2 4 5 Estructuras de Datos II 9 15 10 13 37 50 16 17 28 33 39 48 I.T. en Informática de Gestión/Sistemas 67 52 55 70 89 Universidad de Huelva 86 Árboles B Tema 3 Operación de eliminación Casos: 5 El elemento a borrar se encuentra en una página hoja ⇒ se suprime 5 La clave a borrar no se encuentra en una página hoja, entonces debe sustituirse por la clave que se encuentra más a la izquierda en el subárbol derecho o por la clave que se encuentra más a la derecha en el subárbol izquierdo 5 Debe verificarse el valor de n después de la eliminación: 5 Si n ≥ ⎡m/2⎤ –1 entonces se trasladan las claves hacia la izquierda y termina la operación de borrado 5 En caso contrario, se exploran las páginas hermanas adyacentes. Si en alguna de ellas, n > ⎡m/2⎤ –1, uno de los elementos sube al nodo padre para que descienda de éste otra clave al nodo que se quiere restaurar 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 87 Árboles B Tema 3 Operación de eliminación 5 Ej: eliminación del 39 25 3 1 2 4 5 9 15 10 13 37 50 16 17 28 33 39 48 52 55 67 89 25 3 1 2005 -2006 2 4 Estructuras de Datos II 5 9 15 10 13 37 52 16 17 28 33 48 50 I.T. en Informática de Gestión/Sistemas 55 67 89 Universidad de Huelva 88 Árboles B Tema 3 Operación de eliminación Debe verificarse el valor de n después de la eliminación: 5 Si en las páginas hermanas contiguas n = ⎡m/2⎤ –1, se fusiona con una de sus hermanas adyacentes, incluyendo en el nuevo nodo el elemento del padre situado entre ambas páginas. Esta fusión puede dejar al padre con un número de elementos por debajo del mínimo ⇒ comienza de nuevo todo el proceso, que puede propagarse hasta la raíz 5 Si se utiliza el último elemento de la raíz, la altura del árbol disminuye en una unidad 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 89 Árboles B Tema 3 Operación de eliminación 5 Ej: eliminación del 25 25 3 1 2 4 9 5 15 10 13 37 50 16 17 28 33 39 48 52 55 67 89 17 3 1 2005 -2006 2 4 Estructuras de Datos II 9 5 37 50 10 13 15 16 28 33 39 48 I.T. en Informática de Gestión/Sistemas 52 55 67 89 Universidad de Huelva 90 Árboles B Tema 3 Operación de eliminación 5 Ej: eliminación del 33 17 3 1 2 4 9 37 50 10 13 5 3 1 2005 -2006 2 Estructuras de Datos II 4 5 10 13 15 16 9 28 33 17 15 16 39 48 52 55 67 89 50 28 37 39 48 I.T. en Informática de Gestión/Sistemas 52 55 67 89 Universidad de Huelva 91 Árboles B+ Tema 3 3.8.2 Árboles B+ Los árboles-B+ se han convertido en la técnica más utilizada para la organización de archivos indexados Todas las claves se encuentran en las hojas (a diferencia de los árboles-B, en que las claves podían estar en las páginas intermedias) y por lo tanto cualquier camino desde la raíz hasta alguna de las claves tienen la misma longitud Formalmente: a) Cada página, excepto la raíz, tiene entre ⎡m/2⎤ y m descendientes b) Cada página, excepto la raíz , contiene entre ⎡m/2⎤ –1 y m –1 elementos c) La página raíz, o es hoja o tiene al menos 2 hijos d) Las páginas hojas están todas al mismo nivel e) Todas las claves se encuentran en las páginas hojas f) Las claves de las páginas raíz e interiores se utilizan como índices g) Las hojas están enlazadas 2005 -2006 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 92 Árboles B+ Tema 3 Observaciones: 5 La aparición de una clave en un nodo interior no garantiza su existencia en un nodo hoja 5 Al buscar un elemento, si éste se encuentra en una página raíz o interior, debe continuarse la búsqueda por la rama derecha de dicha clave, hasta llegar a una hoja Ej. de árbol B+ de orden 5: 29 13 20 10 11 2005 -2006 13 15 Estructuras de Datos II 35 45 20 23 26 27 29 32 35 37 I.T. en Informática de Gestión/Sistemas 45 49 Universidad de Huelva 93