SlideShare uma empresa Scribd logo
1 de 59
Baixar para ler offline
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
Plantillas de clases y funciones en C++

Hasta ahora hemos dotado de cierto grado de genericidad a una clase mediante una
definici´n de tipo:
       o
         typedef int TBL;
que obliga a modificar la definici´n de la clase y recompilarla para adaptar la clase al
                                o
tipo espec´
          ıfico que necesitamos.
£ C++ proporciona un mecanismo expl´
                                   ıcito para definir clases y funciones gen´ricas.
                                                                           e
Una plantilla de clase o de funci´n es un modelo para crear clases o funciones en
                                  o
el 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
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.
                      a

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                      3
Plantillas de clases y funciones en C++


Transformaci´n de la clase Vector (de enteros) en una plantilla de clase.
            o

class 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
                                 o

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                      4
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           o
de clase, exactamente igual que una declaraci´n o definici´n normal de clase.
                                                o             o

Dentro de la definici´n de la plantilla de clase, su nombre puede utilizarse como
                      o
especificador 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                       ı                       o

Cuando se utiliza fuera de su definici´n, se debe especificar la lista de par´metros
                                     o                                     a
completa: Vector<TBV>.


IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                         5
Plantillas de clases y funciones en C++

Instanciaci´n de plantillas de clase
           o
Una definici´n de plantilla de clase sirve como modelo para la generaci´n autom´tica
            o                                                         o       a
de 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                                                     e
instanciaci´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 booleanos

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                      6
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*>.
      u

La 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           a
de 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 pueda
utilizarse 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
Plantillas de clases y funciones en C++

M´todos de las plantillas de clase
 e
Se pueden definir dentro de la definici´n de la plantilla de clase (inline), o fuera.
                                     o
Si 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
                                                          a
clase, para que el m´todo sea una plantilla de funci´n con los mismos par´metros.
                    e                               o                    a
Se debe cualificar el nombre del m´todo (constructor, en este caso) con el nombre de
                                  e
la plantilla de clase acompa˜ada de la lista de par´metros de plantilla.
                            n                      a
En el cuerpo del m´todo, los par´metros de plantilla se pueden usar sin cualificar.
                  e             a

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                         8
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                       e

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                 9
Plantillas de clases y funciones en C++


Plantillas de funci´n
                   o

Se 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.
            a

La 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
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
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.
                                             u
template <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
Plantillas de clases y funciones en C++

Amistad en las plantillas de clase
Conoceremos s´lo la declaraci´n de amistad de una plantilla de funci´n en una de
                o              o                                    o
clase en la que ambas utilizan la misma lista de par´metros de plantilla.
                                                    a
template <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.
                                                                                o

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                  13
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
                                                                 e
operador 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 no
habr´ ninguna pega mientras no se utilice el operador de salida de Vector.
     a

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                  14
Plantillas de clases y funciones en C++

Tipos anidados en plantillas de clases
Se puede anidar la definici´n de una plantilla de clase dentro de la definici´n de otra.
                          o                                                o
template <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
                                                                                                       o

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                         15
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)
      e
en 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
Plantillas de clases y funciones en C++


Compilaci´n de plantillas de clase
         o
Cuando el compilador procesa la definici´n de una plantilla de clase se guarda una
                                          o
representaci´n interna, pero no genera c´digo correspondiente a la misma.
            o                           o
Cuando 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                                                                 o
guardada previamente.
Para ello siempre es necesario que la definici´n de la plantilla haya sido procesada
                                               o
antes de que la plantilla tenga que instanciarse.
Para asegurar que esto se realiza en todo fichero que requiera una instanciaci´n de la
                                                                             o
plantilla, 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).
                                                                   o

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                       17
Plantillas de clases y funciones en C++


Respecto a los m´todos, miembros de clase y tipos anidados de una plantilla de clase,
                e
el 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          e

Esta segunda posibilidad a´n no es factible utilizarla. No est´ soportada por muchos
                          u                                   a
compiladores, y por algunos s´lo parcialmente.
                             o
Usaremos 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
Plantillas de clases y funciones en C++


Cuando se define una plantilla de clase o sus miembros, se debe tener en cuenta
qu´ 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
                                                   a
