SlideShare una empresa de Scribd logo
1 de 59
Descargar para leer sin conexión
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´on — 2003/2004 1
Plantillas de clases y funciones en C++
Hasta ahora hemos dotado de cierto grado de genericidad a una clase mediante una
definici´on de tipo:
typedef int TBL;
que obliga a modificar la definici´on de la clase y recompilarla para adaptar la clase al
tipo espec´ıfico que necesitamos.
£ C++ proporciona un mecanismo expl´ıcito para definir clases y funciones gen´ericas.
Una plantilla de clase o de funci´on es un modelo para crear clases o funciones en
el que se parametrizan uno o m´as tipos o valores.
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´on — 2003/2004 2
Plantillas de clases y funciones en C++
Declaraci´on y definici´on de plantillas de clase
£ Una declaraci´on o definici´on de plantilla empieza con template.
£ A continuaci´on se da una lista de par´ametros de plantilla, separados por comas
y delimitados por < y >. No puede estar vac´ıa.
£ Un par´ametro de plantilla puede ser de tipo o de expresi´on constante.
Par´ametro de tipo. Se compone de class o typename y un identificador.
class y typename son equivalentes en esta lista de par´ametros.
Cualquier tipo predefinido de C++ (int, float, char*, etc.) o definido por
el usuario podr´a ser un argumento v´alido como par´ametro de tipo.
Un par´ametro de tipo es un especificador de tipo en toda la definici´on de la
plantilla. Puede usarse en los mismos contextos que un tipo en una clase.
Par´ametro de expresi´on constante. Es una declaraci´on normal de un par´ametro.
El nombre del par´ametro representa un valor constante.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 3
Plantillas de clases y funciones en C++
Transformaci´on de la clase Vector (de enteros) en una plantilla de clase.
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´on de la plantilla es igual que la de la clase Vector
IS13. Estructuras de datos y de la informaci´on — 2003/2004 4
Plantillas de clases y funciones en C++
Tras la lista de par´ametros de plantilla, se da la declaraci´on o definici´on de la plantilla
de clase, exactamente igual que una declaraci´on o definici´on normal de clase.
Dentro de la definici´on de la plantilla de clase, su nombre puede utilizarse como
especificador de tipo, igual que se hacia hasta ahora con el nombre de una clase.
£ Cada ocurrencia de Vector dentro de su definici´on es un abreviatura de
Vector<TBV>.
£ Esta abreviatura s´olo puede utilizarse aqu´ı y dentro de la definici´on de sus miembros.
Cuando se utiliza fuera de su definici´on, se debe especificar la lista de par´ametros
completa: Vector<TBV>.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 5
Plantillas de clases y funciones en C++
Instanciaci´on de plantillas de clase
Una definici´on de plantilla de clase sirve como modelo para la generaci´on autom´atica
de instancias de tipo espec´ıfico de la clase.
Cuando despu´es se escribe:
Vector<double> vd;
se crea autom´aticamente una clase Vector cuyos componentes son de tipo double.
£ El resultado es equivalente a reescribir el texto de la definici´on de la plantilla de
clase sustituyendo TBV por double y quitando template <class TBV>.
La creaci´on de una clase concreta a partir de una plantilla gen´erica de clase se llama
instanciaci´on de la plantilla.
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´on — 2003/2004 6
Plantillas de clases y funciones en C++
Cada instanciaci´on de una plantilla de clase es una clase independiente
£ Los objetos de la clase Vector<int> no tienen permiso de acceso a los miembros
no p´ublicos de Vector<char*>.
La lista de argumentos de plantilla se separa por comas y se delimita por < y >,
asoci´andose los tipos y valores espec´ıficos dados en la instanciaci´on a los par´ametros
de plantilla por su posici´on.
£ 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´on — 2003/2004 7
Plantillas de clases y funciones en C++
M´etodos de las plantillas de clase
Se pueden definir dentro de la definici´on de la plantilla de clase (inline), o fuera.
Si un m´etodo se define fuera, debe hacerse con una sintaxis especial:
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´ametros que la plantilla de
clase, para que el m´etodo sea una plantilla de funci´on con los mismos par´ametros.
Se debe cualificar el nombre del m´etodo (constructor, en este caso) con el nombre de
la plantilla de clase acompa˜nada de la lista de par´ametros de plantilla.
En el cuerpo del m´etodo, los par´ametros de plantilla se pueden usar sin cualificar.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´odigo de cada uno de estos m´etodos de la plantilla es el mismo
// que hab´ıa en su correspondiente m´etodo de la clase Vector
IS13. Estructuras de datos y de la informaci´on — 2003/2004 9
Plantillas de clases y funciones en C++
Plantillas de funci´on
Se declaran y definen igual que las plantillas de clase:
£ template m´as la lista de par´ametros.
£ Despu´es se declara o define la plantilla como una funci´on normal, incluyendo el uso
de los par´ametros de plantilla.
La instanciaci´on de plantillas de funci´on es distinta de las de clase.
£ En principio, no es necesario dar la lista de argumentos de plantilla, porque puede
deducirse de los tipos de los argumentos de funci´on.
£ Cuando sea necesario puede darse una lista expl´ıcita de argumentos de plantilla.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´on — 2003/2004 11
Plantillas de clases y funciones en C++
Las plantillas se pueden sobrecargar, conjuntamente con las funciones normales.
£ El compilador elegir´a la m´as apropiada para una llamada entre las funciones y las
instancias factibles de las plantillas, seg´un los argumentos y sus tipos.
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´on — 2003/2004 12
Plantillas de clases y funciones en C++
Amistad en las plantillas de clase
Conoceremos s´olo la declaraci´on de amistad de una plantilla de funci´on en una de
clase en la que ambas utilizan la misma lista de par´ametros de plantilla.
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´olo
} da acceso a instancias del mismo tipo de la plantilla de funci´on.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´e provisto del
operador de salida <<, ya que es necesario en:
fsal << v.elementos[i] << ", ";
As´ı, no se obtendr´a error de compilaci´on al escribir:
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´a ninguna pega mientras no se utilice el operador de salida de Vector.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 14
Plantillas de clases y funciones en C++
Tipos anidados en plantillas de clases
Se puede anidar la definici´on de una plantilla de clase dentro de la definici´on de otra.
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´on
IS13. Estructuras de datos y de la informaci´on — 2003/2004 15
Plantillas de clases y funciones en C++
£ Aunque la definici´on de la plantilla anidada no va precedida de template <class
TBP>, es una plantilla de manera autom´atica y el par´ametro TBP se puede
utilizar dentro de su definici´on.
£ Se asocia cada instanciaci´on de la clase contenedora para un tipo espec´ıfico con la
instanciaci´on de la clase anidada para el mismo tipo espec´ıfico.
Tambi´en se pueden anidar definiciones de tipos (typedef) y enumeraciones (enum)
en una plantilla de clase.
£ Un tipo p´ublico anidado puede referenciarse fuera de la plantilla, pero debe ser
referenciado como miembro de una instancia, y no de la plantilla.
Por ejemplo, si Enlace fuese p´ublico deber´ıa referenciarse como:
Pila<int>::Enlace ptraux;
y no como:
Pila::Enlace ptraux;
IS13. Estructuras de datos y de la informaci´on — 2003/2004 16
Plantillas de clases y funciones en C++
Compilaci´on de plantillas de clase
Cuando el compilador procesa la definici´on de una plantilla de clase se guarda una
representaci´on interna, pero no genera c´odigo correspondiente a la misma.
Cuando se instancia una plantilla de clase para un tipo espec´ıfico, entonces s´ı se
genera c´odigo correspondiente a esta instancia, utilizando la representaci´on interna
guardada previamente.
Para ello siempre es necesario que la definici´on de la plantilla haya sido procesada
antes de que la plantilla tenga que instanciarse.
Para asegurar que esto se realiza en todo fichero que requiera una instanciaci´on de la
plantilla, conviene:
£ colocar la definici´on de plantillas de clase en ficheros de cabecera .h, e
£ incluirlos en los ficheros necesarios (como se hace con la definici´on de clases).
IS13. Estructuras de datos y de la informaci´on — 2003/2004 17
Plantillas de clases y funciones en C++
Respecto a los m´etodos, miembros de clase y tipos anidados de una plantilla de clase,
el est´andar C++ ofrece dos posibilidades:
£ A˜nadir su definici´on a la definici´on de la plantilla de clase en el fichero de cabecera.
£ Dar su definici´on en un fichero de c´odigo separado .c++ (igual que se hace con la
definici´on de los m´etodos, miembros de clase y tipos anidados de una clase).
Esta segunda posibilidad a´un no es factible utilizarla. No est´a soportada por muchos
compiladores, y por algunos s´olo parcialmente.
Usaremos la primera forma de definici´on de miembros de la plantilla de clase.
£ Aunque ello tiene la desventaja de no encapsular los detalles de la implementaci´on,
tendremos la ventaja de poder compilar directamente y de la misma forma en
cualquier compilador.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 18
Plantillas de clases y funciones en C++
Cuando se define una plantilla de clase o sus miembros, se debe tener en cuenta
qu´e identificadores utilizados dependen de alg´un par´ametro de la plantilla y cu´ales no.
£ Los nombres que no dependen de par´ametros de la plantilla se resuelven al procesar
la definici´on de la plantilla.
£ Los que s´ı dependen de alg´un par´ametro de la plantilla se resuelven al instanciar la
plantilla para alg´un tipo espec´ıfico.
En ambos casos, los identificadores utilizados deber´an estar declarados o definidos
antes de que se necesiten.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 19
Plantillas de clases y funciones en C++
vector, de la STL de C++, ofrece las operaciones de Vector y muchas m´as.
#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´on: u = v;
£ Indexaci´on (para lectura y escritura de elementos): v[i] = w[j] + u[k];
£ Consulta de su talla: v.size()
£ Modificaci´on de su talla: w.resize(17); x.resize(1024,-0.001);
IS13. Estructuras de datos y de la informaci´on — 2003/2004 20
El TAD Cola de Prioridad
Una cola de prioridad es una generalizaci´on de los conceptos de pila y cola en la
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´on de elementos de una cola de prioridad puede buscar minimizar o
maximizar el valor del elemento saliente.
£ La interpretaremos en el sentido de minimizar. Para maximizar tan s´olo hay que
cambiar el sentido de las comparaciones.
En el modelo b´asico de una cola de prioridad la operaciones que consideramos son:
£ insertar en la cola,
£ obtener el elemento m´ınimo, y
£ eliminar el elemento m´ınimo.
La realizaci´on de estas operaciones no requiere mantener ordenada (ni total ni
parcialmente) la colecci´on de elementos en la cola.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 21
El TAD Cola de Prioridad
Algunas aplicaciones importantes de las colas de prioridad:
£ Gesti´on de procesos en un sistema operativo. Los procesos no se ejecutan uno
tras otro en base a su orden de llegada. Algunos procesos deben tener prioridad
(por su mayor importancia, por su menor duraci´on, etc.) sobre otros.
£ Implementaci´on de algoritmos voraces, los cuales proporcionan soluciones globales
a problemas bas´andose en decisiones tomadas s´olo con informaci´on local. La
determinaci´on de la mejor opci´on local suele basarse en una cola de prioridad.
Algunos algoritmos sobre grafos, como la obtenci´on de caminos o ´arboles de
expansi´on de m´ınimo coste, son ejemplos representativos de algoritmos voraces
basados en colas de prioridad.
£ Implementaciones eficientes de algoritmos de simulaci´on de sucesos discretos. En
´estas, el avance del tiempo no se gestiona incrementando un reloj unidad a unidad,
sino incrementado sucesivamente el reloj al instante del siguiente suceso.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 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.
Est´aVac´ıa(CP) : Devuelve cierto si CP = ∅, y falso si CP = ∅.
Longitud(CP) : Devuelve |CP| (cardinalidad del multiconjunto).
IS13. Estructuras de datos y de la informaci´on — 2003/2004 23
El TAD Cola de Prioridad
Operaciones (cont.):
M´ınimo(CP) : Si CP = ∅, entonces devuelve y ∈ CP tal que ∀z ∈ CP, y ≤ z;
en otro caso, error.
Insertar(CP,x) : Devuelve CP = CP ∪ {x}.
(En la uni´on de multiconjuntos A ∪ B, las ocurrencias de los elementos de A se
a˜naden 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}.)
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´as ocurrencias de un elemento que en A, ´este no est´a en A − B. P.e.:
{7, 4, 7, 2, 7, 4} − {4, 2, 7, 2, 4} = {7, 7}.)
IS13. Estructuras de datos y de la informaci´on — 2003/2004 24
El TAD Cola de Prioridad
Ejemplos:
CP =Crear()
{ }
Insertar(CP,32)
{ 32 }
Insertar(CP,13)
{ 32, 13 }
M´ınimo(CP)= 13
{ 32, 13 }
EliminarM´ın(CP)
{ 32 }
Insertar(CP,7)
{ 7, 32 }
Insertar(CP,26)
{ 7, 32, 26 }
Insertar(CP,7)
{ 7, 32, 7, 26 }
M´ınimo(CP)= 7
{ 7, 32, 7, 26 }
EliminarM´ın(CP)
{ 7, 32, 26 }
Insertar(CP,18)
{ 7, 32, 26, 18 }
Insertar(CP,18)
{ 7, 18, 32, 26, 18 }
Longitud(CP)= 5
{ 7, 18, 32, 26, 18 }
EliminarM´ın(CP)
{ 18, 32, 26, 18 }
EliminarM´ın(CP)
{ 18, 32, 26 }
M´ınimo(CP)= 18
{ 18, 32, 26 }
IS13. Estructuras de datos y de la informaci´on — 2003/2004 25
El TAD Cola de Prioridad
Eficiencia de diferentes implementaciones b´asicas
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´usqueda 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´on — 2003/2004 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´ın Combinar Formar
Mont´ıculo binario (heap) O(log n) 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´oticos amortizados iguales o m´as eficientes
(unitarios para algunas operaciones): mont´ıculos oblicuos y mont´ıculos de Fibonacci.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 27
El mont´ıculo binario (heap)
El mont´ıculo binario es la implementaci´on espec´ıfica m´as b´asica y habitual de una
cola de prioridad.
Tambi´en es frecuente referirse a ´el por su nombre en ingl´es: “(binary) heap”.
Un heap es un ´arbol binario con dos propiedades adicionales: estructural y de orden.
Estructura de heap. Un heap es un ´arbol binario casi completo con n nodos.
£ Un ´arbol binario casi completo con n nodos se puede almacenar en un vector con
n o m´as componentes.
£ Numerando los nodos del ´arbol binario casi completo por niveles, de arriba a abajo
y de izquierda a derecha, cada nodo i del heap se almacena en la posici´on i del
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˜no m´aximo del heap.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 28
El mont´ıculo binario (heap)
   
   
¡ ¡
¡ ¡
25 26 27 2928 30 3120 21 22 242315 16 17 191810 11 12 14135 6 7 980 1 2 43
1
2 3
4 5 6 7
8 9 10 12 13 14 15
16 17 18 19 20 21 22
11
A
B
C
D
E
A B C D E
Dado un nodo cualquiera i, 1 ≤ i ≤ n:
£ Su hijo izquierdo est´a en 2i (si tiene; es decir, si 2i ≤ n).
£ Su hijo derecho est´a en 2i + 1 (si tiene; es decir, si 2i + 1 ≤ n).
£ Su padre est´a en i/2 (si tiene; es decir, si i > 1).
IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´un hijo).
£ El elemento m´ınimo siempre est´a en la ra´ız.
£ En cada sub´arbol se verifica el orden de heap.
£ El elemento m´aximo est´a en una hoja.
8793 61 99 36 51
74 55 18 20
1523
7
8793 61 99 36 51
20
23
7
55 74
18
15
heap no es heap
IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´on — 2003/2004 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´on — 2003/2004 32
El mont´ıculo binario (heap)
Minimo.
38 template <class TBH>
39 const TBH & Tama˜no del problema
40 Heap<TBH>::Minimo() const { n: n´umero de elementos en el heap
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´a utilizar la posici´on n + 1
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´on.
Si no, el nuevo elemento ser´a menor que el elemento que est´a en el padre del hueco.
⇒ 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´a hasta la ra´ız.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 33
El mont´ıculo binario (heap)
9
71 92 58 61 87
66 47 58 34
3418
17
9
26
48 33 75 99
31
12
9
71 92 58 61 87
66 47 34
3418
17
9
26
48 33 75 99
31
58
12
IS13. Estructuras de datos y de la informaci´on — 2003/2004 34
El mont´ıculo binario (heap)
9
71 92 58 61 87
66 47 34
18
17
9
26
48 33 75 99
31
34
12
58
9
71 92 58 61 87
66 47 34
18
9
26
48 33 75 99
31
34
58
12
17
IS13. Estructuras de datos y de la informaci´on — 2003/2004 35
El mont´ıculo binario (heap)
Partiendo desde el nodo n + 1 al insertar, la violaci´on del orden de heap s´olo puede
aparecer en el camino desde este nodo a la ra´ız, e ir´a traslad´andose a lo largo de ´el.
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 ´o i + 1) ya era mayor que el del padre.
Si el elemento de i debe seguir subiendo a i/2 /2 , el que baje a i/2 ser´a menor
que los que hab´ıa en i/2 e i − 1 ´o i + 1. Al inicio, el orden de heap se cumpl´ı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´on — 2003/2004 36
El mont´ıculo binario (heap)
EliminarMin.
En un heap de n elementos, al eliminar uno se deber´a inutilizar la posici´on n del
vector, dej´andolo con n − 1 elementos, para mantener la estructura de heap.
Como el elemento que se elimina es el m´ınimo y ´este est´a en la ra´ız, inicialmente
tenemos un hueco en la ra´ız y el elemento que estaba en la posici´on n por recolocar.
Si se preserva el orden de heap al situar el elemento en el hueco, fin de la eliminaci´on.
Si no (lo m´as probable), el elemento por recolocar ser´a mayor que alguno de los
elementos que est´an en los hijos del hueco.
⇒ 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´a hasta las hojas.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 37
El mont´ıculo binario (heap)
9
71 92 58 61 87
66 47 34
18 26
48 33 75 99
31
34
17
12
589
71 92 58 61 87
66 47 34
18 26
48 33 75 99
31
34
17
12
9
58
IS13. Estructuras de datos y de la informaci´on — 2003/2004 38
El mont´ıculo binario (heap)
71 92 58 61 87
66 47 34
18
48 33 75 99
31
34
17
12
9
26
58
71 92 58 61 87
66 47 34
18
48 75 99
31
34
17
12
9
26
33
58
IS13. Estructuras de datos y de la informaci´on — 2003/2004 39
El mont´ıculo binario (heap)
Al eliminar, la violaci´on del orden de heap s´olo puede aparecer en el camino desde la
ra´ız a las hojas, e ir´a traslad´andose a lo largo de ´el.
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) ´o 2(2i + 1) + 1,
el que suba a 2i ´o 2i + 1 ser´a mayor que el que ahora est´a en i (antes en 2i ´o 2i + 1).
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´on — 2003/2004 40
El mont´ıculo binario (heap)
El m´etodo privado Hundir permite unificar la implementaci´on de EliminarMin y
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´on — 2003/2004 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´on alternativa:
£ Situar los elementos arbitrariamente en las n primeras posiciones del vector elems
⇒ se crea un ´arbol binario con estructura de heap, aunque no con orden de heap.
£ Considerando los nodos hoja como heaps de 1 nodo, comenzando desde el nodo
n/2 y procediendo nodo a nodo decrecientemente hasta la ra´ız, establecer el
orden de heap en el sub´arbol con ra´ız en el nodo considerado.
Para ello, se debe hundir el elemento del nodo considerado en su sub´arbol hasta
que alcance su nivel adecuado.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 42
El mont´ıculo binario (heap)
99
92
7175
26 18 17 12 9
47 48 34 34 33 31
61
87
66
5858
99
92
7175
26 18 17 12
48 34 34 33 31
61
87
66
5858
47
9
IS13. Estructuras de datos y de la informaci´on — 2003/2004 43
El mont´ıculo binario (heap)
99
92
7175
26 18 17
48 34 34 33 31
61
87
66
58
47
912
58
99
92
7175
26 17
48 34 34 33 31
61
87
66
47
912
58
18
58
IS13. Estructuras de datos y de la informaci´on — 2003/2004 44
El mont´ıculo binario (heap)
99
92
7175
26 17
48 34 34 33
87
66
47
912
58
18
58
31
61
99
92
7175
26 17
48 34 33
87
47
912
58
18
58
31
61
34
66
IS13. Estructuras de datos y de la informaci´on — 2003/2004 45
El mont´ıculo binario (heap)
99
92
75
26 17
48 34 33
87
12
58
18
58
31
61
34
66
9
47
71
99
92
26
48 34 33
87
58
18
58
31
61
34
6647
9
71
12
17
75
IS13. Estructuras de datos y de la informaci´on — 2003/2004 46
El mont´ıculo binario (heap)
99
92
26
48 34
58
18
58
61
34
6647
9
7175
17
12
31
33
87
99
26
48 34
58
18
58
61
34
66
75
17
12
31
33
87
9
47
71
92
IS13. Estructuras de datos y de la informaci´on — 2003/2004 47
El mont´ıculo binario (heap)
26
48 3418
58
61
34
66
75
31
33
8771
92
47
9
12
17
58
99
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´on — 2003/2004 48
El mont´ıculo binario (heap)
Breve an´alisis del coste de FormarHeap.
Mejor caso. Desde n/2 hasta 1, el elemento de cada nodo considerado es el menor
de su sub´arbol ⇒ el n´umero de asignaciones (desplazamientos de elementos)
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´as profundas de su sub´arbol.
El n´umero de asignaciones (desplazamientos de elementos) realizadas por Hundir
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:
S =
10
i=1
hi = 4 + 3 + 2 + 2 + 2 + 1 + 1 + 1 + 1 + 1 = 18 < 20 = n
hi = 0, 11 ≤ i ≤ 20
IS13. Estructuras de datos y de la informaci´on — 2003/2004 49
El mont´ıculo binario (heap)
Aplicaci´on: C´odigos de Huffman
Una secuencia de s´ımbolos se puede codificar en binario estableciendo a priori el
conjunto de s´ımbolos (alfabeto) y asign´andoles c´odigos binarios de longitud fija.
Por ejemplo, el est´andar ASCII utiliza 7 bits para codificar 128 d´ıgitos decimales,
letras may´usculas y min´usculas, s´ımbolos de puntuaci´on y otros caracteres.
La secuencia CD54 se codifica en ASCII como 1000011100010001101010110100.
Si el n´umero de s´ımbolos es n, los c´odigos deben tener una longitud fija de log2 n
bits para disponer de suficientes c´odigos.
Generalmente, esta codificaci´on produce secuencias de bits (ficheros) de mayor tama˜no
que otras, desaprovechando espacio de almacenamiento o tiempo de transmisi´on.
Asignando c´odigos binarios de longitud variable a los s´ımbolos, de manera que los
m´as frecuentes tengan c´odigos m´as cortos y los m´as infrecuentes m´as largos, se puede
reducir el tama˜no de las secuencias codificadas en binario (ficheros).
IS13. Estructuras de datos y de la informaci´on — 2003/2004 50
El mont´ıculo binario (heap)
Como ejemplo, consideremos un fichero compuesto s´olo por los siguientes s´ımbolos,
que aparecen el n´umero de veces indicado.
c´odigo 1 n´umero c´odigo 2 n´umero
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´umero total de bits del fichero: 300 278
Sin aprovechar la informaci´on de las frecuencias, ya se obtiene ganancia al reducir a
dos bits el c´odigo de dos s´ımbolos.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 51
El mont´ıculo binario (heap)
Un c´odigo binario puede representarse mediante un ´arbol binario de codificaci´on.
£ Los s´ımbolos se sit´uan en los nodos.
£ En cada nodo no terminal, la rama al hijo izquierdo representa un 0 y la rama al
hijo derecho un 1.
£ El c´odigo de cada s´ımbolo se corresponde con el camino desde la ra´ız al nodo que
lo contiene.
4 5 C D E F
0
0
0 0 111
0 1 0
1
4 5 C D
E F
0
0
0 11
0 1 0 1
1
c´odigo 1 c´odigo 2
IS13. Estructuras de datos y de la informaci´on — 2003/2004 52
El mont´ıculo binario (heap)
Un ´arbol de codificaci´on que tenga nodos sin s´ımbolo y con un s´olo hijo produce
secuencias codificadas m´as largas que las que produce otro en el que estos nodos se
fusionan con sus ´unicos hijos. As´ı, todos los nodos tienen dos hijos o ninguno.
Si todos los s´ımbolos est´an en las hojas, ning´un c´odigo es prefijo de otro.
£ Una codificaci´on con esta propiedad es un c´odigo libre de prefijos (“prefix code”).
As´ı, una secuencia de bits se descodifica de forma no ambigua e instant´anea.
£ La secuencia 101001001100000101011 es no ambigua para los c´odigos 1 y 2.
Descodificaci´on con c´odigo 1: F 5 5 E 4 F D
1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1
Descodificaci´on con c´odigo 2: E E C D 4 5 C F
£ C´odigo ambiguo: (4, 000), (5, 001), (C, 010), (D, 011), (E, 00), (F, 01).
¿C´omo se descodifica 010000? ¿C4 = 010-000 ´o FEE = 01-00-00?
IS13. Estructuras de datos y de la informaci´on — 2003/2004 53
El mont´ıculo binario (heap)
Llamando p(a) a la profundidad de la hoja en la que est´a el s´ımbolo a del alfabeto A
y f(a) a su frecuencia, el coste de un ´arbol binario de codificaci´on para A es:
a ∈ A
p(a) · f(a)
Este coste coincide con el n´umero total de bits calculado anteriormente.
Est´a claro que podemos definir distintos c´odigos binarios de longitud variable, para un
conjunto de s´ımbolos, que tendr´an distinto coste.
Dado un conjunto de s´ımbolos A y sus frecuencias en un fichero, ¿podemos encontrar
un ´arbol binario de codificaci´on ´optimo para A, es decir, cuyo coste sea m´ınimo?
De esta manera, obtendr´ıamos un c´odigo binario ´optimo que necesitar´ıa el menor
n´umero total de bits para representar el fichero.
Este c´odigo es ´optimo para una codificaci´on del tipo “s´ımbolo - c´odigo de longitud
variable (libre de prefijos)”, dados un alfabeto y las frecuencias de sus s´ımbolos. Otros
tipos de codificaci´on pueden reducir m´as el n´umero de bits empleados.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 54
El mont´ıculo binario (heap)
Algoritmo de Huffman
Trabaja con un bosque, que es una colecci´on de ´arboles.
Inicialmente, cada par (s´ımbolo,frecuencia) forma un ´arbol de un s´olo nodo en el
bosque.
Iterativamente, hasta que el bosque tenga un s´olo ´arbol:
£ Se seleccionan los dos ´arboles con menor coste (da lo mismo c´omo se resuelvan los
empates).
£ Se forma un nuevo ´arbol binario, creando un nuevo nodo ra´ız que contendr´a:
como coste la suma de los costes de los dos ´arboles seleccionados, y
como hijos a dichos ´arboles (da lo mismo cu´al sea el izquierdo y cu´al el derecho).
IS13. Estructuras de datos y de la informaci´on — 2003/2004 55
El mont´ıculo binario (heap)
Inicio: 25 23 15 722
C E4 5 F
8
D
Iteraci´on 1:
25 23 1522
C E4 5F
8
D
15
7
Iteraci´on 2:
4F
8
15
7 25 23
15
22
C
E
5 D
30
IS13. Estructuras de datos y de la informaci´on — 2003/2004 56
El mont´ıculo binario (heap)
Iteraci´on 3:
4F
8
15
7
15
E
30
22
5
23 25
D C
45
Iteraci´on 4:
4F
8
15
7
15
E
30
22
5
23
25
D
C
45
55
IS13. Estructuras de datos y de la informaci´on — 2003/2004 57
El mont´ıculo binario (heap)
Iteraci´on 5:
4F
8
15
7
15
E
3025
C
55
22
5
23
D
45
100
Coste del ´arbol de codificaci´on de Huffman obtenido:
2 · 25 + 4 · 7 + 4 · 8 + 3 · 15 + 2 · 22 + 2 · 23 = 245
IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´arboles de m´ınimo coste, y finaliza
obteniendo el ´arbol binario de codificaci´on de m´ınimo coste (codificaci´on ´optima de
longitud variable y libre de prefijos).
£ La selecci´on de los ´arboles del bosque con menor coste para formar otro puede
hacerse con un heap.
El ´arbol de codificaci´on de Huffman puede utilizarse para implementar dos programas
de compresi´on y descompresi´on de ficheros.
£ Para ello, el ´arbol de codificaci´on debe incluirse en el fichero comprimido (con una
representaci´on adecuada), ya que sino ser´a imposible descomprimir.
£ Esta manera de comprimir y descomprimir tiene el inconveniente de que la compre-
si´on necesita dos recorridos del fichero original: uno para calcular las frecuencias y
otro para codificar.
IS13. Estructuras de datos y de la informaci´on — 2003/2004 59

