Kolejka priorytetowa to specjalny rodzaj struktury danych, który umożliwia przechowywanie elementów wraz z ich priorytetami. W odróżnieniu od zwykłej kolejki (FIFO - First In, First Out), w kolejce priorytetowej elementy są usuwane w kolejności wynikającej z ich priorytetów, a nie z kolejności, w jakiej zostały dodane.
Kolejkę priorytetową możemy zaimplementować na kilka sposobów, w zależności od potrzeb.
Moduł queue
udostępnia klasę PriorityQueue, która pozwala utworzyć kolejkę priorytetową.
Przykład:
from queue import PriorityQueue
# Tworzenie kolejki
pq = PriorityQueue()
# Dodawanie elementów (priorytet, wartość)
pq.put((1, "Najwyższy priorytet"))
pq.put((3, "Najniższy priorytet"))
pq.put((2, "Średni priorytet"))
# Pobieranie i usuwanie elementów w kolejności priorytetów
while not pq.empty():
print(pq.get()[1])
Wyjście:
Najwyższy priorytet
Średni priorytet
Niższy priorytet
Dodaje element do kolejki priorytetowej.
from queue import PriorityQueue
pq = PriorityQueue()
pq.put((1, "Pierwszy element"))
pq.put((3, "Trzeci element"))
Pobiera i usuwa z kolejki element o najwyższym priorytecie.
Element o najwyższym priorytecie.
item = pq.get()
print(item) # Wyświetli element o najwyższym priorytecie.
Zwraca liczbę elementów aktualnie znajdujących się w kolejce.
size = pq.qsize()
print(f"Liczba elementów w kolejce: {size}")
Sprawdza, czy kolejka jest pusta.
True
, jeśli kolejka jest pusta.False
, jeśli kolejka zawiera elementy.if pq.empty():
print("Kolejka jest pusta!")
Moduł heapq
implementuje kopiec (heap), który można wykorzystać jako bazę do kolejki priorytetowej. Jest szybszy od PriorityQueue, ale nie ma wbudowanej synchronizacji.
Przykład:
import heapq
# Tworzenie listy jako kopca
pq = []
# Dodawanie elementów (priorytet, wartość)
heapq.heappush(pq, (1, "Najwyższy priorytet"))
heapq.heappush(pq, (3, "Niższy priorytet"))
heapq.heappush(pq, (2, "Średni priorytet"))
# Pobieranie i usuwanie elementów w kolejności priorytetów
while pq:
print(heapq.heappop(pq)[1])
Wyjście:
Najwyższy priorytet
Średni priorytet
Najniższy priorytet