Ttema3(parte 2)_0506 - escuela de informática UTEM

Anuncio
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
Descargar