Más contenido relacionado

La actualidad más candente

P. final algebra lineal victoria silva
P. final algebra lineal victoria silvaP. final algebra lineal victoria silva
P. final algebra lineal victoria silvaVictoria Silva
 
Metodos de-ordenamiento
Metodos de-ordenamientoMetodos de-ordenamiento
Metodos de-ordenamientodeff000001
 
Transformaciones lineales
Transformaciones linealesTransformaciones lineales
Transformaciones linealesalgebra
 
Ejercicios jacobi
Ejercicios jacobiEjercicios jacobi
Ejercicios jacobidjp951
 
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 colasHuascar Génere
 
Serie de-taylor-y-maclaurin
Serie de-taylor-y-maclaurinSerie de-taylor-y-maclaurin
Serie de-taylor-y-maclaurinFaveeLa Natsuko
 
NÚCLEO E IMAGEN DE UNA TRANSFORMACIÓN LINEAL
NÚCLEO E IMAGEN DE UNA TRANSFORMACIÓN LINEALNÚCLEO E IMAGEN DE UNA TRANSFORMACIÓN LINEAL
NÚCLEO E IMAGEN DE UNA TRANSFORMACIÓN LINEALVERITO
 
EJERCICIOS RESUELTOS SOBRE EL MÉTODO DE NEWTON Y EL MÉTODO DE LA SECANTE
EJERCICIOS RESUELTOS SOBRE EL MÉTODO DE NEWTON Y EL MÉTODO DE LA SECANTEEJERCICIOS RESUELTOS SOBRE EL MÉTODO DE NEWTON Y EL MÉTODO DE LA SECANTE
EJERCICIOS RESUELTOS SOBRE EL MÉTODO DE NEWTON Y EL MÉTODO DE LA SECANTEEdgar Flores
 
