3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales...

38
56 Tema 3 Estructuras de Datos II I.T. en Informática de Gestión/Sistemas Universidad de Huelva 2005 -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

Transcript of 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales...

Page 1: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 2: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 3: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 4: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 5: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 6: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 7: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 8: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 9: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 10: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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;

}

Page 11: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 12: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 13: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 14: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 15: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 16: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 17: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 18: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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) =

Page 19: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 20: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 21: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVací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

Page 22: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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;

};

Page 23: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 24: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 25: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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+

Page 26: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 27: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 28: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 29: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 30: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 31: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 32: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 33: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 34: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 35: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 36: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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

Page 37: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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+

Page 38: 3.6 Montículos y Colas de Prioridadmcast/ESDATOS/TADS/Ttema3... · Las operaciones más usuales que se realizan sobre una cola de prioridad son: eliminar, insertar, primero y esVacía.

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