Zakładamy tutaj, że im mniejszy klucz tym element ma wyższy priorytet.
MakeQueue
Tworzy kolejkę priorytetową z tablicy elementów posiadających priorytety.
Insert
Wstawia element o kluczu do kolejki .
Minimum
Zwraca element należący do o najmniejszym kluczu, czyli najwyższym priorytecie (nie usuwa go z )
ExtractMin
Wykonuje Minimum
, a następnie usuwa zwrócony element z .
DecreaseKey
Informuje kolejkę, że element ma zmniejszony klucz (zwiększony priorytet), może to skutkować przesunięciem elementu w kolejce.
Union
Zwraca kolejkę będącą złączeniem kolejek oraz .
Delete
Usuwa 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
:
--
Heapify
return
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
DecreaseKey
while
:
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 tablicBuildHeap
Złą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
--
Heapify
Usuwanie 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 |