Informe ordenamiento
Informe ordenamientoInforme ordenamiento
Informe ordenamientoIINTERACTIVE
 
Bucket sort
Bucket sortBucket sort
Bucket sorteislenp
 
EJERCICIOS CON LA ECUACION DE CAUCHY RIEMANN DEL 1 AL 15 (1).pdf
EJERCICIOS CON LA ECUACION DE CAUCHY RIEMANN DEL 1 AL 15 (1).pdfEJERCICIOS CON LA ECUACION DE CAUCHY RIEMANN DEL 1 AL 15 (1).pdf
EJERCICIOS CON LA ECUACION DE CAUCHY RIEMANN DEL 1 AL 15 (1).pdfgianella57
 
Solución Numérica de Ecuaciones no Lineales:Métodos cerrados
Solución Numérica de Ecuaciones no Lineales:Métodos cerradosSolución Numérica de Ecuaciones no Lineales:Métodos cerrados
Solución Numérica de Ecuaciones no Lineales:Métodos cerradosPervys Rengifo
 
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.Bryan Aguilar Yaguana
 

La actualidad más candente (20)

Flujo en redes
Flujo en redesFlujo en redes
Flujo en redes
 
Listas,pilas y colas Estructura de Datos
Listas,pilas y colas Estructura de DatosListas,pilas y colas Estructura de Datos
Listas,pilas y colas Estructura de Datos
 
