Una cola de prioridad es un tipo de datos abstracto en programación que admite dos operaciones obligatorias: agregar un elemento y extraer el máximo [1] (mínimo). Se supone que para cada elemento es posible calcular su prioridad - un número real o, en el caso general, un elemento de un conjunto ordenado linealmente [2] .
Los principales métodos implementados por la cola de prioridad son los siguientes [2] [3] [1] :
En este caso, un valor de clave más pequeño corresponde a una prioridad más alta.
En algunos casos, es más natural que la clave crezca junto con la prioridad. Entonces el segundo método puede llamarse extract_maximum()[1] .
Hay una serie de implementaciones en las que ambas operaciones básicas se realizan en el peor de los casos en un tiempo limitado (ver "O" grande y "o" pequeña ), donde es el número de pares almacenados.
Como ejemplo de una cola de prioridad, considere la lista de tareas de un trabajador. Cuando termina una tarea, pasa a la siguiente, la de mayor prioridad (la clave será el recíproco de la prioridad), es decir, realiza la operación de extraer el máximo. El jefe agrega tareas a la lista, indicando su prioridad, es decir, realiza la operación de agregar un elemento.
En la práctica, la interfaz de cola de prioridad a menudo se amplía con otras operaciones [4] [3] :
En las colas de prioridad indexadas (direccionadas [5] ), es posible acceder a los elementos por índice. Estas colas se pueden utilizar, por ejemplo, para fusionar varias secuencias ordenadas (fusión multidireccional) [1] .
También se puede considerar la cola de prioridad doble (DEPQ ) , en la que hay operaciones de acceso tanto al elemento mínimo como al máximo [6] .
La cola de prioridad se puede implementar en función de varias estructuras de datos.
Las implementaciones más simples (y no muy eficientes) pueden usar una matriz desordenada u ordenada , una lista enlazada , adecuada para colas pequeñas. En este caso, los cálculos pueden ser tanto “perezosos” (la severidad de los cálculos se transfiere a la extracción del elemento), como tempranos (ansiosos), cuando la inserción del elemento es más difícil que su extracción. Es decir, una de las operaciones se puede realizar en el tiempo y la otra, en el peor de los casos , donde está la longitud de la cola [1] .
Más eficientes son las implementaciones basadas en heap , donde ambas operaciones se pueden realizar en el peor de los casos en el tiempo [1] . Estos incluyen montón binario , montón binomial, montón de fibonacci, montón de emparejamiento[6] .
El tipo de datos abstractos (ATD) para la cola de prioridad se deriva del montón ADT cambiando el nombre de las funciones correspondientes. El valor mínimo (máximo) siempre está en la parte superior del montón [7] .
La biblioteca estándar de Python contiene un módulo heapq[8] que implementa una cola de prioridad [9] :
# importar dos funciones de cola con los nombres usados en este artículo de heapq import heappush as insert , heappop as extract_maximum pq = [] # inicializar la lista insert ( pq , ( 4 , 0 , "p" )) # insertar el elemento "p" en la cola " con índice 0 y prioridad 4 insert ( pq , ( 2 , 1 , "e" )) insert ( pq , ( 3 , 2 , "a" )) insert ( pq , ( 1 , 3 , "h" )) # deascendenteordenenelementoscuatrolosimprime _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Este ejemplo generará la palabra "montón".