antes de que se necesiten.




IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                      19
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
El TAD Cola de Prioridad

Una cola de prioridad es una generalizaci´n de los conceptos de pila y cola en la
                                              o
que, tras entrar en la cola, la salida de los elementos no se basa necesariamente en
el 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
           o
maximizar 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
            o
parcialmente) la colecci´n de elementos en la cola.
                        o

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                    21
El TAD Cola de Prioridad

Algunas 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
El TAD Cola de Prioridad


TAD Cola de Prioridad

Elementos:             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
El TAD Cola de Prioridad

Operaciones (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
El TAD Cola de Prioridad


Ejemplos:
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
El TAD Cola de Prioridad


Eficiencia 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
El TAD Cola de Prioridad

Implementaciones eficientes de colas de prioridad

Operaciones 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
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 a
cola de prioridad.
Tambi´n es frecuente referirse a ´l por su nombre en ingl´s: “(binary) heap”.
     e                           e                       e
Un heap es un ´rbol binario con dos propiedades adicionales: estructural y de orden.
              a
Estructura 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   a

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                     28
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 31

Dado 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).
               a

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                            29
El mont´
                                                ıculo binario (heap)


Orden de heap. En un heap, el elemento situado en cada nodo es menor o igual que
el 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 heap

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                                                 30
El mont´
                                              ıculo binario (heap)

1    #include "errores.h"                         // Plantilla heap.h
2    #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
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
El mont´
                                              ıculo binario (heap)

Minimo.
38 template <class TBH>
39 const TBH &                                               Tama˜o del problema
                                                                  n
