Algorytmy i programowanie Kopce i kolejki priorytetowe Kopiec ...
Algorytmy i programowanie Kopce i kolejki priorytetowe Kopiec ...
Algorytmy i programowanie Kopce i kolejki priorytetowe Kopiec ...
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) .