P. final algebra lineal victoria silva
P. final algebra lineal victoria silvaP. final algebra lineal victoria silva
P. final algebra lineal victoria silva
 
Metodos de-ordenamiento
Metodos de-ordenamientoMetodos de-ordenamiento
Metodos de-ordenamiento
 
Transformaciones lineales
Transformaciones linealesTransformaciones lineales
Transformaciones lineales
 
Ejercicios jacobi
Ejercicios jacobiEjercicios jacobi
Ejercicios jacobi
 
Tipos de Datos Abstractos (TDA)
Tipos de Datos Abstractos (TDA)Tipos de Datos Abstractos (TDA)
Tipos de Datos Abstractos (TDA)
 
Colas
ColasColas
Colas
 
Tipos de datos abstractos
Tipos de datos abstractosTipos de datos abstractos
Tipos de datos abstractos
 
Pilas y colas
Pilas y colasPilas y colas
Pilas y colas
 
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
 
Guiasimplex
GuiasimplexGuiasimplex
Guiasimplex
 
Serie de-taylor-y-maclaurin
Serie de-taylor-y-maclaurinSerie de-taylor-y-maclaurin
Serie de-taylor-y-maclaurin
 
NÚCLEO E IMAGEN DE UNA TRANSFORMACIÓN LINEAL
NÚCLEO E IMAGEN DE UNA TRANSFORMACIÓN LINEALNÚCLEO E IMAGEN DE UNA TRANSFORMACIÓN LINEAL
NÚCLEO E IMAGEN DE UNA TRANSFORMACIÓN LINEAL
 
EJERCICIOS RESUELTOS SOBRE EL MÉTODO DE NEWTON Y EL MÉTODO DE LA SECANTE
EJERCICIOS RESUELTOS SOBRE EL MÉTODO DE NEWTON Y EL MÉTODO DE LA SECANTEEJERCICIOS RESUELTOS SOBRE EL MÉTODO DE NEWTON Y EL MÉTODO DE LA SECANTE
EJERCICIOS RESUELTOS SOBRE EL MÉTODO DE NEWTON Y EL MÉTODO DE LA SECANTE
 
Informe ordenamiento
Informe ordenamientoInforme ordenamiento
Informe ordenamiento
 
Bucket sort
Bucket sortBucket sort
Bucket sort
 
EJERCICIOS CON LA ECUACION DE CAUCHY RIEMANN DEL 1 AL 15 (1).pdf
EJERCICIOS CON LA ECUACION DE CAUCHY RIEMANN DEL 1 AL 15 (1).pdfEJERCICIOS CON LA ECUACION DE CAUCHY RIEMANN DEL 1 AL 15 (1).pdf
EJERCICIOS CON LA ECUACION DE CAUCHY RIEMANN DEL 1 AL 15 (1).pdf
 
Solución Numérica de Ecuaciones no Lineales:Métodos cerrados
Solución Numérica de Ecuaciones no Lineales:Métodos cerradosSolución Numérica de Ecuaciones no Lineales:Métodos cerrados
Solución Numérica de Ecuaciones no Lineales:Métodos cerrados
 
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
Algoritmos de Dijkstra, Warshall, Ordenación Topológica.
 

Destacado

Arboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en JavaArboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en JavaLupitaOMG Garmendia
 
Java pilas (Stacks) y colas (Queues)
Java pilas (Stacks) y colas (Queues)Java pilas (Stacks) y colas (Queues)
Java pilas (Stacks) y colas (Queues)Juan Astudillo
 
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
 
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
 
Estructura de datos, pilas, árboles, colas, listas
Estructura de datos, pilas, árboles, colas, listasEstructura de datos, pilas, árboles, colas, listas
Estructura de datos, pilas, árboles, colas, listasGuiro Lin
 
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
 

Destacado (20)

Arboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en JavaArboles y Colas de Prioridad en Java
Arboles y Colas de Prioridad en Java
 
Java pilas (Stacks) y colas (Queues)
Java pilas (Stacks) y colas (Queues)Java pilas (Stacks) y colas (Queues)
Java pilas (Stacks) y colas (Queues)
 
Tda cola
Tda colaTda cola
Tda cola
 
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_
 
Exp compi(2)
Exp compi(2)Exp compi(2)
Exp compi(2)
 
Memoria memoria dinamica
 Memoria memoria dinamica Memoria memoria dinamica
Memoria memoria dinamica
 
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
 
Estructura de datos, pilas, árboles, colas, listas
Estructura de datos, pilas, árboles, colas, listasEstructura de datos, pilas, árboles, colas, listas
Estructura de datos, pilas, árboles, colas, listas
 
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++
 
Ejercicios punteros cadenas-vectores
Ejercicios punteros cadenas-vectoresEjercicios punteros cadenas-vectores
Ejercicios punteros cadenas-vectores
 
Arreglos multidimensionales y de apuntadores
Arreglos multidimensionales y de apuntadoresArreglos multidimensionales y de apuntadores
Arreglos multidimensionales y de apuntadores
 
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
 
Arboles
ArbolesArboles
Arboles
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicos
 

Similar a Prioridad Colas

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 objetosAntonio Palomares Sender
 
programacion orientada a objetos
programacion orientada a objetosprogramacion orientada a objetos
programacion orientada a objetosjent46
 
Bases De Datos My Sql
Bases De Datos My SqlBases De Datos My Sql
Bases De Datos My SqlArnulfo Gomez
 
Objeto relacional bases datos 2
Objeto relacional bases datos 2Objeto relacional bases datos 2
Objeto relacional bases datos 2Velmuz Buzz
 
IntroduccióN A Visual C
IntroduccióN A Visual CIntroduccióN A Visual C
IntroduccióN A Visual Coswchavez
 
IntroduccióN A Visual C
IntroduccióN A  Visual  CIntroduccióN A  Visual  C
IntroduccióN A Visual Coswchavez
 
02 Bases Del Lenguaje Java
02   Bases Del Lenguaje Java02   Bases Del Lenguaje Java
02 Bases Del Lenguaje JavaNetwork Sens
 
Unidad%2 bxii estructuras
Unidad%2 bxii estructurasUnidad%2 bxii estructuras
Unidad%2 bxii estructurasjeoselyn
 
Trabajo tutorial de visual C++
Trabajo tutorial de visual C++Trabajo tutorial de visual C++
Trabajo tutorial de visual C++Bryangio2002
 
5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion Cont5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion ContUVM
 
