Una cola de prioridad es un tipo de datos abstractos que captura la idea de un contenedor cuyos elementos tienen “prioridades” adjuntas. Un elemento de máxima prioridad siempre aparece en la parte delantera de la cola. Si se elimina ese elemento, el siguiente elemento de mayor prioridad avanza al frente.
La biblioteca estándar de C ++ define una plantilla de clase priority_queue , con las siguientes operaciones:
- push: inserta un elemento en la cola de prioridad.
- top: Devuelve (sin eliminarlo) un elemento de mayor prioridad de la cola de prioridad.
- pop: elimina un elemento de mayor prioridad de la cola de prioridad.
- tamaño: Devuelve el número de elementos en la cola de prioridad.
- vacío: devuelve verdadero o falso según si la cola de prioridad está vacía o no.
El siguiente fragmento de código muestra cómo construir dos colas de prioridad, una que puede contener enteros y otra que puede contener cadenas de caracteres:
- Cómo resolver SPOJ.com - Problema GERGOVIA en SPOJ
- ¿Cuáles son los algoritmos necesarios para resolver div2 500 y div2 1000 fácilmente en topcoder?
- Cómo resolver un cubo de rubik más rápido
- ¿Qué es un algoritmo de colonia de abejas artificiales y cómo se puede utilizar para la optimización de estructuras de celosía?
- ¿Cómo pueden los estudiantes de electricidad y electrónica llegar a ser buenos en algoritmos y estructuras de datos?
#include
prioridad_que q1;
prioridad_cadena q2;
El siguiente es un ejemplo del uso de colas prioritarias:
#include
#include
#include
usando el espacio de nombres estándar; // Esto es para poner a disposición los nombres de las cosas definidas en la biblioteca estándar.
int main ()
{
piority_queue pq; // Crea una cola de prioridad pq para almacenar cadenas e inicializa la cola para que esté vacía.
pq.push (“el rápido”);
pq.push (“zorro”);
pq.push (“saltó”);
pq.push (“el perro perezoso”);
// Las cadenas se ordenan dentro de la cola de prioridad en orden lexicográfico (diccionario):
// “zorro”, “saltó”, “el perro perezoso”, “el rápido”
// La cadena de prioridad más baja es “zorro”, y la cadena de prioridad más alta es “la rápida”
while (! pq.empty ()) {
cout << pq.front () << endl; // Imprimir cadena de máxima prioridad
pq.pop (); // Eliminar cadena de mayor prioridad
}
devuelve 0;
}
La salida de este programa es:
el rapido
el perro perezoso
saltó sobre
zorro
Dado que una cola sigue una disciplina de prioridad, las cadenas se imprimen de mayor a menor prioridad.
Algunas veces uno necesita crear una cola prioritaria para contener objetos definidos por el usuario. En este caso, la cola de prioridad necesita conocer el criterio de comparación utilizado para determinar qué objetos tienen la prioridad más alta. Esto se realiza mediante un objeto de función perteneciente a una clase que sobrecarga el operador (). El sobrecargado () actúa como <con el propósito de determinar prioridades. Por ejemplo, supongamos que queremos crear una cola prioritaria para almacenar objetos Time. Un objeto Time tiene tres campos: horas, minutos, segundos:
tiempo de estructura {
int h;
int m;
int s;
};
clase CompareTime {
público:
operador bool () (Tiempo y t1, Tiempo y t2) // Devuelve verdadero si t1 es anterior a t2
{
if (t1.h <t2.h) devuelve verdadero;
if (t1.h == t2.h && t1.m <t2.m) devuelve verdadero;
if (t1.h == t2.h && t1.m == t2.m && t1.s <t2.s) devuelve verdadero;
falso retorno;
}
}
Una cola prioritaria para almacenar tiempos según el criterio de comparación anterior se definiría de la siguiente manera:
Priority_queue <Tiempo, vector , Comparar tiempo> pq;
Aquí hay un programa completo:
#include
#include
#incluye
usando el espacio de nombres estándar;
tiempo de estructura {
int h; //> = 0
int m; // 0-59
int s; // 0-59
};
clase CompareTime {
público:
operador bool () (Tiempo y t1, Tiempo y t2)
{
if (t1.h <t2.h) devuelve verdadero;
if (t1.h == t2.h && t1.m <t2.m) devuelve verdadero;
if (t1.h == t2.h && t1.m == t2.m && t1.s <t2.s) devuelve verdadero;
falso retorno;
}
};
int main ()
{
Priority_queue <Tiempo, vector , Comparar tiempo> pq;
// Matriz de 4 objetos de tiempo:
Tiempo t [4] = {{3, 2, 40}, {3, 2, 26}, {5, 16, 13}, {5, 14, 20}};
para (int i = 0; i <4; ++ i)
pq.push (t [i]);
while (! pq.empty ()) {
Tiempo t2 = pq.top ();
cout << setw (3) << t2.h << "" << setw (3) << t2.m << "" <<
setw (3) << t2.s << endl;
pq.pop ();
}
devuelve 0;
}
El programa imprime los tiempos desde el más reciente hasta el más antiguo:
5 16 13
5 14 20
3 2 40
3 2 26
Si quisiéramos que los primeros tiempos tuvieran la máxima prioridad, redefiniríamos CompareTime así:
clase CompareTime {
público:
operador bool () (Tiempo & t1, Tiempo & t2) // t2 tiene el prio más alto que t1 si t2 es anterior a t1
{
if (t2.h <t1.h) devuelve verdadero;
if (t2.h == t1.h && t2.m <t1.m) devuelve verdadero;
if (t2.h == t1.h && t2.m == t1.m && t2.s <t1.s) devuelve verdadero;
falso retorno;
}
};