Cola de prioridad usando el módulo Queue y Heapdict en Python

Priority Queue es una extensión de la cola con las siguientes propiedades.

  • Un elemento con prioridad alta se elimina de la cola antes que un elemento con prioridad baja.
  • Si dos elementos tienen la misma prioridad, se sirven según su orden en la cola.

cola. PriorityQueue (tamaño máximo)

Es un constructor para una cola de prioridad. maxsize es el número de elementos que se pueden insertar en la cola, su valor predeterminado es 0. Si el valor de maxsize es menor o igual a 0, entonces el tamaño de la cola es infinito. Los elementos se recuperan por orden de prioridad (el más bajo primero).
Funciones-

  • put(): pone un elemento en la cola.
  • get(): elimina y devuelve un elemento de la cola.
  • qsize(): devuelve el tamaño de la cola actual.
  • vacío(): devuelve verdadero si la cola está vacía, falso de lo contrario. Es equivalente a qsize()==0.
  • full(): devuelve True si la cola está llena, False en caso contrario. Es equivalente a qsize()>=maxsize.

Nota: empty() , full(), qsize()no son confiables ya que corren el riesgo de una condición de carrera en la que el tamaño de la cola puede cambiar.

Ejemplo:

from queue import PriorityQueue
  
q = PriorityQueue()
  
# insert into queue
q.put((2, 'g'))
q.put((3, 'e'))
q.put((4, 'k'))
q.put((5, 's'))
q.put((1, 'e'))
  
# remove and return 
# lowest priority item
print(q.get())
print(q.get())
  
# check queue size
print('Items in queue :', q.qsize())
  
# check if queue is empty
print('Is queue empty :', q.empty())
  
# check if queue is full
print('Is queue full :', q.full())

Producción :

(1, 'e')
(2, 'g')
Items in queue : 3
Is queue empty : False
Is queue full : False

heapdict()

Heapdict implementa MutableMapping ABC, lo que significa que funciona de manera muy similar a un diccionario de Python normal. Está diseñado para ser utilizado como cola de prioridad. Junto con las funciones proporcionadas por ordinario dict(), también tiene funciones popitem()y peekitem()que devuelven el par con la prioridad más baja. A diferencia del módulo heapq, HeapDict admite cambiar de manera eficiente la prioridad de un objeto existente («reducir clave»). La alteración de la prioridad es importante para muchos algoritmos, como el Algoritmo de Dijkstra y A*.

Funciones-

  • clear(self) – D.clear() -> Ninguno. Retire todos los elementos de D.
  • peekitem(self) – D.peekitem() -> (k, v), devuelve el par (clave, valor) con el valor más bajo; pero genera KeyError si D está vacío.
  • popitem(self) – D.popitem() -> (k, v), elimina y devuelve el par (clave, valor) con el valor más bajo; pero genera KeyError si D está vacío.
  • get(self, key, default=None ) – D.get(k[, d]) -> D[k] si k en D, sino d. d por defecto es Ninguno.
  • items(self) – D.items() -> un objeto similar a un conjunto que proporciona una vista de los elementos de D
  • keys(self) – D.keys() -> un objeto similar a un conjunto que proporciona una vista de las teclas de D
  • valores (auto) – D.values ​​() -> un objeto que proporciona una vista de los valores de D

Ejemplo:

import heapdict
  
h = heapdict.heapdict()
  
# Adding pairs into heapdict
h['g']= 2
h['e']= 1
h['k']= 3
h['s']= 4
  
print('list of key:value pairs in h:\n', 
      list(h.items()))
print('pair with lowest priority:\n',
      h.peekitem())
print('list of keys in h:\n',
      list(h.keys()))
print('list of values in h:\n',
      list(h.values()))
print('remove pair with lowest priority:\n',
      h.popitem())
print('get value for key 5 in h:\n',
      h.get(5, 'Not found'))
  
# clear heapdict h
h.clear()
print(list(h.items()))

Producción :

list of key:value pairs in h:
 [('g', 2), ('e', 1), ('k', 3), ('s', 4)]
pair with lowest priority:
 ('e', 1)
list of keys in h:
 ['g', 'e', 'k', 's']
list of values in h:
 [2, 1, 3, 4]
remove pair with lowest priority:
 ('e', 1)
get value for key 5 in h:
 Not found
[]

Publicación traducida automáticamente

Artículo escrito por naina024 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *