Zakładamy tutaj, że im mniejszy klucz tym element ma wyższy priorytet.
MakeQueueTworzy kolejkę priorytetową z tablicy elementów posiadających priorytety.
InsertWstawia element o kluczu do kolejki .
MinimumZwraca element należący do o najmniejszym kluczu, czyli najwyższym priorytecie (nie usuwa go z )
ExtractMinWykonuje Minimum, a następnie usuwa zwrócony element z .
DecreaseKeyInformuje kolejkę, że element ma zmniejszony klucz (zwiększony priorytet), może to skutkować przesunięciem elementu w kolejce.
UnionZwraca kolejkę będącą złączeniem kolejek oraz .
DeleteUsuwa element z kolejki .
MakeQueue (Binary heap)Procedura ta może zostać zaimplementowana przy użyciu procedury BuildHeap, która ma złożoność obliczeniową , gdzie jest długością tablicy .
Insert (Binary heap)Procedura ta będzie dodawać nowy element w pierwszym możliwym miejscu (nowy liść), a następnie idąc w górę kopca (działając podobnie do Heapify, ale od dołu do góry) będzie szukane, gdzie umiejscowiony zostanie nowy element.
++while :
Złożoność obliczeniowa: nowy klucz będzie przesuwany w górę kopca, wykonując operacji na każdym jego poziomie.
Zatem wiedząc, że wysokość kopca o elementach to wiemy, że złożoność obliczeniowa tej procedury wynosi
Minimum (Binary heap)return
Kopiec jest zapisywany w tablicy , zakładając, że jest to kopiec minimalny, jego pierwszy element będzie miał najmniejszy klucz. Złożoność obliczeniowa to .
ExtractMin (Binary heap)if :
return else:
--Heapifyreturn Jeśli kopiec nie jest pusty, zapisujemy wartość w jego korzeniu, zastępujemy ją ostatnią wartością z kolejki , zmniejszamy rozmiar kolejki i przywracamy własność kopca.
Złożoność obliczeniowa: wszystkie operacje poza Heapify mają złożoność , natomiast Heapify dla kolejki długości ma złożoność .
Zatem w sumie złożoność to
DecreaseKeywhile :
Niniejsza procedura jest bardzo podobna do procedury Insert. Jest realizowana poprzez sprawdzenie, czy własność kopca binarnego jest zachowana, jeśli nie to naprawia kopiec, przesuwając odpowiedni element w górę kopca.
Podobne wnioskowanie jak w przypadku Insert daje nam złożoność obliczeniową .
Union (Binary heap)Join złączenie elementów dwóch tablicBuildHeapZłączenie kopców polega na przepisaniu obu kopców do jednej tablicy oraz wykonaniu procedury budowy kopca na nowej tablicy.
Złożoność obliczeniowa: zarówno połączenie dwóch tablic jak i procedura BuildHeap możemy ograniczyć asymptotycznie przez złożoność liniową od sumarycznej wielkości tych tablic. Zakładając, że dostajemy złożoność .
Delete--HeapifyUsuwanie elementu o indeksie z kopca polega na przesunięciu tego elementu do części tablicy, które będzie poza kopcem, zmniejszeniem wielkości kopca oraz naprawieniem własności kopca.
Złożoność obliczeniowa: operacja o największej złożoności obliczeniowej jest procedura Heapify, która ma złożoność , zakładając, że .
Porównanie złożoności obliczeniowych procedur na kolejkach priorytetowych dla różnych implementacji kopców:
| Procedura | Kopiec binarny (koszt pesymistyczny) | Kopiec dwumianowy (koszt pesymistyczny) | Kopiec Fibonacciego (koszt zamortyzowany) |
|---|---|---|---|
Insert |
|||
Minimum |
|||
ExtractMin |
|||
DecreaseKey |
|||
Union |
|||
Delete |