Estructura de datos. listas, pilas y colas
Estructura de datos. listas, pilas y colasEstructura de datos. listas, pilas y colas
Estructura de datos. listas, pilas y colasIARINAIA
 
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ónFacultad de Ciencias y Sistemas
 

Similar a Prioridad Colas (20)

Colas de prioridad
Colas de prioridadColas de prioridad
Colas de prioridad
 
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
 
Tema 5 - Estructuras de datos.pdf
Tema 5 - Estructuras de datos.pdfTema 5 - Estructuras de datos.pdf
Tema 5 - Estructuras de datos.pdf
 
programacion orientada a objetos
programacion orientada a objetosprogramacion orientada a objetos
programacion orientada a objetos
 
Array
Array Array
Array
 
Bases De Datos My Sql
Bases De Datos My SqlBases De Datos My Sql
Bases De Datos My Sql
 
Objeto relacional bases datos 2
Objeto relacional bases datos 2Objeto relacional bases datos 2
Objeto relacional bases datos 2
 
IntroduccióN A Visual C
IntroduccióN A Visual CIntroduccióN A Visual C
IntroduccióN A Visual C
 
IntroduccióN A Visual C
IntroduccióN A  Visual  CIntroduccióN A  Visual  C
IntroduccióN A Visual C
 
Tema3
Tema3Tema3
Tema3
 
02 Bases Del Lenguaje Java
02   Bases Del Lenguaje Java02   Bases Del Lenguaje Java
02 Bases Del Lenguaje Java
 
Programacion
ProgramacionProgramacion
Programacion
 
Unidad%2 bxii estructuras
Unidad%2 bxii estructurasUnidad%2 bxii estructuras
Unidad%2 bxii estructuras
 
Trabajo tutorial de visual C++
Trabajo tutorial de visual C++Trabajo tutorial de visual C++
Trabajo tutorial de visual C++
 
5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion Cont5 Mecanismos Reuntilizacion Abstraccion Cont
5 Mecanismos Reuntilizacion Abstraccion Cont
 
Datos previos
Datos previosDatos previos
Datos previos
 
Datos Previos
Datos PreviosDatos Previos
Datos Previos
 
Datos Previos
Datos PreviosDatos Previos
Datos Previos
 
Estructura de datos. listas, pilas y colas
Estructura de datos. listas, pilas y colasEstructura de datos. listas, pilas y colas
Estructura de datos. listas, pilas y colas
 
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
 

Más de Dany Deyvis Rios Garcia (9)

Regresión y correlación estadística aplicada
Regresión y correlación estadística aplicadaRegresión y correlación estadística aplicada
Regresión y correlación estadística aplicada
 
Definiciones de etica trabajo
Definiciones de etica trabajoDefiniciones de etica trabajo
Definiciones de etica trabajo
 
Acordes de guitarra blin 182 all small
Acordes de guitarra blin 182 all smallAcordes de guitarra blin 182 all small
Acordes de guitarra blin 182 all small
 
´Plancontable
´Plancontable´Plancontable
´Plancontable
 
Algebra de baldor solucionario
Algebra de baldor solucionarioAlgebra de baldor solucionario
Algebra de baldor solucionario
 
Funciones vectoriales
Funciones vectorialesFunciones vectoriales
Funciones vectoriales
 
superficies en revolucion
superficies en revolucionsuperficies en revolucion
superficies en revolucion
 
movimiento armónico simple
movimiento armónico simple movimiento armónico simple
movimiento armónico simple
 
Dinamica 2
Dinamica 2Dinamica 2
Dinamica 2
 

Último

Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdfDemetrio Ccesa Rayme
 
Herramientas de Inteligencia Artificial.pdf
Herramientas de Inteligencia Artificial.pdfHerramientas de Inteligencia Artificial.pdf
Herramientas de Inteligencia Artificial.pdfMARIAPAULAMAHECHAMOR
 
texto argumentativo, ejemplos y ejercicios prácticos
texto argumentativo, ejemplos y ejercicios prácticostexto argumentativo, ejemplos y ejercicios prácticos
texto argumentativo, ejemplos y ejercicios prácticosisabeltrejoros
 
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptxEXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptxPryhaSalam
 
Introducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleIntroducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleJonathanCovena1
 
Estrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónEstrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónLourdes Feria
 
Neurociencias para Educadores NE24 Ccesa007.pdf
Neurociencias para Educadores  NE24  Ccesa007.pdfNeurociencias para Educadores  NE24  Ccesa007.pdf
Neurociencias para Educadores NE24 Ccesa007.pdfDemetrio Ccesa Rayme
 
La Función tecnológica del tutor.pptx
La  Función  tecnológica  del tutor.pptxLa  Función  tecnológica  del tutor.pptx
La Función tecnológica del tutor.pptxJunkotantik
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptxFelicitasAsuncionDia
 
EXPECTATIVAS vs PERSPECTIVA en la vida.
EXPECTATIVAS vs PERSPECTIVA  en la vida.EXPECTATIVAS vs PERSPECTIVA  en la vida.
EXPECTATIVAS vs PERSPECTIVA en la vida.DaluiMonasterio
 
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdfDemetrio Ccesa Rayme
 
Informatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosInformatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosCesarFernandez937857
 
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptxTIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptxlclcarmen
 
Identificación de componentes Hardware del PC
Identificación de componentes Hardware del PCIdentificación de componentes Hardware del PC
Identificación de componentes Hardware del PCCesarFernandez937857
 
codigos HTML para blogs y paginas web Karina
codigos HTML para blogs y paginas web Karinacodigos HTML para blogs y paginas web Karina
codigos HTML para blogs y paginas web Karinavergarakarina022
 
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdfResolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdfDemetrio Ccesa Rayme
 
30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdfgimenanahuel
 
Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.José Luis Palma
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdfBaker Publishing Company
 

Último (20)

Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 2do Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 2do Grado Educacion Primaria 2024 Ccesa007.pdf
 
Herramientas de Inteligencia Artificial.pdf
Herramientas de Inteligencia Artificial.pdfHerramientas de Inteligencia Artificial.pdf
Herramientas de Inteligencia Artificial.pdf
 
texto argumentativo, ejemplos y ejercicios prácticos
texto argumentativo, ejemplos y ejercicios prácticostexto argumentativo, ejemplos y ejercicios prácticos
texto argumentativo, ejemplos y ejercicios prácticos
 
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptxEXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
EXPANSIÓN ECONÓMICA DE OCCIDENTE LEÓN.pptx
 
Introducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleIntroducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo Sostenible
 
Estrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcciónEstrategia de prompts, primeras ideas para su construcción
Estrategia de prompts, primeras ideas para su construcción
 
Neurociencias para Educadores NE24 Ccesa007.pdf
Neurociencias para Educadores  NE24  Ccesa007.pdfNeurociencias para Educadores  NE24  Ccesa007.pdf
Neurociencias para Educadores NE24 Ccesa007.pdf
 
La Función tecnológica del tutor.pptx
La  Función  tecnológica  del tutor.pptxLa  Función  tecnológica  del tutor.pptx
La Función tecnológica del tutor.pptx
 
Registro Auxiliar - Primaria 2024 (1).pptx
Registro Auxiliar - Primaria  2024 (1).pptxRegistro Auxiliar - Primaria  2024 (1).pptx
Registro Auxiliar - Primaria 2024 (1).pptx
 
EXPECTATIVAS vs PERSPECTIVA en la vida.
EXPECTATIVAS vs PERSPECTIVA  en la vida.EXPECTATIVAS vs PERSPECTIVA  en la vida.
EXPECTATIVAS vs PERSPECTIVA en la vida.
 
Power Point: "Defendamos la verdad".pptx
Power Point: "Defendamos la verdad".pptxPower Point: "Defendamos la verdad".pptx
Power Point: "Defendamos la verdad".pptx
 
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdfPlanificacion Anual 4to Grado Educacion Primaria   2024   Ccesa007.pdf
Planificacion Anual 4to Grado Educacion Primaria 2024 Ccesa007.pdf
 
Informatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos BásicosInformatica Generalidades - Conceptos Básicos
Informatica Generalidades - Conceptos Básicos
 
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptxTIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
TIPOLOGÍA TEXTUAL- EXPOSICIÓN Y ARGUMENTACIÓN.pptx
 
Identificación de componentes Hardware del PC
Identificación de componentes Hardware del PCIdentificación de componentes Hardware del PC
Identificación de componentes Hardware del PC
 
codigos HTML para blogs y paginas web Karina
codigos HTML para blogs y paginas web Karinacodigos HTML para blogs y paginas web Karina
codigos HTML para blogs y paginas web Karina
 
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdfResolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
Resolucion de Problemas en Educacion Inicial 5 años ED-2024 Ccesa007.pdf
 
30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf30-de-abril-plebiscito-1902_240420_104511.pdf
30-de-abril-plebiscito-1902_240420_104511.pdf
 
Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.Clasificaciones, modalidades y tendencias de investigación educativa.
Clasificaciones, modalidades y tendencias de investigación educativa.
 
2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf2024 - Expo Visibles - Visibilidad Lesbica.pdf
2024 - Expo Visibles - Visibilidad Lesbica.pdf
 

