Colas de prioridad

2.887 visualizaciones

Publicado el

0 comentarios
2 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
2.887
En SlideShare
0
De insertados
0
Número de insertados
16
Acciones
Compartido
0
Descargas
27
Comentarios
0
Recomendaciones
2
Insertados 0
No insertados

No hay notas en la diapositiva.

Colas de prioridad

  1. 1. Tema 7 Colas de prioridad 7.1. Plantillas de clases y funciones en C++ 7.2. El TAD Cola de Prioridad 7.3. El mont´ ıculo binario (heap)IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 1
  2. 2. Plantillas de clases y funciones en C++Hasta ahora hemos dotado de cierto grado de genericidad a una clase mediante unadefinici´n de tipo: o typedef int TBL;que obliga a modificar la definici´n de la clase y recompilarla para adaptar la clase al otipo espec´ ıfico que necesitamos.£ C++ proporciona un mecanismo expl´ ıcito para definir clases y funciones gen´ricas. eUna plantilla de clase o de funci´n es un modelo para crear clases o funciones en oel que se parametrizan uno o m´s tipos o valores. a template <class TBL> template <class TBABB> class Lista { class ArbolBB; public: ... template <class T> private: int SeparaIntervalo ... (T* vec, int n, T inf, T sup); };IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 2
  3. 3. Plantillas de clases y funciones en C++Declaraci´n y definici´n de plantillas de clase o o£ Una declaraci´n o definici´n de plantilla empieza con template. o o£ A continuaci´n se da una lista de par´metros de plantilla, separados por comas o a y delimitados por < y >. No puede estar vac´ ıa.£ Un par´metro de plantilla puede ser de tipo o de expresi´n constante. a o Par´metro de tipo. Se compone de class o typename y un identificador. a class y typename son equivalentes en esta lista de par´metros. a Cualquier tipo predefinido de C++ (int, float, char*, etc.) o definido por el usuario podr´ ser un argumento v´lido como par´metro de tipo. a a a Un par´metro de tipo es un especificador de tipo en toda la definici´n de la a o plantilla. Puede usarse en los mismos contextos que un tipo en una clase. Par´metro de expresi´n constante. Es una declaraci´n normal de un par´metro. a o o a El nombre del par´metro representa un valor constante. aIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 3
  4. 4. Plantillas de clases y funciones en C++Transformaci´n de la clase Vector (de enteros) en una plantilla de clase. oclass Vector { public: typedef int TBV; explicit Vector(int cap_inicial=0) { capacidad=cap_inicial; elementos=new TBV[cap_inicial]; } ...};template <class TBV>class Vector { public: explicit Vector(int cap_inicial=0) { capacidad=cap_inicial; elementos=new TBV[cap_inicial]; } ...}; // El resto de la definici´n de la plantilla es igual que la de la clase Vector oIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 4
  5. 5. Plantillas de clases y funciones en C++Tras la lista de par´metros de plantilla, se da la declaraci´n o definici´n de la plantilla a o ode clase, exactamente igual que una declaraci´n o definici´n normal de clase. o oDentro de la definici´n de la plantilla de clase, su nombre puede utilizarse como oespecificador de tipo, igual que se hacia hasta ahora con el nombre de una clase.£ Cada ocurrencia de Vector dentro de su definici´n es un abreviatura de o Vector<TBV>.£ Esta abreviatura s´lo puede utilizarse aqu´ y dentro de la definici´n de sus miembros. o ı oCuando se utiliza fuera de su definici´n, se debe especificar la lista de par´metros o acompleta: Vector<TBV>.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 5
  6. 6. Plantillas de clases y funciones en C++Instanciaci´n de plantillas de clase oUna definici´n de plantilla de clase sirve como modelo para la generaci´n autom´tica o o ade instancias de tipo espec´ ıfico de la clase.Cuando despu´s se escribe: e Vector<double> vd;se crea autom´ticamente una clase Vector cuyos componentes son de tipo double. a£ El resultado es equivalente a reescribir el texto de la definici´n de la plantilla de o clase sustituyendo TBV por double y quitando template <class TBV>.La creaci´n de una clase concreta a partir de una plantilla gen´rica de clase se llama o einstanciaci´n de la plantilla. o Vector<int> vi; ⇐ vector de enteros Vector<char*> vpc; ⇐ vector de punteros a caracteres Vector<bool> *pvb; ⇐ puntero a vector de booleanosIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 6
  7. 7. Plantillas de clases y funciones en C++Cada instanciaci´n de una plantilla de clase es una clase independiente o£ Los objetos de la clase Vector<int> no tienen permiso de acceso a los miembros no p´blicos de Vector<char*>. uLa lista de argumentos de plantilla se separa por comas y se delimita por < y >,asoci´ndose los tipos y valores espec´ a ıficos dados en la instanciaci´n a los par´metros o ade plantilla por su posici´n. o£ Vector<int> es un nombre de clase, e <int> es su lista de argumentos.Una instancia de una plantilla de clase puede utilizarse en un programa donde puedautilizarse cualquier clase, y sus objetos se declaran y usan como los de cualquier clase. void Ordena(Vector<long> & vl) { ... } Vector<float> *pvf = new Vector<float>[100];IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 7
  8. 8. Plantillas de clases y funciones en C++M´todos de las plantillas de clase eSe pueden definir dentro de la definici´n de la plantilla de clase (inline), o fuera. oSi un m´todo se define fuera, debe hacerse con una sintaxis especial: e template <class TBV> inline Vector<TBV>::Vector(int cap_inicial) { capacidad = cap_inicial; elementos = new TBV[cap_inicial]; }Se debe escribir template con la misma lista de par´metros que la plantilla de aclase, para que el m´todo sea una plantilla de funci´n con los mismos par´metros. e o aSe debe cualificar el nombre del m´todo (constructor, en este caso) con el nombre de ela plantilla de clase acompa˜ada de la lista de par´metros de plantilla. n aEn el cuerpo del m´todo, los par´metros de plantilla se pueden usar sin cualificar. e aIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 8
  9. 9. Plantillas de clases y funciones en C++template <class TBV>void Vector<TBV>::Inicia(int pri, int fin, TBV val) { ...}template <class TBV>Vector<TBV> & Vector<TBV>::operator=(const Vector & der) { ...}template <class TBV>void Vector<TBV>::ModificaCapacidad(int nueva_cap) { ...}template <class TBV>void Vector<TBV>::Mostrar(ostream & fsal) const { ...} // El c´digo de cada uno de estos m´todos de la plantilla es el mismo o e // que hab´ en su correspondiente m´todo de la clase Vector ıa eIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 9
  10. 10. Plantillas de clases y funciones en C++Plantillas de funci´n oSe declaran y definen igual que las plantillas de clase:£ template m´s la lista de par´metros. a a£ Despu´s se declara o define la plantilla como una funci´n normal, incluyendo el uso e o de los par´metros de plantilla. aLa instanciaci´n de plantillas de funci´n es distinta de las de clase. o o£ En principio, no es necesario dar la lista de argumentos de plantilla, porque puede deducirse de los tipos de los argumentos de funci´n. o£ Cuando sea necesario puede darse una lista expl´ ıcita de argumentos de plantilla.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 10
  11. 11. Plantillas de clases y funciones en C++template <class T>int SeparaIntervalo(T* vec, int n, const T & inf, const T & sup) { int ult = -1; T tmp; for (int i=0 ; i < n ; i++) if (inf <= vec[i] && vec[i] <= sup) { ult++; tmp = vec[ult]; vec[ult] = vec[i]; vec[i] = tmp; } return(ult);}...char vc[500];double * vd = new double[3000];...int u1 = SeparaIntervalo(vc,500,’g’,’m’);int u2 = SeparaIntervalo(vd,3000,34.0945,7772.8097021);int u3 = SeparaIntervalo<double>(vd,3000,34.0945,7772.8097021);IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 11
  12. 12. Plantillas de clases y funciones en C++Las plantillas se pueden sobrecargar, conjuntamente con las funciones normales.£ El compilador elegir´ la m´s apropiada para una llamada entre las funciones y las a a instancias factibles de las plantillas, seg´n los argumentos y sus tipos. utemplate <class T>int SeparaIntervalo(Vector<T> & vec, const T & inf, const T & sup) { int ult = -1; T tmp; for (int i=0 ; i < vec.Capacidad() ; i++) if (inf <= vec[i] && vec[i] <= sup) { ult++; tmp = vec[ult]; vec[ult] = vec[i]; vec[i] = tmp; } return(ult);}...long * vl1 = new long[1000];Vector<long> vl2(2500);...int u4 = SeparaIntervalo(vl1,1000,999999,4999999);int u5 = SeparaIntervalo(vl2,999999,4999999);IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 12
  13. 13. Plantillas de clases y funciones en C++Amistad en las plantillas de claseConoceremos s´lo la declaraci´n de amistad de una plantilla de funci´n en una de o o oclase en la que ambas utilizan la misma lista de par´metros de plantilla. atemplate <class TBV> class Vector { friend ostream & operator<< <TBV>(ostream &, const Vector<TBV> &); ...};template <class Tipo>ostream & operator<<(ostream & fsal, const Vector<Tipo> & v) { fsal << "["; if (v.capacidad > 0) { for (int i=0 ; i < v.capacidad-1 ; i++) fsal << v.elementos[i] << ", "; fsal << v.elementos[v.capacidad-1]; } fsal << "]"; Una instancia de tipo espec´ıfico de la plantilla de clase s´lo o} da acceso a instancias del mismo tipo de la plantilla de funci´n. oIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 13
  14. 14. Plantillas de clases y funciones en C++Cuando se instancie Vector con un determinado tipo, como por ejemplo: struct Punto3D { double x, y, z; }; Vector<short> vec1; Vector<Punto3D> vec2;es responsabilidad del programador asegurarse de que ese tipo est´ provisto del eoperador de salida <<, ya que es necesario en: fsal << v.elementos[i] << ", ";As´ no se obtendr´ error de compilaci´n al escribir: ı, a o cout << vec1; ⇐ Correcto cout << vec2; ⇐ Error: Punto3D no tiene definido <<Si el tipo no dispone del operador de salida <<, puede instanciarse Vector, y nohabr´ ninguna pega mientras no se utilice el operador de salida de Vector. aIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 14
  15. 15. Plantillas de clases y funciones en C++Tipos anidados en plantillas de clasesSe puede anidar la definici´n de una plantilla de clase dentro de la definici´n de otra. o otemplate <class TBP> template <class TBP>class Pila { class Pila { public: public: ... ... private: private: struct Nodo { template <class TBP> struct Nodo { TBP elem; Nodo * sig; TBP elem; Nodo * sig; Nodo(const TBP& e, Nodo* s) Nodo(const TBP& e, Nodo* s) { elem = e; sig = s; } { elem = e; sig = s; } }; }; typedef Nodo * Enlace; typedef Nodo<TBP> * Enlace; Enlace top; Enlace top; int talla; int talla; ... La clase anidada se ... ... y debe entenderse como}; define de esta manera }; si se realizase esta asociaci´n oIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 15
  16. 16. Plantillas de clases y funciones en C++£ Aunque la definici´n de la plantilla anidada no va precedida de template <class o TBP>, es una plantilla de manera autom´tica y el par´metro TBP se puede a a utilizar dentro de su definici´n. o£ Se asocia cada instanciaci´n de la clase contenedora para un tipo espec´ o ıfico con la instanciaci´n de la clase anidada para el mismo tipo espec´ o ıfico.Tambi´n se pueden anidar definiciones de tipos (typedef) y enumeraciones (enum) een una plantilla de clase.£ Un tipo p´blico anidado puede referenciarse fuera de la plantilla, pero debe ser u referenciado como miembro de una instancia, y no de la plantilla. Por ejemplo, si Enlace fuese p´blico deber´ referenciarse como: u ıa Pila<int>::Enlace ptraux; y no como: Pila::Enlace ptraux;IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 16
  17. 17. Plantillas de clases y funciones en C++Compilaci´n de plantillas de clase oCuando el compilador procesa la definici´n de una plantilla de clase se guarda una orepresentaci´n interna, pero no genera c´digo correspondiente a la misma. o oCuando se instancia una plantilla de clase para un tipo espec´ ıfico, entonces s´ se ıgenera c´digo correspondiente a esta instancia, utilizando la representaci´n interna o oguardada previamente.Para ello siempre es necesario que la definici´n de la plantilla haya sido procesada oantes de que la plantilla tenga que instanciarse.Para asegurar que esto se realiza en todo fichero que requiera una instanciaci´n de la oplantilla, conviene:£ colocar la definici´n de plantillas de clase en ficheros de cabecera .h, e o£ incluirlos en los ficheros necesarios (como se hace con la definici´n de clases). oIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 17
  18. 18. Plantillas de clases y funciones en C++Respecto a los m´todos, miembros de clase y tipos anidados de una plantilla de clase, eel est´ndar C++ ofrece dos posibilidades: a£ A˜adir su definici´n a la definici´n de la plantilla de clase en el fichero de cabecera. n o o£ Dar su definici´n en un fichero de c´digo separado .c++ (igual que se hace con la o o definici´n de los m´todos, miembros de clase y tipos anidados de una clase). o eEsta segunda posibilidad a´n no es factible utilizarla. No est´ soportada por muchos u acompiladores, y por algunos s´lo parcialmente. oUsaremos la primera forma de definici´n de miembros de la plantilla de clase. o£ Aunque ello tiene la desventaja de no encapsular los detalles de la implementaci´n, o tendremos la ventaja de poder compilar directamente y de la misma forma en cualquier compilador.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 18
  19. 19. Plantillas de clases y funciones en C++Cuando se define una plantilla de clase o sus miembros, se debe tener en cuentaqu´ identificadores utilizados dependen de alg´n par´metro de la plantilla y cu´les no. e u a a£ Los nombres que no dependen de par´metros de la plantilla se resuelven al procesar a la definici´n de la plantilla. o£ Los que s´ dependen de alg´n par´metro de la plantilla se resuelven al instanciar la ı u a plantilla para alg´n tipo espec´ u ıfico.En ambos casos, los identificadores utilizados deber´n estar declarados o definidos aantes de que se necesiten.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 19
  20. 20. Plantillas de clases y funciones en C++vector, de la STL de C++, ofrece las operaciones de Vector y muchas m´s. a #include <vector>£ Constructor: vector<double> v(64), u, x(28,-13.987); Se puede iniciar el vector con el valor dado como segundo argumento. Si no, lo inicia al valor por defecto del tipo.£ Destructor£ Constructor copia: vector<double> w(v);£ Asignaci´n: u = v; o£ Indexaci´n (para lectura y escritura de elementos): v[i] = w[j] + u[k]; o£ Consulta de su talla: v.size()£ Modificaci´n de su talla: o w.resize(17); x.resize(1024,-0.001);IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 20
  21. 21. El TAD Cola de PrioridadUna cola de prioridad es una generalizaci´n de los conceptos de pila y cola en la oque, tras entrar en la cola, la salida de los elementos no se basa necesariamente enel orden de llegada sino que se basa en un orden definido entre ellos.La extracci´n de elementos de una cola de prioridad puede buscar minimizar o omaximizar el valor del elemento saliente.£ La interpretaremos en el sentido de minimizar. Para maximizar tan s´lo hay que o cambiar el sentido de las comparaciones.En el modelo b´sico de una cola de prioridad la operaciones que consideramos son: a£ insertar en la cola,£ obtener el elemento m´ ınimo, y£ eliminar el elemento m´ ınimo.La realizaci´n de estas operaciones no requiere mantener ordenada (ni total ni oparcialmente) la colecci´n de elementos en la cola. oIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 21
  22. 22. El TAD Cola de PrioridadAlgunas aplicaciones importantes de las colas de prioridad:£ Gesti´n de procesos en un sistema operativo. Los procesos no se ejecutan uno o tras otro en base a su orden de llegada. Algunos procesos deben tener prioridad (por su mayor importancia, por su menor duraci´n, etc.) sobre otros. o£ Implementaci´n de algoritmos voraces, los cuales proporcionan soluciones globales o a problemas bas´ndose en decisiones tomadas s´lo con informaci´n local. La a o o determinaci´n de la mejor opci´n local suele basarse en una cola de prioridad. o o Algunos algoritmos sobre grafos, como la obtenci´n de caminos o ´rboles de o a expansi´n de m´ o ınimo coste, son ejemplos representativos de algoritmos voraces basados en colas de prioridad.£ Implementaciones eficientes de algoritmos de simulaci´n de sucesos discretos. En o ´stas, el avance del tiempo no se gestiona incrementando un reloj unidad a unidad, e sino incrementado sucesivamente el reloj al instante del siguiente suceso.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 22
  23. 23. El TAD Cola de PrioridadTAD Cola de PrioridadElementos: En el conjunto de elementos X hay definido un orden lineal <: ∀x, y ∈ X , x = y ⇒ (x < y ∧ y < x) ∨ (y < x ∧ x < y). CP es el conjunto de multiconjuntos finitos de elementos de X . (En un multiconjunto los elementos pueden repetirse. P.e.: {7, 4, 7, 2, 7, 4}.)Operaciones: Dados CP ∈ CP y x ∈ X : Crear() : Devuelve ∅. Destruir(CP ) : Elimina CP . ıa(CP ) : Devuelve cierto si CP = ∅, y falso si CP = ∅. Est´Vac´ a Longitud(CP ) : Devuelve |CP | (cardinalidad del multiconjunto).IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 23
  24. 24. El TAD Cola de PrioridadOperaciones (cont.): ınimo(CP ) : Si CP = ∅, entonces devuelve y ∈ CP tal que ∀z ∈ CP , y ≤ z; M´ en otro caso, error. Insertar(CP ,x) : Devuelve CP = CP ∪ {x}. (En la uni´n de multiconjuntos A ∪ B, las ocurrencias de los elementos de A se o a˜aden a las de B. P.e.: {7, 4, 7, 2, 7, 4}∪{4, 5, 1, 4} = {7, 4, 7, 2, 7, 4, 4, 5, 1, 4}.) n EliminarM´ ın(CP ) : Si CP = ∅, entonces devuelve CP = CP − {M´ ınimo(CP )}; en otro caso, error. (En la diferencia de multiconjuntos A−B, para cada elemento de A se descuentan tantas ocurrencias como haya en B de ese elemento. Si en B hay las mismas o m´s ocurrencias de un elemento que en A, ´ste no est´ en A − B. P.e.: a e a {7, 4, 7, 2, 7, 4} − {4, 2, 7, 2, 4} = {7, 7}.)IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 24
  25. 25. El TAD Cola de PrioridadEjemplos:CP =Crear() Insertar(CP ,32) Insertar(CP ,13) M´ ınimo(CP )= 13 {} { 32 } { 32, 13 } { 32, 13 }EliminarM´ ın(CP ) Insertar(CP ,7) Insertar(CP ,26) Insertar(CP ,7) { 32 } { 7, 32 } { 7, 32, 26 } { 7, 32, 7, 26 }M´ ınimo(CP )= 7 EliminarM´ ın(CP ) Insertar(CP ,18) Insertar(CP ,18) { 7, 32, 7, 26 } { 7, 32, 26 } { 7, 32, 26, 18 } { 7, 18, 32, 26, 18 }Longitud(CP )= 5 EliminarM´ ın(CP ) EliminarM´ ın(CP ) M´ ınimo(CP )= 18 { 7, 18, 32, 26, 18 } { 18, 32, 26, 18 } { 18, 32, 26 } { 18, 32, 26 }IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 25
  26. 26. El TAD Cola de PrioridadEficiencia de diferentes implementaciones b´sicas a Costes en el peor caso: Insertar M´ ınimo EliminarM´ ın Lista O(1) O(n) O(n) Lista con acceso al m´ ınimo O(1) O(1) O(n) Lista ordenada O(n) O(1) O(1) ´ Arbol Binario de B´squeda u O(n) O(n) O(n) • en el caso promedio: O(log n) O(log n) O(log n) ´ Arbol AVL (equilibrado) O(log n) O(log n) O(log n) Mont´ ıculo binario (heap) O(log n) O(1) O(log n)IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 26
  27. 27. El TAD Cola de PrioridadImplementaciones eficientes de colas de prioridadOperaciones adicionales requeridas habitualmente:£ Formar una cola de prioridad a partir de n elementos dados inicialmente.£ Cambiar la prioridad de un elemento dado de la cola.£ Eliminar un elemento dado de la cola (no el m´ ınimo).£ Combinar dos colas para formar una unica cola con los elementos de ambas. ´ Costes en el peor caso: Insertar M´ ınimo EliminarM´ Combinar Formar ın ıculo binario (heap) O(log n) Mont´ O(1) O(log n) O(n) O(n) Mont´ ıculo a la izquierda O(log n) O(1) O(log n) O(log n) O(n) Cola binomial O(log n) O(1) O(log n) O(log n) O(n)Otras implementaciones ofrecen costes asint´ticos amortizados iguales o m´s eficientes o a(unitarios para algunas operaciones): mont´ ıculos oblicuos y mont´ıculos de Fibonacci.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 27
  28. 28. El mont´ ıculo binario (heap)El mont´ ıculo binario es la implementaci´n espec´ o ıfica m´s b´sica y habitual de una a acola de prioridad.Tambi´n es frecuente referirse a ´l por su nombre en ingl´s: “(binary) heap”. e e eUn heap es un ´rbol binario con dos propiedades adicionales: estructural y de orden. aEstructura de heap. Un heap es un ´rbol binario casi completo con n nodos. a£ Un ´rbol binario casi completo con n nodos se puede almacenar en un vector con a n o m´s componentes. a£ Numerando los nodos del ´rbol binario casi completo por niveles, de arriba a abajo a y de izquierda a derecha, cada nodo i del heap se almacena en la posici´n i del o vector.£ No se necesitan punteros para acceder a los hijos o al padre de un nodo.£ Principal problema: se debe estimar a priori el tama˜o m´ximo del heap. n aIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 28
  29. 29. El mont´ ıculo binario (heap) A 1 B 2 3 C 4 5 6 7 D 8 9 10 11 12 13 14 15 E 16 17 18 19 20 21 22     ¡ ¡   ¡   ¡ A B C D E 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31Dado un nodo cualquiera i, 1 ≤ i ≤ n:£ Su hijo izquierdo est´ en 2i (si tiene; es decir, si 2i ≤ n). a£ Su hijo derecho est´ en 2i + 1 (si tiene; es decir, si 2i + 1 ≤ n). a£ Su padre est´ en i/2 (si tiene; es decir, si i > 1). aIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 29
  30. 30. El mont´ ıculo binario (heap)Orden de heap. En un heap, el elemento situado en cada nodo es menor o igual queel elemento situado en cualquiera de sus hijos (si el nodo tiene alg´n hijo). u£ El elemento m´ ınimo siempre est´ en la ra´ a ız.£ En cada sub´rbol se verifica el orden de heap. a£ El elemento m´ximo est´ en una hoja. a a 7 7 23 15 23 18 74 55 18 20 55 74 15 20 93 87 61 99 36 51 93 87 61 99 36 51 heap no es heapIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 30
  31. 31. El mont´ ıculo binario (heap)1 #include "errores.h" // Plantilla heap.h2 #include <vector>3 using namespace std;4 template <class TBH> // TBH debe tener definido el operador <5 class Heap {6 public:7 explicit Heap(int maxelems=1000)8 { maxheap=maxelems; elems=new TBH[maxheap+1]; talla=0; }9 ~Heap() { delete [] elems; }10 Heap(const Heap & der) { elems = 0; operator=(der); }11 Heap & operator=(const Heap & der);12 void Vaciar() { talla = 0; }13 bool EstaVacio() const { return(talla == 0); }14 bool EstaLleno() const { return(talla == maxheap); }15 int Longitud() const { return(talla); }16 const TBH & Minimo() const;17 void Insertar(const TBH & item);18 void EliminarMin();19 void FormarHeap(const vector<TBH> & items);IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 31
  32. 32. El mont´ ıculo binario (heap)20 private:21 TBH *elems;22 int talla, maxheap;23 void Hundir(int hueco);24 };25 template <class TBH>26 Heap<TBH> &27 Heap<TBH>::operator=(const Heap & der) {28 if (this != &der) {29 delete [] elems;30 maxheap = der.maxheap;31 elems = new TBH[maxheap+1];32 talla = der.talla;33 for (int i=1 ; i <= talla ; i++)34 elems[i] = der.elems[i];35 }36 return(*this);37 }IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 32
  33. 33. El mont´ ıculo binario (heap)Minimo.38 template <class TBH>39 const TBH & Tama˜o del problema n40 Heap<TBH>::Minimo() const { n: n´mero de elementos en el heap u41 if (talla == 0) Error("Minimo");42 return(elems[1]);43 } t Minimo(n) = Θ(1)Insertar.En un heap de n elementos, al insertar uno nuevo se deber´ utilizar la posici´n n + 1 a odel vector para mantener la estructura de heap.Si se preserva el orden de heap al situarlo en el hueco (nodo n + 1), fin de la inserci´n. oSi no, el nuevo elemento ser´ menor que el elemento que est´ en el padre del hueco. a a⇒ Se baja el elemento del nodo padre al hueco y ahora el hueco queda en el padre.Este proceso se repite hasta colocar el nuevo elemento en un hueco. En el peor caso,el hueco ascender´ hasta la ra´ a ız.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 33
  34. 34. El mont´ ıculo binario (heap) 9 17 9 18 34 26 31 66 47 58 34 48 33 75 99 71 92 58 61 87 12 9 17 9 18 34 26 31 66 47 12 34 48 33 75 99 71 92 58 61 87 58IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 34
  35. 35. El mont´ ıculo binario (heap) 9 17 9 18 12 26 31 66 47 34 34 48 33 75 99 71 92 58 61 87 58 9 12 9 18 17 26 31 66 47 34 34 48 33 75 99 71 92 58 61 87 58IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 35
  36. 36. El mont´ ıculo binario (heap)Partiendo desde el nodo n + 1 al insertar, la violaci´n del orden de heap s´lo puede o oaparecer en el camino desde este nodo a la ra´ e ir´ traslad´ndose a lo largo de ´l. ız, a a eSi el elemento de i es menor que el de i/2 , al intercambiarlos queda el menor comopadre de dos mayores. El del hermano (i − 1 ´ i + 1) ya era mayor que el del padre. oSi el elemento de i debe seguir subiendo a i/2 /2 , el que baje a i/2 ser´ menor aque los que hab´ en i/2 e i − 1 ´ i + 1. Al inicio, el orden de heap se cumpl´ ıa o ıa.44 template <class TBH>45 void46 Heap<TBH>::Insertar(const TBH & item) { En promedio, el47 if (talla == maxheap) Error("Insertar"); coste de insertar48 talla++; es constante.49 int hueco;50 for (hueco=talla ; hueco > 1 && item < elems[hueco/2] ; hueco /= 2)51 elems[hueco] = elems[hueco/2];52 elems[hueco] = item;53 } t Insertar(n) = Ω(1), O(log n)IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 36
  37. 37. El mont´ ıculo binario (heap)EliminarMin.En un heap de n elementos, al eliminar uno se deber´ inutilizar la posici´n n del a ovector, dej´ndolo con n − 1 elementos, para mantener la estructura de heap. aComo el elemento que se elimina es el m´ ınimo y ´ste est´ en la ra´ inicialmente e a ız,tenemos un hueco en la ra´ y el elemento que estaba en la posici´n n por recolocar. ız oSi se preserva el orden de heap al situar el elemento en el hueco, fin de la eliminaci´n. oSi no (lo m´s probable), el elemento por recolocar ser´ mayor que alguno de los a aelementos que est´n en los hijos del hueco. a⇒ Se sube el menor de los elementos de los hijos al hueco y ahora el hueco queda en el nodo hijo en el que estaba este menor elemento.Este proceso se repite hasta recolocar el elemento pendiente en un hueco. En el peorcaso, el hueco descender´ hasta las hojas. a IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 37
  38. 38. El mont´ ıculo binario (heap) 9 58 12 9 18 17 26 31 66 47 34 34 48 33 75 99 71 92 58 61 87 9 12 58 18 17 26 31 66 47 34 34 48 33 75 99 71 92 58 61 87IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 38
  39. 39. El mont´ ıculo binario (heap) 9 12 26 18 17 58 31 66 47 34 34 48 33 75 99 71 92 58 61 87 9 12 26 18 17 33 31 66 47 34 34 48 58 75 99 71 92 58 61 87IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 39
  40. 40. El mont´ ıculo binario (heap)Al eliminar, la violaci´n del orden de heap s´lo puede aparecer en el camino desde la o ora´ a las hojas, e ir´ traslad´ndose a lo largo de ´l. ız a a eSi el elemento de i es mayor que el de 2i y/o el de 2i + 1, al intercambiarlo con elmenor de ellos queda el menor como padre de dos mayores.Si el elemento de i debe seguir bajando a 2(2i), 2(2i) + 1, 2(2i + 1) ´ 2(2i + 1) + 1, oel que suba a 2i ´ 2i + 1 ser´ mayor que el que ahora est´ en i (antes en 2i ´ 2i + 1). o a a oAl inicio, el orden de heap se cumpl´ ıa.54 template <class TBH>55 void56 Heap<TBH>::EliminarMin() {57 if (talla == 0) Error("EliminarMin");58 elems[1] = elems[talla];59 talla--;60 Hundir(1);61 } t EliminarMin(n) = Ω(1), O(log n)IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 40
  41. 41. El mont´ ıculo binario (heap)El m´todo privado Hundir permite unificar la implementaci´n de EliminarMin y e oFormarHeap. Ambas operaciones del heap se basan en el mismo proceso.62 template <class TBH>63 void64 Heap<TBH>::Hundir(int hueco) {65 TBH tmp = elems[hueco];66 int hijo;67 while (true) {68 hijo = hueco*2;69 if (hijo < talla && elems[hijo+1] < elems[hijo]) hijo++;70 if (hijo > talla || !(elems[hijo] < tmp)) break;71 elems[hueco] = elems[hijo];72 hueco = hijo;73 }74 elems[hueco] = tmp;75 } t Hundir(n) = Ω(1), O(log n)IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 41
  42. 42. El mont´ ıculo binario (heap)FormarHeap.Disponiendo de n elementos inicialmente, se puede formar un heap con ellos medianten inserciones sucesivas partiendo de un heap vac´ ıo.£ Coste en el peor caso: O(n log n)£ Coste en el caso promedio: O(n)Aproximaci´n alternativa: o£ Situar los elementos arbitrariamente en las n primeras posiciones del vector elems ⇒ se crea un ´rbol binario con estructura de heap, aunque no con orden de heap. a£ Considerando los nodos hoja como heaps de 1 nodo, comenzando desde el nodo n/2 y procediendo nodo a nodo decrecientemente hasta la ra´ establecer el ız, orden de heap en el sub´rbol con ra´ en el nodo considerado. a ız Para ello, se debe hundir el elemento del nodo considerado en su sub´rbol hasta a que alcance su nivel adecuado.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 42
  43. 43. El mont´ ıculo binario (heap) 99 92 87 75 71 66 61 58 58 47 48 34 34 33 31 26 18 17 12 9 99 92 87 75 71 66 61 58 58 9 48 34 34 33 31 26 18 17 12 47IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 43
  44. 44. El mont´ ıculo binario (heap) 99 92 87 75 71 66 61 58 12 9 48 34 34 33 31 26 18 17 58 47 99 92 87 75 71 66 61 18 12 9 48 34 34 33 31 26 58 17 58 47IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 44
  45. 45. El mont´ ıculo binario (heap) 99 92 87 75 71 66 31 18 12 9 48 34 34 33 61 26 58 17 58 47 99 92 87 75 71 34 31 18 12 9 48 66 34 33 61 26 58 17 58 47IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 45
  46. 46. El mont´ ıculo binario (heap) 99 92 87 75 9 34 31 18 12 47 48 66 34 33 61 26 58 17 58 71 99 92 87 12 9 34 31 18 17 47 48 66 34 33 61 26 58 75 58 71IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 46
  47. 47. El mont´ ıculo binario (heap) 99 92 31 12 9 34 33 18 17 47 48 66 34 87 61 26 58 75 58 71 99 9 31 12 47 34 33 18 17 71 48 66 34 87 61 26 58 75 58 92IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 47
  48. 48. El mont´ ıculo binario (heap) 9 12 31 17 47 34 33 18 58 71 48 66 34 87 61 26 58 75 99 9276 template <class TBH>77 void78 Heap<TBH>::FormarHeap(const vector<TBH> & items) {79 if (maxheap < items.size()) Error("FormarHeap");80 for (talla=0 ; talla < items.size() ; talla++)81 elems[talla+1] = items[talla];82 for (int i=talla/2 ; i > 0 ; i--)83 Hundir(i);84 } t FormarHeap(n) = Θ(n)IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 48
  49. 49. El mont´ ıculo binario (heap)Breve an´lisis del coste de FormarHeap. aMejor caso. Desde n/2 hasta 1, el elemento de cada nodo considerado es el menor de su sub´rbol ⇒ el n´mero de asignaciones (desplazamientos de elementos) a u realizadas por Hundir es 2 · n/2 . Por tanto, es Ω(n).Peor caso. Desde n/2 hasta 1, el elemento de cada nodo considerado debe hundirse hasta una de las hojas m´s profundas de su sub´rbol. a a El n´mero de asignaciones (desplazamientos de elementos) realizadas por Hundir u es 2 · n/2 + S, siendo S la suma de las alturas de los nodos y S < n. Por tanto, es O(n). Por ejemplo, denominando hi a la altura del nodo i, en el heap anterior: 10 S= hi = 4 + 3 + 2 + 2 + 2 + 1 + 1 + 1 + 1 + 1 = 18 < 20 = n i=1 hi = 0, 11 ≤ i ≤ 20IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 49
  50. 50. El mont´ ıculo binario (heap)Aplicaci´n: C´digos de Huffman o oUna secuencia de s´ımbolos se puede codificar en binario estableciendo a priori elconjunto de s´ ımbolos (alfabeto) y asign´ndoles c´digos binarios de longitud fija. a o Por ejemplo, el est´ndar ASCII utiliza 7 bits para codificar 128 d´ a ıgitos decimales, letras may´sculas y min´sculas, s´ u u ımbolos de puntuaci´n y otros caracteres. o La secuencia CD54 se codifica en ASCII como 1000011100010001101010110100.Si el n´mero de s´ u ımbolos es n, los c´digos deben tener una longitud fija de log2 n obits para disponer de suficientes c´digos. oGeneralmente, esta codificaci´n produce secuencias de bits (ficheros) de mayor tama˜o o nque otras, desaprovechando espacio de almacenamiento o tiempo de transmisi´n.oAsignando c´digos binarios de longitud variable a los s´ o ımbolos, de manera que losm´s frecuentes tengan c´digos m´s cortos y los m´s infrecuentes m´s largos, se puede a o a a areducir el tama˜o de las secuencias codificadas en binario (ficheros). nIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 50
  51. 51. El mont´ ıculo binario (heap)Como ejemplo, consideremos un fichero compuesto s´lo por los siguientes s´ o ımbolos,que aparecen el n´mero de veces indicado. u c´digo 1 o n´mero u c´digo 2 o n´mero u s´ ımbolos frecuencia long. fija de bits long. variable de bits 4 8 000 24 000 24 5 22 001 66 001 66 C 25 010 75 010 75 D 23 011 69 011 69 E 15 100 45 10 30 F 7 101 21 11 14 n´mero total de bits del fichero: u 300 278Sin aprovechar la informaci´n de las frecuencias, ya se obtiene ganancia al reducir a odos bits el c´digo de dos s´ o ımbolos.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 51
  52. 52. El mont´ ıculo binario (heap)Un c´digo binario puede representarse mediante un ´rbol binario de codificaci´n. o a o£ Los s´ ımbolos se sit´an en los nodos. u£ En cada nodo no terminal, la rama al hijo izquierdo representa un 0 y la rama al hijo derecho un 1.£ El c´digo de cada s´ o ımbolo se corresponde con el camino desde la ra´ al nodo que ız lo contiene. 0 1 0 1 0 1 0 0 1 0 1 E F 0 1 0 1 0 1 0 1 0 1 4 5 C D E F 4 5 C D c´digo 1 o c´digo 2 oIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 52
  53. 53. El mont´ ıculo binario (heap)Un ´rbol de codificaci´n que tenga nodos sin s´ a o ımbolo y con un s´lo hijo produce osecuencias codificadas m´s largas que las que produce otro en el que estos nodos se afusionan con sus unicos hijos. As´ todos los nodos tienen dos hijos o ninguno. ´ ı,Si todos los s´ ımbolos est´n en las hojas, ning´n c´digo es prefijo de otro. a u o£ Una codificaci´n con esta propiedad es un c´digo libre de prefijos (“prefix code”). o oAs´ una secuencia de bits se descodifica de forma no ambigua e instant´nea. ı, a£ La secuencia 101001001100000101011 es no ambigua para los c´digos 1 y 2. o Descodificaci´n con c´digo 1: o o F 5 5 E 4 F D 101001001100000101011 Descodificaci´n con c´digo 2: E E o o C D 4 5 C F£ C´digo ambiguo: (4, 000), (5, 001), (C, 010), (D, 011), (E, 00), (F, 01). o ¿C´mo se descodifica 010000? ¿C4 = 010-000 ´ FEE = 01-00-00? o oIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 53
  54. 54. El mont´ ıculo binario (heap)Llamando p(a) a la profundidad de la hoja en la que est´ el s´ a ımbolo a del alfabeto Ay f (a) a su frecuencia, el coste de un ´rbol binario de codificaci´n para A es: a o p(a) · f (a) a∈AEste coste coincide con el n´mero total de bits calculado anteriormente. uEst´ claro que podemos definir distintos c´digos binarios de longitud variable, para un a oconjunto de s´ ımbolos, que tendr´n distinto coste. aDado un conjunto de s´ ımbolos A y sus frecuencias en un fichero, ¿podemos encontrarun ´rbol binario de codificaci´n ´ptimo para A, es decir, cuyo coste sea m´ a o o ınimo?De esta manera, obtendr´ ıamos un c´digo binario ´ptimo que necesitar´ el menor o o ıan´mero total de bits para representar el fichero. uEste c´digo es ´ptimo para una codificaci´n del tipo “s´ o o o ımbolo - c´digo de longitud ovariable (libre de prefijos)”, dados un alfabeto y las frecuencias de sus s´ ımbolos. Otrostipos de codificaci´n pueden reducir m´s el n´mero de bits empleados. o a uIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 54
  55. 55. El mont´ ıculo binario (heap)Algoritmo de HuffmanTrabaja con un bosque, que es una colecci´n de ´rboles. o aInicialmente, cada par (s´ ımbolo,frecuencia) forma un ´rbol de un s´lo nodo en el a obosque.Iterativamente, hasta que el bosque tenga un s´lo ´rbol: o a£ Se seleccionan los dos ´rboles con menor coste (da lo mismo c´mo se resuelvan los a o empates).£ Se forma un nuevo ´rbol binario, creando un nuevo nodo ra´ que contendr´: a ız a como coste la suma de los costes de los dos ´rboles seleccionados, y a como hijos a dichos ´rboles (da lo mismo cu´l sea el izquierdo y cu´l el derecho). a a aIS13. Estructuras de datos y de la informaci´n — 2003/2004 o 55
  56. 56. El mont´ ıculo binario (heap) Inicio: 4 5 C D E F 8 22 25 23 15 7 15 Iteraci´n 1: o F 4 5 C D E 7 8 22 25 23 15 30 Iteraci´n 2: o E 15 15 F 4 5 C D 7 8 22 25 23IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 56
  57. 57. El mont´ ıculo binario (heap) 30 Iteraci´n 3: o E 15 15 45 F 4 5 D C 7 8 22 23 25 55 C 25 30 Iteraci´n 4: o E 15 15 45 F 4 5 D 7 8 22 23IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 57
  58. 58. El mont´ ıculo binario (heap) 100 55 45 Iteraci´n 5: o C 5 D 25 30 22 23 E 15 15 F 4 7 8Coste del ´rbol de codificaci´n de Huffman obtenido: a o 2 · 25 + 4 · 7 + 4 · 8 + 3 · 15 + 2 · 22 + 2 · 23 = 245IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 58
  59. 59. El mont´ ıculo binario (heap)El algoritmo de Huffman es un algoritmo voraz que, partiendo de los s´ ımbolos y susfrecuencias, va creando local y sucesivamente sub´rboles de m´ a ınimo coste, y finalizaobteniendo el ´rbol binario de codificaci´n de m´ a o ınimo coste (codificaci´n ´ptima de o olongitud variable y libre de prefijos).£ La selecci´n de los ´rboles del bosque con menor coste para formar otro puede o a hacerse con un heap.El ´rbol de codificaci´n de Huffman puede utilizarse para implementar dos programas a ode compresi´n y descompresi´n de ficheros. o o£ Para ello, el ´rbol de codificaci´n debe incluirse en el fichero comprimido (con una a o representaci´n adecuada), ya que sino ser´ imposible descomprimir. o a£ Esta manera de comprimir y descomprimir tiene el inconveniente de que la compre- si´n necesita dos recorridos del fichero original: uno para calcular las frecuencias y o otro para codificar.IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 59

×