40 Heap<TBH>::Minimo() const {                                n: n´mero de elementos en el heap
                                                                  u
41   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                   o
del 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.
                                                                                      o
Si 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
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        58

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                                  34
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        58

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                                  35
El mont´
                                              ıculo binario (heap)

Partiendo desde el nodo n + 1 al insertar, la violaci´n del orden de heap s´lo puede
                                                     o                     o
aparecer en el camino desde este nodo a la ra´ e ir´ traslad´ndose a lo largo de ´l.
                                              ız,   a        a                   e
Si el elemento de i es menor que el de i/2 , al intercambiarlos queda el menor como
padre de dos mayores. El del hermano (i − 1 ´ i + 1) ya era mayor que el del padre.
                                             o
Si el elemento de i debe seguir subiendo a i/2 /2 , el que baje a i/2 ser´ menor
                                                                           a
que 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   void
46   Heap<TBH>::Insertar(const TBH & item) {                   En promedio, el
47     if (talla == maxheap) Error("Insertar");                coste de insertar
48     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
El mont´
                                               ıculo binario (heap)

EliminarMin.

En un heap de n elementos, al eliminar uno se deber´ inutilizar la posici´n n del
                                                      a                   o
vector, dej´ndolo con n − 1 elementos, para mantener la estructura de heap.
           a

Como 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                                     o

Si se preserva el orden de heap al situar el elemento en el hueco, fin de la eliminaci´n.
                                                                                     o

Si no (lo m´s probable), el elemento por recolocar ser´ mayor que alguno de los
           a                                          a
elementos 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 peor
caso, el hueco descender´ hasta las hojas.
                         a

 IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                             o                                       37
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        87

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                                38
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        87

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                              39
El mont´
                                              ıculo binario (heap)

Al eliminar, la violaci´n del orden de heap s´lo puede aparecer en el camino desde la
                       o                      o
ra´ a las hojas, e ir´ traslad´ndose a lo largo de ´l.
  ız                 a        a                    e
Si el elemento de i es mayor que el de 2i y/o el de 2i + 1, al intercambiarlo con el
menor 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,
                                                                      o
el que suba a 2i ´ 2i + 1 ser´ mayor que el que ahora est´ en i (antes en 2i ´ 2i + 1).
                  o          a                           a                   o
Al inicio, el orden de heap se cumpl´
                                    ıa.
54   template <class TBH>
55   void
56   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
El mont´
                                              ıculo binario (heap)


El m´todo privado Hundir permite unificar la implementaci´n de EliminarMin y
    e                                                    o
FormarHeap. Ambas operaciones del heap se basan en el mismo proceso.

62   template <class TBH>
63   void
64   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
El mont´
                                              ıculo binario (heap)

FormarHeap.
Disponiendo de n elementos inicialmente, se puede formar un heap con ellos mediante
n 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
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        47

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                              43
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        47

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                             44
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        47

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                             45
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        71

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                             46
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        92

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                              47
El mont´
                                                  ıculo binario (heap)

                                                                   9

                                          12                                          31

                      17                                 47                 34                  33

            18                  58                  71        48       66        34        87        61

       26        58        75        99        92

76   template <class TBH>
77   void
78   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
El mont´
                                              ıculo binario (heap)

Breve an´lisis del coste de FormarHeap.
        a
Mejor 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 ≤ 20

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                           49
El mont´
                                              ıculo binario (heap)

Aplicaci´n: C´digos de Huffman
        o    o
Una secuencia de s´ımbolos se puede codificar en binario estableciendo a priori el
conjunto 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
                                     o
bits para disponer de suficientes c´digos.
                                  o
Generalmente, esta codificaci´n produce secuencias de bits (ficheros) de mayor tama˜o
                            o                                                    n
que otras, desaprovechando espacio de almacenamiento o tiempo de transmisi´n.o
Asignando c´digos binarios de longitud variable a los s´
             o                                            ımbolos, de manera que los
m´s frecuentes tengan c´digos m´s cortos y los m´s infrecuentes m´s largos, se puede
  a                     o        a               a                 a
reducir el tama˜o de las secuencias codificadas en binario (ficheros).
               n

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                     50
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                        278


Sin aprovechar la informaci´n de las frecuencias, ya se obtiene ganancia al reducir a
                             o
dos bits el c´digo de dos s´
             o             ımbolos.

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                     51
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
                                                                              o

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                       52
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
                                                                     o
secuencias codificadas m´s largas que las que produce otro en el que estos nodos se
                         a
fusionan 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                            o

As´ 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                                       o

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                  53
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 A
y f (a) a su frecuencia, el coste de un ´rbol binario de codificaci´n para A es:
                                        a                          o
                                                              p(a) · f (a)
                                                        a∈A
Este coste coincide con el n´mero total de bits calculado anteriormente.
                            u
Est´ claro que podemos definir distintos c´digos binarios de longitud variable, para un
   a                                     o
conjunto de s´
             ımbolos, que tendr´n distinto coste.
                               a
Dado un conjunto de s´
                     ımbolos A y sus frecuencias en un fichero, ¿podemos encontrar
un ´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                   ıa
n´mero total de bits para representar el fichero.
 u
Este c´digo es ´ptimo para una codificaci´n del tipo “s´
       o         o                          o               ımbolo - c´digo de longitud
                                                                       o
variable (libre de prefijos)”, dados un alfabeto y las frecuencias de sus s´
                                                                          ımbolos. Otros
tipos de codificaci´n pueden reducir m´s el n´mero de bits empleados.
                    o                   a      u

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                        54
El mont´
                                              ıculo binario (heap)


Algoritmo de Huffman

Trabaja con un bosque, que es una colecci´n de ´rboles.
                                         o     a

Inicialmente, cada par (s´
                         ımbolo,frecuencia) forma un ´rbol de un s´lo nodo en el
                                                     a            o
bosque.

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                       a


IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                          55
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   23

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                         56
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        23

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                        57
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            8


Coste del ´rbol de codificaci´n de Huffman obtenido:
          a                 o
    2 · 25 + 4 · 7 + 4 · 8 + 3 · 15 + 2 · 22 + 2 · 23 = 245

IS13. Estructuras de datos y de la informaci´n — 2003/2004
                                            o                                                        58
El mont´
                                              ıculo binario (heap)

El algoritmo de Huffman es un algoritmo voraz que, partiendo de los s´ ımbolos y sus
frecuencias, va creando local y sucesivamente sub´rboles de m´
                                                 a            ınimo coste, y finaliza
obteniendo el ´rbol binario de codificaci´n de m´
               a                        o       ınimo coste (codificaci´n ´ptima de
                                                                      o o
longitud 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                 o
de 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

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

P.O.O.
P.O.O.P.O.O.
P.O.O.
 
6 Curso de POO en Java - clases y objetos
6  Curso de POO en Java - clases y objetos6  Curso de POO en Java - clases y objetos
6 Curso de POO en Java - clases y objetos
 
Generics
GenericsGenerics
Generics
 
Mapaconceptual.u.m.l.
Mapaconceptual.u.m.l.Mapaconceptual.u.m.l.
Mapaconceptual.u.m.l.
 
Pilas y colas
Pilas y colasPilas y colas
Pilas y colas
 
Diccionario De Datos
Diccionario De DatosDiccionario De Datos
Diccionario De Datos
 
Java annotations
Java annotationsJava annotations
Java annotations
 
Introducción a Open Ldap
Introducción a Open LdapIntroducción a Open Ldap
Introducción a Open Ldap
 
programacion orientada a objetos
programacion orientada a objetosprogramacion orientada a objetos
programacion orientada a objetos
 
Estructura de Datos, Multilistas
Estructura de Datos, MultilistasEstructura de Datos, Multilistas
Estructura de Datos, Multilistas
 
1.1.5 Gestion de Memoria dinámica con TDA.pptx
1.1.5 Gestion de Memoria dinámica con TDA.pptx1.1.5 Gestion de Memoria dinámica con TDA.pptx
1.1.5 Gestion de Memoria dinámica con TDA.pptx
 
Modelado del AnáLisis
Modelado del AnáLisisModelado del AnáLisis
Modelado del AnáLisis
 
Repaso Diagramas Clase
Repaso Diagramas ClaseRepaso Diagramas Clase
Repaso Diagramas Clase
 
Programacion orientada a objetos Unidad 1-intro al paradigma poo
Programacion orientada a objetos Unidad 1-intro al paradigma pooProgramacion orientada a objetos Unidad 1-intro al paradigma poo
Programacion orientada a objetos Unidad 1-intro al paradigma poo
 
Estructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colasEstructura de datos: lista, pilas y colas
Estructura de datos: lista, pilas y colas
 
3. Modelo ER - Relacional
3. Modelo ER - Relacional3. Modelo ER - Relacional
3. Modelo ER - Relacional
 
Herencia en C++
Herencia en C++Herencia en C++
Herencia en C++
 
Vectores informaticos
Vectores informaticosVectores informaticos
Vectores informaticos
 
Arquitectura de software orientada a patrones
Arquitectura de software orientada a patronesArquitectura de software orientada a patrones
Arquitectura de software orientada a patrones
 
Hilos En Java
Hilos En JavaHilos En Java
Hilos En Java
 

Destaque

Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrbviela6
 
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellI1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellJosé A. Alonso
 
Administración de memoria continuación -matrices estáticas y dinámicas
Administración de memoria continuación -matrices estáticas y dinámicasAdministración de memoria continuación -matrices estáticas y dinámicas
Administración de memoria continuación -matrices estáticas y dinámicasUVM
 
Estructuras de datos_dinamicas_definicion_e_implementacion_
Estructuras de datos_dinamicas_definicion_e_implementacion_Estructuras de datos_dinamicas_definicion_e_implementacion_
Estructuras de datos_dinamicas_definicion_e_implementacion_Diosmary Marrón Dellán
 
Arrays bidimensionales
Arrays bidimensionalesArrays bidimensionales
Arrays bidimensionalesasvargas
 
Apuntadores
ApuntadoresApuntadores
Apuntadoresluisabn
 
PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++die_dex
 
PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++die_dex
 
Apuntadores y direccionamiento
Apuntadores y direccionamientoApuntadores y direccionamiento
Apuntadores y direccionamientoSergio Ramos
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosUVM
 
Funciones con vectores y matrices
Funciones con vectores y matricesFunciones con vectores y matrices
Funciones con vectores y matricesJohanna Marin
 
Administración de memoria - arreglos estáticos y dinámicos
Administración de memoria - arreglos estáticos y dinámicosAdministración de memoria - arreglos estáticos y dinámicos
Administración de memoria - arreglos estáticos y dinámicosUVM
 

Destaque (20)

Estructura de datos.vrb
Estructura de datos.vrbEstructura de datos.vrb
Estructura de datos.vrb
 
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en HaskellI1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
I1M2010-T16: El tipo abstracto de las colas de prioridad en Haskell
 
Memoria memoria dinamica
 Memoria memoria dinamica Memoria memoria dinamica
Memoria memoria dinamica
 
Exp compi(2)
Exp compi(2)Exp compi(2)
Exp compi(2)
 
Trabajo de estructura de datos
Trabajo de estructura de datosTrabajo de estructura de datos
Trabajo de estructura de datos
 
Administración de memoria continuación -matrices estáticas y dinámicas
Administración de memoria continuación -matrices estáticas y dinámicasAdministración de memoria continuación -matrices estáticas y dinámicas
Administración de memoria continuación -matrices estáticas y dinámicas
 
Estructuras de datos_dinamicas_definicion_e_implementacion_
Estructuras de datos_dinamicas_definicion_e_implementacion_Estructuras de datos_dinamicas_definicion_e_implementacion_
Estructuras de datos_dinamicas_definicion_e_implementacion_
 
Arrays bidimensionales
Arrays bidimensionalesArrays bidimensionales
Arrays bidimensionales
 
Apuntadores
ApuntadoresApuntadores
Apuntadores
 
Apuntadores
ApuntadoresApuntadores
Apuntadores
 
PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++
 
Arreglos multidimensionales y de apuntadores
Arreglos multidimensionales y de apuntadoresArreglos multidimensionales y de apuntadores
Arreglos multidimensionales y de apuntadores
 
Ejercicios punteros cadenas-vectores
Ejercicios punteros cadenas-vectoresEjercicios punteros cadenas-vectores
Ejercicios punteros cadenas-vectores
 
PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++PUNTEROS (APUNTADORES) EN C++
PUNTEROS (APUNTADORES) EN C++
 
Apuntadores y direccionamiento
Apuntadores y direccionamientoApuntadores y direccionamiento
Apuntadores y direccionamiento
 
Solucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectoresSolucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectores
 
colas de prioridad
colas de prioridad colas de prioridad
colas de prioridad
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicos
 
Funciones con vectores y matrices
Funciones con vectores y matricesFunciones con vectores y matrices
Funciones con vectores y matrices
 
Administración de memoria - arreglos estáticos y dinámicos
Administración de memoria - arreglos estáticos y dinámicosAdministración de memoria - arreglos estáticos y dinámicos
Administración de memoria - arreglos estáticos y dinámicos
 

Semelhante a Colas de prioridad

Semelhante a Colas de prioridad (20)

Tutorial jared
Tutorial jaredTutorial jared
Tutorial jared
 
Trabajo tutorial de visual C++
Trabajo tutorial de visual C++Trabajo tutorial de visual C++
Trabajo tutorial de visual C++
 
Trabajo de estructura de datos
Trabajo de estructura de datosTrabajo de estructura de datos
Trabajo de estructura de datos
 
Introducción A C# (VersióN Charla)
Introducción A C# (VersióN Charla)Introducción A C# (VersióN Charla)
Introducción A C# (VersióN Charla)
 
Framework .NET 3.5 05 Tipo y jerarquía de objetos
Framework .NET 3.5 05 Tipo y jerarquía de objetosFramework .NET 3.5 05 Tipo y jerarquía de objetos
Framework .NET 3.5 05 Tipo y jerarquía de objetos
 
Poo 1
Poo 1Poo 1
Poo 1
 
Sesion 5
Sesion 5Sesion 5
Sesion 5
 
Tema3
Tema3Tema3
Tema3
 
Tipos de datos para C++
Tipos de datos para C++Tipos de datos para C++
Tipos de datos para C++
 
Tipos de datos_para_c_
Tipos de datos_para_c_Tipos de datos_para_c_
Tipos de datos_para_c_
 
Unidad i antecedentes
Unidad i antecedentesUnidad i antecedentes
Unidad i antecedentes
 
Unidad i antecedentes1
Unidad i antecedentes1Unidad i antecedentes1
Unidad i antecedentes1
 
3. lenguaje c-
3. lenguaje c-3. lenguaje c-
3. lenguaje c-
 
Act 2 y 3
Act 2 y 3Act 2 y 3
Act 2 y 3
 
Des.Apli.Net 02.Sintaxis C Sharp
Des.Apli.Net 02.Sintaxis C SharpDes.Apli.Net 02.Sintaxis C Sharp
Des.Apli.Net 02.Sintaxis C Sharp
 
Estructuras de datos en Introducción a la Programación
Estructuras de datos en Introducción a la ProgramaciónEstructuras de datos en Introducción a la Programación
Estructuras de datos en Introducción a la Programación
 
2introduccionallenguajejava 141109171757-conversion-gate02
2introduccionallenguajejava 141109171757-conversion-gate022introduccionallenguajejava 141109171757-conversion-gate02
2introduccionallenguajejava 141109171757-conversion-gate02
 
INTRODUCCION LENGUAJE JAVA
INTRODUCCION LENGUAJE JAVAINTRODUCCION LENGUAJE JAVA
INTRODUCCION LENGUAJE JAVA
 
2) introduccion al lenguaje java
2) introduccion al lenguaje java2) introduccion al lenguaje java
2) introduccion al lenguaje java
 
