Binarne hrpe Potpuno binarno stablo binarno stablo u kojem svaki čvor koji nije list ima točno 2 nasljednika. Binarna hrpa potpuno binarno stablo u kojem svaki čvor koji nije list ima veću ključnu vrijednost nego čvorovi u njegovim podstablima. 16 14 10 8 7 9 3 16 14 10 8 7 9 3 2 4 1 2 4 1 Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 117 / 133
Binarna hrpa A implementirana kao polje: length[a] broj elemenata u polju A heap-size[a] broj elemenata u hrpi A korijen: A[1] roditelj dijete: Parent(i) 1 return i/2 Left(i) 1 return 2i Right(i) 1 return 2i + 1 Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 118 / 133
Svojstvo binarne hrpe max-heap svojstvo: min-heap svojstvo: A[Parent(i)] A[i], i > 1 A[Parent(i)] A[i], i > 1 Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 119 / 133
Zadatak Zadatak 10.1 Pokažite da hrpa od n elemenata ima visinu lg n. Zadatak 10.2 Čini li polje 23, 17, 14, 6, 13, 10, 1, 5, 7, 12 max-hrpu? Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 120 / 133
Čuvanje svojstva hrpe input: polje A i indeks i output: Left(i), Right(i) su hrpe podstablo od i je hrpa pretpostavka: podstabla u Max-Heapify(A, i) 1 l Left(i) 2 r Right(i) 3 if l heap-size[a] and A[l] > A[i] 4 then largest l 5 else largest i 6 if r heap-size[a] and A[r] > A[largest] 7 then largest r 8 if largest i 9 then A[i] A[largest] 10 Max-Heapify(A, largest) Vrijeme izvršavanja procedure: O(lg n) Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 121 / 133
Primjer Zadatak 10.3 Primjenite Max-Heapify(A, i) na dano potpuno binarno stablo A za i = 2. i 16 4 10 8 7 9 3 2 4 1 Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 122 / 133
Zadaci Zadatak 10.4 Napišite pseudokod za Min-Heapify proceduru koja će raditi u O(lg n) vremenu. Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 123 / 133
Izgradivanje hrpe Koristimo proceduru Max-Heapify za pretvaranje polja A[1... n] u max-hrpu. Build-Max-Heap(A) 1 heap-size[a] length A 2 for i length[a]/2 downto 1 3 do Max-Heapify(A, i) Vremenska složenost algoritama: O(n lg n) Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 124 / 133
Zadaci Zadatak 10.5 Napišite algoritam u peudokodu koji će sortirati polje od n elemenata uz pomoć max-hrpe. Algoritam neka radi u O(n lg n) vremenu. Primjenite algoritam na polju A = 5, 13, 2, 25, 7, 17, 20, 8, 4 Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 125 / 133
Prioritetni red struktura podataka u kojoj je svakom elementu pridružena ključna vrijednost i omogućeno je efikasno nalaženje ključeva s minimalnom odnosno maksimalnom vrijendošću. Operacije nad max-prioritetnom redu: Insert(S, x) ubacivanje elementa u skup S. Maximum(S) vrati element iz skupa S koji ima maksimalnu vrijednost ključa. Extract-Max(S) vrati i obriši element iz skupa S koji ima maksimalnu vrijednost ključa. Increase-Key(S, x, k) uvećaj vrijednost ključa elementa x s key[x] na k. Prioritetni red ćemo implementirati uz pomoć max binarne hrpe. Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 126 / 133
Element s maksimalnom vrijednošću ključa: Maximum(S) 1 return S[1] Skidanje elementa s maksimalnom vrijednošću ključa: Extract-Max(S) 1 if heap-size[s] < 1 2 then error heap underflow 3 max S[1] 4 S[1] S[heap-size[S]] 5 heap-size[s] heap-size[s] 1 6 Max-Heapify(S, 1) 7 return max Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 127 / 133
Ubacivanje elementa u skup S: Insert(S, k) 1 heap-size[s] heap-size[s] + 1 2 S[heap-size[S]] 3 Increase-Key(S, heap-size[s], k) Povećavanje vrijednosti ključa na nekom elementu skupa S: Increase-Key(S, i, k) 1 if k < S[i] 2 then error key is smaller than current key 3 S[i] k 4 while i > 1 and S[Parent[i]] < S[i] 5 do exchange S[i] S[Parent(i)] 6 i Parent(i) Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 128 / 133
Primjer Neka je dan skup podataka A = 16, 14, 10, 8, 7, 9, 3, 2, 4, 1 max binarne hrpe. Primjenite sljedeće operacije Maximum(A), Extract-Max(A), Increase-Key(A, 5, 12), Insert(A, 11). Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 129 / 133
Primjena: Huffmanov kod Efikasna tehnika koja se koristi kod kompresije podataka: 20% 90% sažimanje ovisno o tipu podataka. Primjer: Datoteka C sadrži znakove iz alfabeta {a, b, c, d, e, f } i želimo predstaviti znakove (tipa char) preko proizvoljnog binarnog kodiranja. a b c d e f f 45 13 12 16 9 5 FBC 000 001 010 011 100 101 VBC 0 101 100 111 1101 1101 ukupni broj bitova potrebno za prikaz znakova iz datoteke C: c C fc c CBR: c C fc c = 300000 relativno VBR: c C fc c = 224000 smanjenje: C CBR C VBR C CBR = 25, 3% Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 130 / 133
Ideja Na temelju frekvencija pojedinog znaka generirati njegov binarni kod čija će veličina varirati ovisno o frekvenciji. Dakle, generirat ćemo binarno stablo T koja će minimizirati vrijednost funkcije B(C) = c C f (c)d T (c) d T (c) predstavlja udaljenost znaka c od korijena stabla T. Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 131 / 133
Huffmanov algoritam Huffman(C) 1 Q C 2 for i 1 to C 1 3 do alociraj novi čvor z 4 left[z] x Extract-Min(Q) 5 right[z] y Extract-Min(Q) 6 key[z] key[x] + key[y] 7 Insert(Q, z) ubacujemo čvor z s ključem f [z] 8 return Extract-Min(Q) Vrijeme izvršenja algoritma: O(n lg n). Zašto? Primjer: Na temelju dane tablice generirajmo Huffmanov kod. Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 132 / 133
Zadaci Zadatak 11.1 Napišite Huffmanov kod na temelju riječi w = abacadabba Zadatak 11.2 Za dani skup frekvencija znakova {a : 4, b : 12, c : 12, d : 8, e : 9, f : 14} generirajte Huffmanov kod. Strukture podataka i algoritmi VJEŽBE 26. siječnja 2014. 133 / 133