Kolejka priorytetowa to jedna z podstawowych abstrakcyjnych struktur danych, wykorzystywana między innymi w takich zastosowaniach jak:
Oferuje ona następujące operacje:
Ten zestaw operacji często rozszerza się o:
Jeśli struktura danych udostępnia dodatkowo operację łączenia kolejek
to nazywamy ją złączalną kolejką priorytetową.
Najprostszą, choć niezbyt efektywną implementację kolejki priorytetowej stanowi zwykła lista. Znacznie efektywniejszy jest kopiec binarny (wykorzystywany w algorytmie HeapSort), nie pozwala on jednak na szybkie łączenie kolejek. Przedstawione na tym wykładzie struktury danych: kopiec dwumianowy i kopiec Fibonacciego, umożliwiają efektywne wykonywanie wszystkich operacji złączalnej kolejki priorytetowej.
Oto tabela kosztów poszczególnych operacji w wymienionych implementacjach, przy założeniu, że w kolejce(ach) jest aktualnie \( n \) elementów:
Operacja | Lista | Kopiec Binarny | Kolejka Dwumianowa | Fibonacciego(*) |
---|---|---|---|---|
MakePQ | 1 | 1 | 1 | 1 |
Insert | 1 | \( \lg n \) | \( \lg n \) | 1 |
FindMin | \( n \) | 1 | \( \lg n \) | 1 |
DelMin | \( n \) | \( \lg n \) | \( \lg n \) | \( \lg n \) |
DecreaseKey | 1 | \( \lg n \) | \( \lg n \) | 1 |
Delete | 1 | \( \lg n \) | \( \lg n \) | \( \lg n \) |
Meld | 1 | \( n \) | \( \lg n \) | 1 |
(*) - koszt zamortyzowany
Uwaga: wyszukiwanie elementu nie należy do zestawu operacji (złączalnej) kolejki priorytetowej, dlatego w przypadku operacji DecreaseKey i Delete zakładamy, że jako parametr przekazywane jest dowiązanie do elementu, którego ma dotyczyć operacja.