3.6 montículos y colas de prioridadmcast/esdatos/tads/ttema3... · las operaciones más usuales...
TRANSCRIPT
56
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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
El TAD Árbol
3.6 Montículos y Colas de Prioridad
57
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
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
1115
56
26
137
27 37 35
2
1115
56
26
137
27 37 35
58
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
- 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⎦
El TAD Árbol
Implementación
59
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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
El TAD Árbol
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.
47
50
22
19124432
94137316
50 47 22 32 44 12 19 16 3 37 41 9 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
60
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
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);
}
Las interfaces informales de las clases Elemento y Cola de Prioridad son:
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
61
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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.
El TAD Árbol
62
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
15
11
flotar
11
15
15
11
15
11
flotarflotar
11
15
11
15
11
15 12
11
15 12
11
15 12
20
11
15 12
20
Ejemplo
- Creación de un montículo con los siguientes elementos: 15, 11, 12, 20, 5, 16, 8
11
15 12
20 5
flotar
11
5 12
20 15
flotar
5
11 12
20 15
11
15 12
20 5
11
15 12
20 5
flotarflotar
11
5 12
20 15
11
5 12
20 15
flotarflotar
5
11 12
20 15
5
11 12
20 15 16 8
flotar
5
11 8
20 15 16 12
5
11 12
20 15 16 8
5
11 12
20 15 16 8
flotarflotar
5
11 8
20 15 16 12
5
11 8
20 15 16 12
15
5
11 12
20 15 16
5
11 12
20 15 16
63
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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.
El TAD Árbol
64
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
5
11 8
20 15 16 12
sustituir
12
11 8
20 15 16
hundir
8
11 12
20 15 16
5
11 8
20 15 16 12
5
11 8
20 15 16 12
sustituirsustituir
12
11 8
20 15 16
12
11 8
20 15 16
hundirhundir
8
11 12
20 15 16
8
11 12
20 15 16
16
11 12
20 15
hundir
11
16 12
20 15
hundir
11
15 12
20 16
16
11 12
20 15
16
11 12
20 15
hundirhundir
11
16 12
20 15
11
16 12
20 15
hundirhundir
11
15 12
20 16
11
15 12
20 16
Ejemplo- Evolución del montículo anterior, eliminando sucesivamente algunos de sus elementos.
16
15 12
20
hundir
12
15 16
20
16
15 12
20
16
15 12
20
hundirhundir
12
15 16
20
12
15 16
20
65
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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ículoint tamAct; // número de elementos del montículoint 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]
}
El TAD Árbol
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;
}
66
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
bool esVacio() const ()inicio
return tamAct == 0;fin
void insertar(const Elemento& elem) throw (MonticuloLlenoExcepcion);
// Inserción en un montículo de mínimosiniciosi (tamAct == capacidad-1)
lanzar MonticuloLlenoExcepcion();fsi; tamAct++;vector[tamAct] = elem; flotar (tamAct);
fin
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
void flotar (int hueco);var Elemento e fvarinicio
e = vector [hueco];mientras (vector[hueco/2].getPrio() > e.getPrio()) hacer
vector[hueco] = vector[hueco/2]; // baja al hueco el padrehueco = hueco/2 // sube un nivel en el árbol
fmientrasvector[hueco] = e; // sitúa el elemento en su posición
fin
67
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
void suprimir ( ) throw (MonticuloVacioExcepcion);
// Borrado en un montículo de mínimosiniciosi (tamAct == 0)
lanzar MonticuloVacioExcepcion();fsi; vector[1] = vector[tamAct];tamAct--;hundir (1);
fin
void hundir (int hueco)var Elemento e; int hijo; boolean esMonticulo; fvarinicio
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 intercambiosi (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;
fmientrasvector[hueco] = e;
fin
68
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
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
69
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
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; fvarinicio
para (i = n / 2; i > 0; i --) hacerhundirElem(vect, i, n);
fparafin
70
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
Ordenación mediante montículos (heapsort) (III)
template <typename T> void hundirElem (T vect[ ], int hueco, int n)var Elemento e; int hijo; boolean esMonticulo; fvarinicio
e = vect [hueco]hijo = hueco * 2 esMonticulo = falsomientras hijo <= n && !esMonticulo hacer
si hijo < n && vect[hijo] < vect[hijo+1] entonceshijo++
fsisi vect[hijo] > e entonces
vect[hueco] = vect[hijo]hueco = hijohijo = hueco * 2
sinoesMonticulo = verdad
fsifmientrasvect[hueco] = e
fin
Versión de hundir para un montículo de máximos indicando la posición hasta dónde debe hundir
71
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
El TAD Árbol
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 heapsortes, en el peor de los casos, O(n * log2 n), ya que hay que ejecutar n veces la función hundirElem
template <typename T> void heapsort (T v[ ], int n) var T elem; int i fvarinicio
hacerMonticulo( v, n )para (i = n; i > 1; i - - )
elem = v[i]v[i] = v[1]v[1] = elemhundirElem(v,1, i -1)
fparafin
72
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles generales
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
73
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles generales
espec arbolesGeneralesusa booleanos, naturales, listasparámetro formal
género elementofpfrenombrar lista<árbol> por bosquegéneros árboloperaciones
_ Θ _ : elemento bosque árbolraíz: árbol elementohijos: árbol bosqueparcial subárbol: árbol natural árbolnumHijos: árbol naturalhoja?: árbol booleanoaltura: árbol naturalprivada altBosque: bosque natural
Gen (árbol) =
Mod (árbol) =
Obs (árbol) =
74
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles generales
dominios de definición b: bosque; i: natural; e: elementosubá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
75
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles generales
3
1514
9 332 6
3
1514
9 332 6
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
3
14
9 2 33
15
6
·
· · · · · ·
·
a
3
14
9 2 33
15
6
·
· · · · · ·
·
a
76
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles generales
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;
} ;
Se define una clase NodoArbol, que representa a cada uno de los nodos que forman un árbol general
77
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles generales
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;
};
78
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles generales
Arbol(const T& objeto, const Bosque& b)var
PtrNodoArbol antHermanoArbol hijoBosque::Iterador it
fvarinicio
raiz = nuevo NodoArbol<T>(objeto)si ¬ b.esVacia() entonces
it = b.principio()hijo = b.observar( it )raiz->setPrimHijo( hijo.raiz )antHermano = hijo.raizit.avanzar( b )mientras it ≠ b.final() hacer
hijo = b.observar( it )antHermano->setSigHermano( hijo.raiz )antHermano = hijo.raizit.avanzar( b )
fmientrasfsi
fin
const Arbol<T>& subarbol(int i) const throw(SubarbolExcepcion)var
PtrNodoArbol p int j
fvarinicio
si i<1 entonceslanzar SubarbolExcepcion()
fsip = raiz->getPrimHijo()j = 1mientras (p ≠ NULO) ∧ (j < i) hacer
p = p->getSigHermano()j = j + 1
fmientrassi p == NULO entonces
lanzar SubarbolExcepcion()fsidevolver Arbol( p )
fin
79
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Árboles generales
int altBosque(const Bosque& b) constvar
int alt, altMaxBosque::Iterador it
fvarinicio
altMax = 0it = b.principio()mientras it ≠ b.final() hacer
alt = b.observar(it).altura()si alt > altMax entonces
altMax = altfsiit.avanzar(b)
fmientrasdevolver altMax
fin
int altura() constinicio
si esHoja() entoncesdevolver 1
sinodevolver 1 + altBosque( hijos() )
fsifin
80
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
3.8 Árboles B y B+
Problema de los ABB cuando se usa almacenamiento secundario:
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)
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)
Ej.: para un millón de elementos y M = 10
⇒ Nº accesos a disco = O(h) = O(log10 1.000.000) = 6
Árboles B y B+
81
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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
Árboles B y B+
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
82
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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
Árboles B
3.8.1 Árboles B
83
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Ej. de árbol B de orden 5:
Cada nodo, excepto la raíz, puede tener entre 3 y 5 hijos
Cada página, excepto la raíz, contiene entre entre 2 y 4 elementos
La página raíz tiene 2 hijos
Árboles B
25
37 50
39 4828 3316 1710 134 51 2
3 9 15
52 55 67 89
84
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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:
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
3. 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
Árboles B
Operación de búsqueda
85
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Pasos:
Se busca la clave a insertar en el árbol siguiendo el algoritmo anterior
Si la clave no está en el árbol, la búsqueda termina en un nodo hoja
Si el nodo hoja no está lleno (n < m – 1), la inserción es posible en dicho nodo y el proceso terminaEj: inserción del 45
Árboles B
Operación de inserción
25
37 50
39 4828 3316 1710 134 51 2
3 9 15
52 55 67 89
25
37 50
39 45 4828 3316 1710 134 51 2
3 9 15
52 55 67 89
86
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Pasos:
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 árbolEj: inserción del 70
Árboles B
Operación de inserción
25
37 50 67
39 4828 3316 1710 134 51 2
3 9 15
52 55 70 89
25
37 50
39 4828 3316 1710 134 51 2
3 9 15
52 55 67 89
87
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Casos:
El elemento a borrar se encuentra en una página hoja ⇒ se suprime
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
Debe verificarse el valor de n después de la eliminación:
Si n ≥ ⎡m/2⎤ –1 entonces se trasladan las claves hacia la izquierda y termina laoperación de borrado
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
Árboles B
Operación de eliminación
88
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Ej: eliminación del 39
Árboles B
25
37 50
39 4828 3316 1710 134 51 2
3 9 15
52 55 67 89
Operación de eliminación
25
37 52
48 5028 3316 1710 134 51 2
3 9 15
55 67 89
89
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Debe verificarse el valor de n después de la eliminación:
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
Si se utiliza el último elemento de la raíz, la altura del árbol disminuye en una unidad
Árboles B
Operación de eliminación
90
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Ej: eliminación del 25
Árboles B
25
37 50
39 4828 3316 1710 134 51 2
3 9 15
52 55 67 89
Operación de eliminación
17
37 50
39 4828 334 5
3 9
52 55 67 891 2 10 13 15 16
91
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Ej: eliminación del 33
Árboles B
Operación de eliminación
17
37 50
39 4828 334 5
3 9
52 55 67 891 2 10 13 15 16
4 5 52 55 67 8928 37 39 48
3 9 17 50
1 2 10 13 15 16
92
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
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
Árboles B+
3.8.2 Árboles B+
93
Tema 3
Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva2005 -2006
Observaciones:
La aparición de una clave en un nodo interior no garantiza su existencia en un nodo hoja
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:
Árboles B+
13 20
13 1510 11
35 45
29 32 35 37 45 49
29
20 23 26 27