5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion Cont5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion Cont
 

Mais de Pedro Hugo Valencia Morales (10)

Árboles como Estructura de Datos
Árboles como Estructura de DatosÁrboles como Estructura de Datos
Árboles como Estructura de Datos
 
C++ io manipulation
C++ io manipulationC++ io manipulation
C++ io manipulation
 
Heaps & priority queues
Heaps & priority queuesHeaps & priority queues
Heaps & priority queues
 
Tema4 programación generica
Tema4   programación genericaTema4   programación generica
Tema4 programación generica
 
Arboles03
Arboles03Arboles03
Arboles03
 
Arboles02
Arboles02Arboles02
Arboles02
 
Arboles01
Arboles01Arboles01
Arboles01
 
Arquitectura ssdd
Arquitectura ssddArquitectura ssdd
Arquitectura ssdd
 
Cap02 modelos1
Cap02 modelos1Cap02 modelos1
Cap02 modelos1
 
Chapter 1 slides
Chapter 1 slidesChapter 1 slides
Chapter 1 slides
 

Colas de prioridad

  • 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. Plantillas de clases y funciones en C++ Hasta ahora hemos dotado de cierto grado de genericidad a una clase mediante una definici´n de tipo: o typedef int TBL; que obliga a modificar la definici´n de la clase y recompilarla para adaptar la clase al o tipo espec´ ıfico que necesitamos. £ C++ proporciona un mecanismo expl´ ıcito para definir clases y funciones gen´ricas. e Una plantilla de clase o de funci´n es un modelo para crear clases o funciones en o el 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. 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. a IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 3
  • 4. Plantillas de clases y funciones en C++ Transformaci´n de la clase Vector (de enteros) en una plantilla de clase. o class 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 o IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 4
  • 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 o de clase, exactamente igual que una declaraci´n o definici´n normal de clase. o o Dentro de la definici´n de la plantilla de clase, su nombre puede utilizarse como o especificador 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 ı o Cuando se utiliza fuera de su definici´n, se debe especificar la lista de par´metros o a completa: Vector<TBV>. IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 5
  • 6. Plantillas de clases y funciones en C++ Instanciaci´n de plantillas de clase o Una definici´n de plantilla de clase sirve como modelo para la generaci´n autom´tica o o a de 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 e instanciaci´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 booleanos IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 6
  • 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*>. u La 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 a de 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 pueda utilizarse 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. Plantillas de clases y funciones en C++ M´todos de las plantillas de clase e Se pueden definir dentro de la definici´n de la plantilla de clase (inline), o fuera. o Si 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 a clase, para que el m´todo sea una plantilla de funci´n con los mismos par´metros. e o a Se debe cualificar el nombre del m´todo (constructor, en este caso) con el nombre de e la plantilla de clase acompa˜ada de la lista de par´metros de plantilla. n a En el cuerpo del m´todo, los par´metros de plantilla se pueden usar sin cualificar. e a IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 8
  • 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 e IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 9
  • 10. Plantillas de clases y funciones en C++ Plantillas de funci´n o Se 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. a La 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. 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. 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. u template <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. Plantillas de clases y funciones en C++ Amistad en las plantillas de clase Conoceremos s´lo la declaraci´n de amistad de una plantilla de funci´n en una de o o o clase en la que ambas utilizan la misma lista de par´metros de plantilla. a template <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. o IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 13
  • 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 e operador 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 no habr´ ninguna pega mientras no se utilice el operador de salida de Vector. a IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 14
  • 15. Plantillas de clases y funciones en C++ Tipos anidados en plantillas de clases Se puede anidar la definici´n de una plantilla de clase dentro de la definici´n de otra. o o template <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 o IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 15
  • 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) e en 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. Plantillas de clases y funciones en C++ Compilaci´n de plantillas de clase o Cuando el compilador procesa la definici´n de una plantilla de clase se guarda una o representaci´n interna, pero no genera c´digo correspondiente a la misma. o o Cuando 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 o guardada previamente. Para ello siempre es necesario que la definici´n de la plantilla haya sido procesada o antes de que la plantilla tenga que instanciarse. Para asegurar que esto se realiza en todo fichero que requiera una instanciaci´n de la o plantilla, 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). o IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 17
  • 18. Plantillas de clases y funciones en C++ Respecto a los m´todos, miembros de clase y tipos anidados de una plantilla de clase, e el 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 e Esta segunda posibilidad a´n no es factible utilizarla. No est´ soportada por muchos u a compiladores, y por algunos s´lo parcialmente. o Usaremos 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. Plantillas de clases y funciones en C++ Cuando se define una plantilla de clase o sus miembros, se debe tener en cuenta qu´ 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 a antes de que se necesiten. IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 19
  • 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. El TAD Cola de Prioridad Una cola de prioridad es una generalizaci´n de los conceptos de pila y cola en la o que, tras entrar en la cola, la salida de los elementos no se basa necesariamente en el 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 o maximizar 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 o parcialmente) la colecci´n de elementos en la cola. o IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 21
  • 22. El TAD Cola de Prioridad Algunas 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. El TAD Cola de Prioridad TAD Cola de Prioridad Elementos: 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. El TAD Cola de Prioridad Operaciones (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. El TAD Cola de Prioridad Ejemplos: 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. El TAD Cola de Prioridad Eficiencia 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. El TAD Cola de Prioridad Implementaciones eficientes de colas de prioridad Operaciones 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. 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 a cola de prioridad. Tambi´n es frecuente referirse a ´l por su nombre en ingl´s: “(binary) heap”. e e e Un heap es un ´rbol binario con dos propiedades adicionales: estructural y de orden. a Estructura 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 a IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 28
  • 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 31 Dado 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). a IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 29
  • 30. El mont´ ıculo binario (heap) Orden de heap. En un heap, el elemento situado en cada nodo es menor o igual que el 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 heap IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 30
  • 31. El mont´ ıculo binario (heap) 1 #include "errores.h" // Plantilla heap.h 2 #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. 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. El mont´ ıculo binario (heap) Minimo. 38 template <class TBH> 39 const TBH & Tama˜o del problema n 40 Heap<TBH>::Minimo() const { n: n´mero de elementos en el heap u 41 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 o del 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. o Si 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. 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 58 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 34
  • 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 58 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 35
  • 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 o aparecer en el camino desde este nodo a la ra´ e ir´ traslad´ndose a lo largo de ´l. ız, a a e Si el elemento de i es menor que el de i/2 , al intercambiarlos queda el menor como padre de dos mayores. El del hermano (i − 1 ´ i + 1) ya era mayor que el del padre. o Si el elemento de i debe seguir subiendo a i/2 /2 , el que baje a i/2 ser´ menor a que 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 void 46 Heap<TBH>::Insertar(const TBH & item) { En promedio, el 47 if (talla == maxheap) Error("Insertar"); coste de insertar 48 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. El mont´ ıculo binario (heap) EliminarMin. En un heap de n elementos, al eliminar uno se deber´ inutilizar la posici´n n del a o vector, dej´ndolo con n − 1 elementos, para mantener la estructura de heap. a Como 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 o Si se preserva el orden de heap al situar el elemento en el hueco, fin de la eliminaci´n. o Si no (lo m´s probable), el elemento por recolocar ser´ mayor que alguno de los a a elementos 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 peor caso, el hueco descender´ hasta las hojas. a IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 37
  • 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 87 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 38
  • 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 87 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 39
  • 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 o ra´ a las hojas, e ir´ traslad´ndose a lo largo de ´l. ız a a e Si el elemento de i es mayor que el de 2i y/o el de 2i + 1, al intercambiarlo con el menor 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, o el que suba a 2i ´ 2i + 1 ser´ mayor que el que ahora est´ en i (antes en 2i ´ 2i + 1). o a a o Al inicio, el orden de heap se cumpl´ ıa. 54 template <class TBH> 55 void 56 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. El mont´ ıculo binario (heap) El m´todo privado Hundir permite unificar la implementaci´n de EliminarMin y e o FormarHeap. Ambas operaciones del heap se basan en el mismo proceso. 62 template <class TBH> 63 void 64 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. El mont´ ıculo binario (heap) FormarHeap. Disponiendo de n elementos inicialmente, se puede formar un heap con ellos mediante n 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. 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 47 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 43
  • 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 47 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 44
  • 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 47 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 45
  • 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 71 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 46
  • 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 92 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 47
  • 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 92 76 template <class TBH> 77 void 78 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. El mont´ ıculo binario (heap) Breve an´lisis del coste de FormarHeap. a Mejor 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 ≤ 20 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 49
  • 50. El mont´ ıculo binario (heap) Aplicaci´n: C´digos de Huffman o o Una secuencia de s´ımbolos se puede codificar en binario estableciendo a priori el conjunto 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 o bits para disponer de suficientes c´digos. o Generalmente, esta codificaci´n produce secuencias de bits (ficheros) de mayor tama˜o o n que otras, desaprovechando espacio de almacenamiento o tiempo de transmisi´n.o Asignando c´digos binarios de longitud variable a los s´ o ımbolos, de manera que los m´s frecuentes tengan c´digos m´s cortos y los m´s infrecuentes m´s largos, se puede a o a a a reducir el tama˜o de las secuencias codificadas en binario (ficheros). n IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 50
  • 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 278 Sin aprovechar la informaci´n de las frecuencias, ya se obtiene ganancia al reducir a o dos bits el c´digo de dos s´ o ımbolos. IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 51
  • 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 o IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 52
  • 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 o secuencias codificadas m´s largas que las que produce otro en el que estos nodos se a fusionan 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 o As´ 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 o IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 53
  • 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 A y f (a) a su frecuencia, el coste de un ´rbol binario de codificaci´n para A es: a o p(a) · f (a) a∈A Este coste coincide con el n´mero total de bits calculado anteriormente. u Est´ claro que podemos definir distintos c´digos binarios de longitud variable, para un a o conjunto de s´ ımbolos, que tendr´n distinto coste. a Dado un conjunto de s´ ımbolos A y sus frecuencias en un fichero, ¿podemos encontrar un ´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 ıa n´mero total de bits para representar el fichero. u Este c´digo es ´ptimo para una codificaci´n del tipo “s´ o o o ımbolo - c´digo de longitud o variable (libre de prefijos)”, dados un alfabeto y las frecuencias de sus s´ ımbolos. Otros tipos de codificaci´n pueden reducir m´s el n´mero de bits empleados. o a u IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 54
  • 55. El mont´ ıculo binario (heap) Algoritmo de Huffman Trabaja con un bosque, que es una colecci´n de ´rboles. o a Inicialmente, cada par (s´ ımbolo,frecuencia) forma un ´rbol de un s´lo nodo en el a o bosque. 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 a IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 55
  • 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 23 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 56
  • 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 23 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 57
  • 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 8 Coste del ´rbol de codificaci´n de Huffman obtenido: a o 2 · 25 + 4 · 7 + 4 · 8 + 3 · 15 + 2 · 22 + 2 · 23 = 245 IS13. Estructuras de datos y de la informaci´n — 2003/2004 o 58
  • 59. El mont´ ıculo binario (heap) El algoritmo de Huffman es un algoritmo voraz que, partiendo de los s´ ımbolos y sus frecuencias, va creando local y sucesivamente sub´rboles de m´ a ınimo coste, y finaliza obteniendo el ´rbol binario de codificaci´n de m´ a o ınimo coste (codificaci´n ´ptima de o o longitud 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 o de 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