Lekcja 9
kopce

Kopce.

Czym jest kopiec (ang. heap) ...

Przykład kopca:
Następującej tablicy:

odpowiada drzewo:

Zadanie 130
Zaimplementuj następującą procedurę służącą do "naprawiania" niekompletnego kopca ...

Procedura Heapify(A, i)

Następnie wypróbuj jej działanie na następującym kopcu:

zakładając że procedurę uruchomiono z parametrami (A, 1).
 

Zastosowanie kopca: sortowanie/ HeapSort.

Zadanie 131
Zaimplementuj procedurę HeapSort i pomocniczą procedurę BuildHeap opisane niżej:

Procedura BuildHeap(A)

Procedura HeapSort(A)

Zastosowanie kopca: kolejka priorytetowa.

Kolejka priorytetowa to zbiór elementów posiadających atrybuty "key" (klucz) oraz "value" (wartość), na którym można wykonywać następujące operacje:

Procedure HeapInsert(S,x)

Function HeapMaximum(S)

Function HeapExtractMax(S)

Zadanie 132
Zaimplementuj kolejkę priorytetową przy pomocy kopca. Oszacuj czas działania wszystkich operacji.

Dodatkowe założenia: Elementy kolejki powinny być przechowywane w tablicy S[1..n]; elementy tej tablicy są obiektami z atrybutami key i value; zakładamy że dysponujemy operacją Heapify() używająca wartości key[] każdego elementu tablicy.

Wskazówka do operacji HeapInsert(S,x): dodajemy nowy element x jako liść drzewa (na koniec kopca); oczywiście ojciec x może nie spełniać własności kopca. Istnieje ścieżka od x do korzenia drzewa. Przesuwamy x po tej ścieżce, w kierunku korzenia, aż nie znajdziemy dla niego właściwego miejsca (przesuwanie polega na "zamianie miejscami" z ojcem). Zauważmy, że mimo przesuwania x, drzewo o korzeniu w x jest zawsze kopcem - nie jest to takie całkiem oczywiste ...
 

Zadanie 133
Do kolejki priorytetowej dodaj operacje:

Procedure HeapChangeKey(S,i,newKey )

Operacja ta zmienia klucz elementu o indeksie i zachowując własność kopca.