20.07.2013 Views

Algorytmy i programowanie Kopce i kolejki priorytetowe Kopiec ...

Algorytmy i programowanie Kopce i kolejki priorytetowe Kopiec ...

Algorytmy i programowanie Kopce i kolejki priorytetowe Kopiec ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Kopiec</strong><br />

<strong>Kopiec</strong>:<br />

<strong>Algorytmy</strong> i <strong>programowanie</strong><br />

<strong>Kopce</strong> i <strong>kolejki</strong> <strong>priorytetowe</strong><br />

• jest to prawie pełne drzewo binarne, to znaczy na przykład drzewo po lewej nie może być<br />

kopcem, podczas gdy po prawej jak najbardziej:<br />

• przechowywany jest w tablicy A [1..n] , której elementami są liczby, dodatkowo kopiec posiada<br />

atrybut heap-size [A] , na przykład powyższy kopiec (drzewko po prawej) ma postać tablicową:<br />

A : 56, 53, 23, 9, 14, 16, 15, 0, 7, 8<br />

i heap-size [A] = 10,<br />

• posiada własność kopca: dla każdego wierzchołka o indeksie i (który nie jest korzeniem -<br />

korzeń ma indeks 1) A [Parent (i)] A [i] , gdzie Parent (i) jest indeksem rodzica węzła o<br />

indeksie i.<br />

Tak się dobrze składa, że drzewo powyżej ma wszystkie wymienione własności więc jest przykładem<br />

kopca.<br />

Poniżej kilka przydatnych funkcji na kopcach:<br />

Parent(i)<br />

return i div 2<br />

Heapify(A, i)<br />

Left(i)<br />

return 2 ∗ i<br />

l ← Left (i)<br />

r ← Right (i)<br />

if (l heap-size [A]) and (A [l] > A [i])<br />

then largest ← l<br />

else largest ← i<br />

if (r heap-size [A]) and (A [r] > A [largest])<br />

then largest ← r<br />

if not (largest = i)<br />

then pomoc ← A [largest]<br />

A [largest] ← A [i]<br />

A [i] ← pomoc<br />

Hepify (A, largest)<br />

BuildHeap(A)<br />

Right(i)<br />

return 2 ∗ i + 1<br />

heap-size [A] ← length [A]<br />

for i ← length [A] div 2 downto 1<br />

do Heapify (A, i)<br />

HeapSort(A)<br />

BuildHeap (A)<br />

for i ← length [A] to 2<br />

do A [1] ↔ A [i]<br />

heap-size [A] ← heap-size [A] − 1<br />

Heapify (A, 1)


Kolejki <strong>priorytetowe</strong><br />

Kolejka priorytetowa to zbiór elementów o atrybutach key oraz value, na którym można wykonać<br />

następujące operacje:<br />

a) MaxHeapInsert (A, key) - umieszczenie na kopcu nowego elementu o zadanym kluczu,<br />

b) HeapMaximum (A) - pobranie elementu na szczycie kopca,<br />

c) HeapExtractMaximum (A) - zdjęcie elementu ze szczytu kopca,<br />

d) HeapIncreaseKey (A, i, key) - zwiększenie klucza elementu i do wartości key.<br />

MaxHeapInsert(A, key)<br />

heap-size [A] ← heap-size [A] + 1<br />

A [heap-size [A]] ← −∞<br />

HeapIncreaseKey (A, heap-size [A] , key)<br />

1. Czy ciąg 23, 17, 14, 6, 13, 10, 1, 5, 7, 12 jest kopcem?<br />

HeapMaximum(A)<br />

return A [1]<br />

2. Zasymuluj działanie procedury Heapify (A, 3) dla tablicy A : 27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0.<br />

3. Zasymuluj działanie procedury HeapSort (A) dla tablicy A : 5, 13, 2, 25, 7, 17, 20, 8, 4.<br />

4. Zaproponuj iteracyjną wersję algorytmu Heapify (A, i) .<br />

5. Napisać w pseudokodzie procedury HeapExtractMaximum (A) i HeapIncreaseKey (A, i, key) .

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!