Prioridad Colas

  • 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´on — 2003/2004 1
  • 2. Plantillas de clases y funciones en C++ Hasta ahora hemos dotado de cierto grado de genericidad a una clase mediante una definici´on de tipo: typedef int TBL; que obliga a modificar la definici´on de la clase y recompilarla para adaptar la clase al tipo espec´ıfico que necesitamos. £ C++ proporciona un mecanismo expl´ıcito para definir clases y funciones gen´ericas. Una plantilla de clase o de funci´on es un modelo para crear clases o funciones en el que se parametrizan uno o m´as tipos o valores. 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´on — 2003/2004 2
  • 3. Plantillas de clases y funciones en C++ Declaraci´on y definici´on de plantillas de clase £ Una declaraci´on o definici´on de plantilla empieza con template. £ A continuaci´on se da una lista de par´ametros de plantilla, separados por comas y delimitados por < y >. No puede estar vac´ıa. £ Un par´ametro de plantilla puede ser de tipo o de expresi´on constante. Par´ametro de tipo. Se compone de class o typename y un identificador. class y typename son equivalentes en esta lista de par´ametros. Cualquier tipo predefinido de C++ (int, float, char*, etc.) o definido por el usuario podr´a ser un argumento v´alido como par´ametro de tipo. Un par´ametro de tipo es un especificador de tipo en toda la definici´on de la plantilla. Puede usarse en los mismos contextos que un tipo en una clase. Par´ametro de expresi´on constante. Es una declaraci´on normal de un par´ametro. El nombre del par´ametro representa un valor constante. IS13. Estructuras de datos y de la informaci´on — 2003/2004 3
  • 4. Plantillas de clases y funciones en C++ Transformaci´on de la clase Vector (de enteros) en una plantilla de clase. 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´on de la plantilla es igual que la de la clase Vector IS13. Estructuras de datos y de la informaci´on — 2003/2004 4
  • 5. Plantillas de clases y funciones en C++ Tras la lista de par´ametros de plantilla, se da la declaraci´on o definici´on de la plantilla de clase, exactamente igual que una declaraci´on o definici´on normal de clase. Dentro de la definici´on de la plantilla de clase, su nombre puede utilizarse como especificador de tipo, igual que se hacia hasta ahora con el nombre de una clase. £ Cada ocurrencia de Vector dentro de su definici´on es un abreviatura de Vector<TBV>. £ Esta abreviatura s´olo puede utilizarse aqu´ı y dentro de la definici´on de sus miembros. Cuando se utiliza fuera de su definici´on, se debe especificar la lista de par´ametros completa: Vector<TBV>. IS13. Estructuras de datos y de la informaci´on — 2003/2004 5
  • 6. Plantillas de clases y funciones en C++ Instanciaci´on de plantillas de clase Una definici´on de plantilla de clase sirve como modelo para la generaci´on autom´atica de instancias de tipo espec´ıfico de la clase. Cuando despu´es se escribe: Vector<double> vd; se crea autom´aticamente una clase Vector cuyos componentes son de tipo double. £ El resultado es equivalente a reescribir el texto de la definici´on de la plantilla de clase sustituyendo TBV por double y quitando template <class TBV>. La creaci´on de una clase concreta a partir de una plantilla gen´erica de clase se llama instanciaci´on de la plantilla. 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´on — 2003/2004 6
  • 7. Plantillas de clases y funciones en C++ Cada instanciaci´on de una plantilla de clase es una clase independiente £ Los objetos de la clase Vector<int> no tienen permiso de acceso a los miembros no p´ublicos de Vector<char*>. La lista de argumentos de plantilla se separa por comas y se delimita por < y >, asoci´andose los tipos y valores espec´ıficos dados en la instanciaci´on a los par´ametros de plantilla por su posici´on. £ 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´on — 2003/2004 7
  • 8. Plantillas de clases y funciones en C++ M´etodos de las plantillas de clase Se pueden definir dentro de la definici´on de la plantilla de clase (inline), o fuera. Si un m´etodo se define fuera, debe hacerse con una sintaxis especial: 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´ametros que la plantilla de clase, para que el m´etodo sea una plantilla de funci´on con los mismos par´ametros. Se debe cualificar el nombre del m´etodo (constructor, en este caso) con el nombre de la plantilla de clase acompa˜nada de la lista de par´ametros de plantilla. En el cuerpo del m´etodo, los par´ametros de plantilla se pueden usar sin cualificar. IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´odigo de cada uno de estos m´etodos de la plantilla es el mismo // que hab´ıa en su correspondiente m´etodo de la clase Vector IS13. Estructuras de datos y de la informaci´on — 2003/2004 9
  • 10. Plantillas de clases y funciones en C++ Plantillas de funci´on Se declaran y definen igual que las plantillas de clase: £ template m´as la lista de par´ametros. £ Despu´es se declara o define la plantilla como una funci´on normal, incluyendo el uso de los par´ametros de plantilla. La instanciaci´on de plantillas de funci´on es distinta de las de clase. £ En principio, no es necesario dar la lista de argumentos de plantilla, porque puede deducirse de los tipos de los argumentos de funci´on. £ Cuando sea necesario puede darse una lista expl´ıcita de argumentos de plantilla. IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´on — 2003/2004 11
  • 12. Plantillas de clases y funciones en C++ Las plantillas se pueden sobrecargar, conjuntamente con las funciones normales. £ El compilador elegir´a la m´as apropiada para una llamada entre las funciones y las instancias factibles de las plantillas, seg´un los argumentos y sus tipos. 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´on — 2003/2004 12
  • 13. Plantillas de clases y funciones en C++ Amistad en las plantillas de clase Conoceremos s´olo la declaraci´on de amistad de una plantilla de funci´on en una de clase en la que ambas utilizan la misma lista de par´ametros de plantilla. 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´olo } da acceso a instancias del mismo tipo de la plantilla de funci´on. IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´e provisto del operador de salida <<, ya que es necesario en: fsal << v.elementos[i] << ", "; As´ı, no se obtendr´a error de compilaci´on al escribir: 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´a ninguna pega mientras no se utilice el operador de salida de Vector. IS13. Estructuras de datos y de la informaci´on — 2003/2004 14
  • 15. Plantillas de clases y funciones en C++ Tipos anidados en plantillas de clases Se puede anidar la definici´on de una plantilla de clase dentro de la definici´on de otra. 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´on IS13. Estructuras de datos y de la informaci´on — 2003/2004 15
  • 16. Plantillas de clases y funciones en C++ £ Aunque la definici´on de la plantilla anidada no va precedida de template <class TBP>, es una plantilla de manera autom´atica y el par´ametro TBP se puede utilizar dentro de su definici´on. £ Se asocia cada instanciaci´on de la clase contenedora para un tipo espec´ıfico con la instanciaci´on de la clase anidada para el mismo tipo espec´ıfico. Tambi´en se pueden anidar definiciones de tipos (typedef) y enumeraciones (enum) en una plantilla de clase. £ Un tipo p´ublico anidado puede referenciarse fuera de la plantilla, pero debe ser referenciado como miembro de una instancia, y no de la plantilla. Por ejemplo, si Enlace fuese p´ublico deber´ıa referenciarse como: Pila<int>::Enlace ptraux; y no como: Pila::Enlace ptraux; IS13. Estructuras de datos y de la informaci´on — 2003/2004 16
  • 17. Plantillas de clases y funciones en C++ Compilaci´on de plantillas de clase Cuando el compilador procesa la definici´on de una plantilla de clase se guarda una representaci´on interna, pero no genera c´odigo correspondiente a la misma. Cuando se instancia una plantilla de clase para un tipo espec´ıfico, entonces s´ı se genera c´odigo correspondiente a esta instancia, utilizando la representaci´on interna guardada previamente. Para ello siempre es necesario que la definici´on de la plantilla haya sido procesada antes de que la plantilla tenga que instanciarse. Para asegurar que esto se realiza en todo fichero que requiera una instanciaci´on de la plantilla, conviene: £ colocar la definici´on de plantillas de clase en ficheros de cabecera .h, e £ incluirlos en los ficheros necesarios (como se hace con la definici´on de clases). IS13. Estructuras de datos y de la informaci´on — 2003/2004 17
  • 18. Plantillas de clases y funciones en C++ Respecto a los m´etodos, miembros de clase y tipos anidados de una plantilla de clase, el est´andar C++ ofrece dos posibilidades: £ A˜nadir su definici´on a la definici´on de la plantilla de clase en el fichero de cabecera. £ Dar su definici´on en un fichero de c´odigo separado .c++ (igual que se hace con la definici´on de los m´etodos, miembros de clase y tipos anidados de una clase). Esta segunda posibilidad a´un no es factible utilizarla. No est´a soportada por muchos compiladores, y por algunos s´olo parcialmente. Usaremos la primera forma de definici´on de miembros de la plantilla de clase. £ Aunque ello tiene la desventaja de no encapsular los detalles de la implementaci´on, tendremos la ventaja de poder compilar directamente y de la misma forma en cualquier compilador. IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´e identificadores utilizados dependen de alg´un par´ametro de la plantilla y cu´ales no. £ Los nombres que no dependen de par´ametros de la plantilla se resuelven al procesar la definici´on de la plantilla. £ Los que s´ı dependen de alg´un par´ametro de la plantilla se resuelven al instanciar la plantilla para alg´un tipo espec´ıfico. En ambos casos, los identificadores utilizados deber´an estar declarados o definidos antes de que se necesiten. IS13. Estructuras de datos y de la informaci´on — 2003/2004 19
  • 20. Plantillas de clases y funciones en C++ vector, de la STL de C++, ofrece las operaciones de Vector y muchas m´as. #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´on: u = v; £ Indexaci´on (para lectura y escritura de elementos): v[i] = w[j] + u[k]; £ Consulta de su talla: v.size() £ Modificaci´on de su talla: w.resize(17); x.resize(1024,-0.001); IS13. Estructuras de datos y de la informaci´on — 2003/2004 20
  • 21. El TAD Cola de Prioridad Una cola de prioridad es una generalizaci´on de los conceptos de pila y cola en la 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´on de elementos de una cola de prioridad puede buscar minimizar o maximizar el valor del elemento saliente. £ La interpretaremos en el sentido de minimizar. Para maximizar tan s´olo hay que cambiar el sentido de las comparaciones. En el modelo b´asico de una cola de prioridad la operaciones que consideramos son: £ insertar en la cola, £ obtener el elemento m´ınimo, y £ eliminar el elemento m´ınimo. La realizaci´on de estas operaciones no requiere mantener ordenada (ni total ni parcialmente) la colecci´on de elementos en la cola. IS13. Estructuras de datos y de la informaci´on — 2003/2004 21
  • 22. El TAD Cola de Prioridad Algunas aplicaciones importantes de las colas de prioridad: £ Gesti´on de procesos en un sistema operativo. Los procesos no se ejecutan uno tras otro en base a su orden de llegada. Algunos procesos deben tener prioridad (por su mayor importancia, por su menor duraci´on, etc.) sobre otros. £ Implementaci´on de algoritmos voraces, los cuales proporcionan soluciones globales a problemas bas´andose en decisiones tomadas s´olo con informaci´on local. La determinaci´on de la mejor opci´on local suele basarse en una cola de prioridad. Algunos algoritmos sobre grafos, como la obtenci´on de caminos o ´arboles de expansi´on de m´ınimo coste, son ejemplos representativos de algoritmos voraces basados en colas de prioridad. £ Implementaciones eficientes de algoritmos de simulaci´on de sucesos discretos. En ´estas, el avance del tiempo no se gestiona incrementando un reloj unidad a unidad, sino incrementado sucesivamente el reloj al instante del siguiente suceso. IS13. Estructuras de datos y de la informaci´on — 2003/2004 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. Est´aVac´ıa(CP) : Devuelve cierto si CP = ∅, y falso si CP = ∅. Longitud(CP) : Devuelve |CP| (cardinalidad del multiconjunto). IS13. Estructuras de datos y de la informaci´on — 2003/2004 23
  • 24. El TAD Cola de Prioridad Operaciones (cont.): M´ınimo(CP) : Si CP = ∅, entonces devuelve y ∈ CP tal que ∀z ∈ CP, y ≤ z; en otro caso, error. Insertar(CP,x) : Devuelve CP = CP ∪ {x}. (En la uni´on de multiconjuntos A ∪ B, las ocurrencias de los elementos de A se a˜naden 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}.) 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´as ocurrencias de un elemento que en A, ´este no est´a en A − B. P.e.: {7, 4, 7, 2, 7, 4} − {4, 2, 7, 2, 4} = {7, 7}.) IS13. Estructuras de datos y de la informaci´on — 2003/2004 24
  • 25. El TAD Cola de Prioridad Ejemplos: CP =Crear() { } Insertar(CP,32) { 32 } Insertar(CP,13) { 32, 13 } M´ınimo(CP)= 13 { 32, 13 } EliminarM´ın(CP) { 32 } Insertar(CP,7) { 7, 32 } Insertar(CP,26) { 7, 32, 26 } Insertar(CP,7) { 7, 32, 7, 26 } M´ınimo(CP)= 7 { 7, 32, 7, 26 } EliminarM´ın(CP) { 7, 32, 26 } Insertar(CP,18) { 7, 32, 26, 18 } Insertar(CP,18) { 7, 18, 32, 26, 18 } Longitud(CP)= 5 { 7, 18, 32, 26, 18 } EliminarM´ın(CP) { 18, 32, 26, 18 } EliminarM´ın(CP) { 18, 32, 26 } M´ınimo(CP)= 18 { 18, 32, 26 } IS13. Estructuras de datos y de la informaci´on — 2003/2004 25
  • 26. El TAD Cola de Prioridad Eficiencia de diferentes implementaciones b´asicas 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´usqueda 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´on — 2003/2004 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´ın Combinar Formar Mont´ıculo binario (heap) O(log n) 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´oticos amortizados iguales o m´as eficientes (unitarios para algunas operaciones): mont´ıculos oblicuos y mont´ıculos de Fibonacci. IS13. Estructuras de datos y de la informaci´on — 2003/2004 27
  • 28. El mont´ıculo binario (heap) El mont´ıculo binario es la implementaci´on espec´ıfica m´as b´asica y habitual de una cola de prioridad. Tambi´en es frecuente referirse a ´el por su nombre en ingl´es: “(binary) heap”. Un heap es un ´arbol binario con dos propiedades adicionales: estructural y de orden. Estructura de heap. Un heap es un ´arbol binario casi completo con n nodos. £ Un ´arbol binario casi completo con n nodos se puede almacenar en un vector con n o m´as componentes. £ Numerando los nodos del ´arbol binario casi completo por niveles, de arriba a abajo y de izquierda a derecha, cada nodo i del heap se almacena en la posici´on i del 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˜no m´aximo del heap. IS13. Estructuras de datos y de la informaci´on — 2003/2004 28
  • 29. El mont´ıculo binario (heap)         ¡ ¡ ¡ ¡ 25 26 27 2928 30 3120 21 22 242315 16 17 191810 11 12 14135 6 7 980 1 2 43 1 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20 21 22 11 A B C D E A B C D E Dado un nodo cualquiera i, 1 ≤ i ≤ n: £ Su hijo izquierdo est´a en 2i (si tiene; es decir, si 2i ≤ n). £ Su hijo derecho est´a en 2i + 1 (si tiene; es decir, si 2i + 1 ≤ n). £ Su padre est´a en i/2 (si tiene; es decir, si i > 1). IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´un hijo). £ El elemento m´ınimo siempre est´a en la ra´ız. £ En cada sub´arbol se verifica el orden de heap. £ El elemento m´aximo est´a en una hoja. 8793 61 99 36 51 74 55 18 20 1523 7 8793 61 99 36 51 20 23 7 55 74 18 15 heap no es heap IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´on — 2003/2004 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´on — 2003/2004 32
  • 33. El mont´ıculo binario (heap) Minimo. 38 template <class TBH> 39 const TBH & Tama˜no del problema 40 Heap<TBH>::Minimo() const { n: n´umero de elementos en el heap 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´a utilizar la posici´on n + 1 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´on. Si no, el nuevo elemento ser´a menor que el elemento que est´a en el padre del hueco. ⇒ 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´a hasta la ra´ız. IS13. Estructuras de datos y de la informaci´on — 2003/2004 33
  • 34. El mont´ıculo binario (heap) 9 71 92 58 61 87 66 47 58 34 3418 17 9 26 48 33 75 99 31 12 9 71 92 58 61 87 66 47 34 3418 17 9 26 48 33 75 99 31 58 12 IS13. Estructuras de datos y de la informaci´on — 2003/2004 34
  • 35. El mont´ıculo binario (heap) 9 71 92 58 61 87 66 47 34 18 17 9 26 48 33 75 99 31 34 12 58 9 71 92 58 61 87 66 47 34 18 9 26 48 33 75 99 31 34 58 12 17 IS13. Estructuras de datos y de la informaci´on — 2003/2004 35
  • 36. El mont´ıculo binario (heap) Partiendo desde el nodo n + 1 al insertar, la violaci´on del orden de heap s´olo puede aparecer en el camino desde este nodo a la ra´ız, e ir´a traslad´andose a lo largo de ´el. 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 ´o i + 1) ya era mayor que el del padre. Si el elemento de i debe seguir subiendo a i/2 /2 , el que baje a i/2 ser´a menor que los que hab´ıa en i/2 e i − 1 ´o i + 1. Al inicio, el orden de heap se cumpl´ı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´on — 2003/2004 36
  • 37. El mont´ıculo binario (heap) EliminarMin. En un heap de n elementos, al eliminar uno se deber´a inutilizar la posici´on n del vector, dej´andolo con n − 1 elementos, para mantener la estructura de heap. Como el elemento que se elimina es el m´ınimo y ´este est´a en la ra´ız, inicialmente tenemos un hueco en la ra´ız y el elemento que estaba en la posici´on n por recolocar. Si se preserva el orden de heap al situar el elemento en el hueco, fin de la eliminaci´on. Si no (lo m´as probable), el elemento por recolocar ser´a mayor que alguno de los elementos que est´an en los hijos del hueco. ⇒ 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´a hasta las hojas. IS13. Estructuras de datos y de la informaci´on — 2003/2004 37
  • 38. El mont´ıculo binario (heap) 9 71 92 58 61 87 66 47 34 18 26 48 33 75 99 31 34 17 12 589 71 92 58 61 87 66 47 34 18 26 48 33 75 99 31 34 17 12 9 58 IS13. Estructuras de datos y de la informaci´on — 2003/2004 38
  • 39. El mont´ıculo binario (heap) 71 92 58 61 87 66 47 34 18 48 33 75 99 31 34 17 12 9 26 58 71 92 58 61 87 66 47 34 18 48 75 99 31 34 17 12 9 26 33 58 IS13. Estructuras de datos y de la informaci´on — 2003/2004 39
  • 40. El mont´ıculo binario (heap) Al eliminar, la violaci´on del orden de heap s´olo puede aparecer en el camino desde la ra´ız a las hojas, e ir´a traslad´andose a lo largo de ´el. 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) ´o 2(2i + 1) + 1, el que suba a 2i ´o 2i + 1 ser´a mayor que el que ahora est´a en i (antes en 2i ´o 2i + 1). 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´on — 2003/2004 40
  • 41. El mont´ıculo binario (heap) El m´etodo privado Hundir permite unificar la implementaci´on de EliminarMin y 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´on — 2003/2004 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´on alternativa: £ Situar los elementos arbitrariamente en las n primeras posiciones del vector elems ⇒ se crea un ´arbol binario con estructura de heap, aunque no con orden de heap. £ Considerando los nodos hoja como heaps de 1 nodo, comenzando desde el nodo n/2 y procediendo nodo a nodo decrecientemente hasta la ra´ız, establecer el orden de heap en el sub´arbol con ra´ız en el nodo considerado. Para ello, se debe hundir el elemento del nodo considerado en su sub´arbol hasta que alcance su nivel adecuado. IS13. Estructuras de datos y de la informaci´on — 2003/2004 42
  • 43. El mont´ıculo binario (heap) 99 92 7175 26 18 17 12 9 47 48 34 34 33 31 61 87 66 5858 99 92 7175 26 18 17 12 48 34 34 33 31 61 87 66 5858 47 9 IS13. Estructuras de datos y de la informaci´on — 2003/2004 43
  • 44. El mont´ıculo binario (heap) 99 92 7175 26 18 17 48 34 34 33 31 61 87 66 58 47 912 58 99 92 7175 26 17 48 34 34 33 31 61 87 66 47 912 58 18 58 IS13. Estructuras de datos y de la informaci´on — 2003/2004 44
  • 45. El mont´ıculo binario (heap) 99 92 7175 26 17 48 34 34 33 87 66 47 912 58 18 58 31 61 99 92 7175 26 17 48 34 33 87 47 912 58 18 58 31 61 34 66 IS13. Estructuras de datos y de la informaci´on — 2003/2004 45
  • 46. El mont´ıculo binario (heap) 99 92 75 26 17 48 34 33 87 12 58 18 58 31 61 34 66 9 47 71 99 92 26 48 34 33 87 58 18 58 31 61 34 6647 9 71 12 17 75 IS13. Estructuras de datos y de la informaci´on — 2003/2004 46
  • 47. El mont´ıculo binario (heap) 99 92 26 48 34 58 18 58 61 34 6647 9 7175 17 12 31 33 87 99 26 48 34 58 18 58 61 34 66 75 17 12 31 33 87 9 47 71 92 IS13. Estructuras de datos y de la informaci´on — 2003/2004 47
  • 48. El mont´ıculo binario (heap) 26 48 3418 58 61 34 66 75 31 33 8771 92 47 9 12 17 58 99 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´on — 2003/2004 48
  • 49. El mont´ıculo binario (heap) Breve an´alisis del coste de FormarHeap. Mejor caso. Desde n/2 hasta 1, el elemento de cada nodo considerado es el menor de su sub´arbol ⇒ el n´umero de asignaciones (desplazamientos de elementos) 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´as profundas de su sub´arbol. El n´umero de asignaciones (desplazamientos de elementos) realizadas por Hundir 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: S = 10 i=1 hi = 4 + 3 + 2 + 2 + 2 + 1 + 1 + 1 + 1 + 1 = 18 < 20 = n hi = 0, 11 ≤ i ≤ 20 IS13. Estructuras de datos y de la informaci´on — 2003/2004 49
  • 50. El mont´ıculo binario (heap) Aplicaci´on: C´odigos de Huffman Una secuencia de s´ımbolos se puede codificar en binario estableciendo a priori el conjunto de s´ımbolos (alfabeto) y asign´andoles c´odigos binarios de longitud fija. Por ejemplo, el est´andar ASCII utiliza 7 bits para codificar 128 d´ıgitos decimales, letras may´usculas y min´usculas, s´ımbolos de puntuaci´on y otros caracteres. La secuencia CD54 se codifica en ASCII como 1000011100010001101010110100. Si el n´umero de s´ımbolos es n, los c´odigos deben tener una longitud fija de log2 n bits para disponer de suficientes c´odigos. Generalmente, esta codificaci´on produce secuencias de bits (ficheros) de mayor tama˜no que otras, desaprovechando espacio de almacenamiento o tiempo de transmisi´on. Asignando c´odigos binarios de longitud variable a los s´ımbolos, de manera que los m´as frecuentes tengan c´odigos m´as cortos y los m´as infrecuentes m´as largos, se puede reducir el tama˜no de las secuencias codificadas en binario (ficheros). IS13. Estructuras de datos y de la informaci´on — 2003/2004 50
  • 51. El mont´ıculo binario (heap) Como ejemplo, consideremos un fichero compuesto s´olo por los siguientes s´ımbolos, que aparecen el n´umero de veces indicado. c´odigo 1 n´umero c´odigo 2 n´umero 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´umero total de bits del fichero: 300 278 Sin aprovechar la informaci´on de las frecuencias, ya se obtiene ganancia al reducir a dos bits el c´odigo de dos s´ımbolos. IS13. Estructuras de datos y de la informaci´on — 2003/2004 51
  • 52. El mont´ıculo binario (heap) Un c´odigo binario puede representarse mediante un ´arbol binario de codificaci´on. £ Los s´ımbolos se sit´uan en los nodos. £ En cada nodo no terminal, la rama al hijo izquierdo representa un 0 y la rama al hijo derecho un 1. £ El c´odigo de cada s´ımbolo se corresponde con el camino desde la ra´ız al nodo que lo contiene. 4 5 C D E F 0 0 0 0 111 0 1 0 1 4 5 C D E F 0 0 0 11 0 1 0 1 1 c´odigo 1 c´odigo 2 IS13. Estructuras de datos y de la informaci´on — 2003/2004 52
  • 53. El mont´ıculo binario (heap) Un ´arbol de codificaci´on que tenga nodos sin s´ımbolo y con un s´olo hijo produce secuencias codificadas m´as largas que las que produce otro en el que estos nodos se fusionan con sus ´unicos hijos. As´ı, todos los nodos tienen dos hijos o ninguno. Si todos los s´ımbolos est´an en las hojas, ning´un c´odigo es prefijo de otro. £ Una codificaci´on con esta propiedad es un c´odigo libre de prefijos (“prefix code”). As´ı, una secuencia de bits se descodifica de forma no ambigua e instant´anea. £ La secuencia 101001001100000101011 es no ambigua para los c´odigos 1 y 2. Descodificaci´on con c´odigo 1: F 5 5 E 4 F D 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 Descodificaci´on con c´odigo 2: E E C D 4 5 C F £ C´odigo ambiguo: (4, 000), (5, 001), (C, 010), (D, 011), (E, 00), (F, 01). ¿C´omo se descodifica 010000? ¿C4 = 010-000 ´o FEE = 01-00-00? IS13. Estructuras de datos y de la informaci´on — 2003/2004 53
  • 54. El mont´ıculo binario (heap) Llamando p(a) a la profundidad de la hoja en la que est´a el s´ımbolo a del alfabeto A y f(a) a su frecuencia, el coste de un ´arbol binario de codificaci´on para A es: a ∈ A p(a) · f(a) Este coste coincide con el n´umero total de bits calculado anteriormente. Est´a claro que podemos definir distintos c´odigos binarios de longitud variable, para un conjunto de s´ımbolos, que tendr´an distinto coste. Dado un conjunto de s´ımbolos A y sus frecuencias en un fichero, ¿podemos encontrar un ´arbol binario de codificaci´on ´optimo para A, es decir, cuyo coste sea m´ınimo? De esta manera, obtendr´ıamos un c´odigo binario ´optimo que necesitar´ıa el menor n´umero total de bits para representar el fichero. Este c´odigo es ´optimo para una codificaci´on del tipo “s´ımbolo - c´odigo de longitud variable (libre de prefijos)”, dados un alfabeto y las frecuencias de sus s´ımbolos. Otros tipos de codificaci´on pueden reducir m´as el n´umero de bits empleados. IS13. Estructuras de datos y de la informaci´on — 2003/2004 54
  • 55. El mont´ıculo binario (heap) Algoritmo de Huffman Trabaja con un bosque, que es una colecci´on de ´arboles. Inicialmente, cada par (s´ımbolo,frecuencia) forma un ´arbol de un s´olo nodo en el bosque. Iterativamente, hasta que el bosque tenga un s´olo ´arbol: £ Se seleccionan los dos ´arboles con menor coste (da lo mismo c´omo se resuelvan los empates). £ Se forma un nuevo ´arbol binario, creando un nuevo nodo ra´ız que contendr´a: como coste la suma de los costes de los dos ´arboles seleccionados, y como hijos a dichos ´arboles (da lo mismo cu´al sea el izquierdo y cu´al el derecho). IS13. Estructuras de datos y de la informaci´on — 2003/2004 55
  • 56. El mont´ıculo binario (heap) Inicio: 25 23 15 722 C E4 5 F 8 D Iteraci´on 1: 25 23 1522 C E4 5F 8 D 15 7 Iteraci´on 2: 4F 8 15 7 25 23 15 22 C E 5 D 30 IS13. Estructuras de datos y de la informaci´on — 2003/2004 56
  • 57. El mont´ıculo binario (heap) Iteraci´on 3: 4F 8 15 7 15 E 30 22 5 23 25 D C 45 Iteraci´on 4: 4F 8 15 7 15 E 30 22 5 23 25 D C 45 55 IS13. Estructuras de datos y de la informaci´on — 2003/2004 57
  • 58. El mont´ıculo binario (heap) Iteraci´on 5: 4F 8 15 7 15 E 3025 C 55 22 5 23 D 45 100 Coste del ´arbol de codificaci´on de Huffman obtenido: 2 · 25 + 4 · 7 + 4 · 8 + 3 · 15 + 2 · 22 + 2 · 23 = 245 IS13. Estructuras de datos y de la informaci´on — 2003/2004 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´arboles de m´ınimo coste, y finaliza obteniendo el ´arbol binario de codificaci´on de m´ınimo coste (codificaci´on ´optima de longitud variable y libre de prefijos). £ La selecci´on de los ´arboles del bosque con menor coste para formar otro puede hacerse con un heap. El ´arbol de codificaci´on de Huffman puede utilizarse para implementar dos programas de compresi´on y descompresi´on de ficheros. £ Para ello, el ´arbol de codificaci´on debe incluirse en el fichero comprimido (con una representaci´on adecuada), ya que sino ser´a imposible descomprimir. £ Esta manera de comprimir y descomprimir tiene el inconveniente de que la compre- si´on necesita dos recorridos del fichero original: uno para calcular las frecuencias y otro para codificar. IS13. Estructuras de datos y de la informaci´on — 2003/2004 59