Gomila (struktura podataka)
![](http://upload.wikimedia.org/wikipedia/commons/thumb/b/b5/Gomila.jpg/220px-Gomila.jpg)
Gomila (binarna) je struktura podataka koju čine liste objekta koju možemo gledati kao na skoro kompletno binarno stablo.[1] Svaki čvor u stablu odgovara rednom broju elemenata u listi. Svaki nivo stabla je potpuno popunjen izuzev najnižeg levog podstabla.Jer se elementi i stablo ubacuju sa leva na desne tj. prvo se popunjava levo podstablo, pa onda desno podstablo.
Roditelj mora biti veći ili jednaki od svog deteta.
Karakteristike gomile[uredi | uredi izvor]
Lista koja predstavlja gomilu je objekat koji ima dve osobine:
- Dužinu (length) koja vraća broj elemenata u listi
- Veličina gomile (heap-size) koja pokazuje koliko elemenata u nizu su sortirani u listi
Čvor u stablu je prvi element liste (i = 1) gde i označavamo kao indeks elemenata u listi. Levo dete dobijamo formulom 2*i. Desno dete dobijamo formulom 2*i+1.
Za sve elemente u gomili važi pravilo 0 <= A.heap-size <= A.length.[2]
Operacije nad gomilom[uredi | uredi izvor]
Brisanje iz gomile[uredi | uredi izvor]
Funkcija koja omogućava brisanje elemenata iz gomile.
Ubacivanje u gomilu[uredi | uredi izvor]
Funkcija koja omogućava ubacivanje elemenata u gomilu.
Max-Heapify[uredi | uredi izvor]
Funkcija koja pravi da svaki čvor mora da svaki roditelj u stablu mora biti veći ili jednaki detetu.
Build-Max heap[uredi | uredi izvor]
Funkcija koja pravi ne rastuću gomilu od ne sortiranog niza.
Heap property[uredi | uredi izvor]
Je pravilo na kome je zasnovana gomila kao struktura podataka. I po ovom pravilu roditelj mora biti veći ili jednaki detetu.
Da bi smo održali
Složenost funkcija[uredi | uredi izvor]
Funkcija | Najbolji slučaj | Najgori slučaj |
---|---|---|
Build-Max heap | O(n) | O(n) |
Max-Heapify | O(logn) | O(logn) |
Ubacivanje u gomilu | O(logn) | O(logn) |
Brisanje iz gomile | O(logn) | O(logn) |
Naći min | O(1) | O(1) |
Naći maks | O(1) | O(1) |
Održavanje Max heap property[uredi | uredi izvor]
Da bi smo mogli da održavamo Max heap property, mi moramo da pozivamo funkciju Max-Heapify. Funkciji prosleđujemo listu i indeks elemenata koji se nalazi u listi. Kada se poziva Max-Heapify za određeni čvor, funkcija pretpostavlja da su levi i desni list čvora Max-Heap, ali i da njihov roditelj može biti malji od svoje dece. I ovo krši pravilo max heap property. Ako se ovo desi Max-Heapify omogićava da roditelj u stablu zameni mesto i indeks sa najvećim detetom. Posto smo zamenili roditelja sa detetom, sad moramo da proverimo da li narušavamo heap property i tom (levom ili desnom) podstablu sad rekurzivno pozivamo funkciju Max-Heapify u tom podstablu da bi smo održavali Max heap property.
Pseudo kod
Max-Heapify(A, i)
l=Left(i)
r=Right(i)
if l <=A.heap-size and A[l]>A[i]
largest = l
else largest = i
if r<=A.heap-size and A[r]>A[largest]
largest = r
if largest ≠ i
excange A[i] with largest
Max-Heapify(A, largest)
Napraviti gomilu[uredi | uredi izvor]
Koristimo proceduru Max-Heapify da bi smo od liste dužine n napravili max-neap. Procedura Build-Max heap prolazi kroz sve čvorove stabla i za svaki čvor poziva funkciju Max-Heapify.
Pseudo kod
Build-Max heap(А)
A.heap-size = A.length
for i = [A.length/2] downto 1
Max-Heapify(A, i)
Vrste gomila[uredi | uredi izvor]
Imamo dve vrste gomila max-heaps i min-heaps. I u oba slučaja mora biti zadovoljen Heap property. Samo sto kod max-heap roditelj je veći ili jednak detetu. I kod max-heap najveći čvor je na vrhu stabla. A kod min-heap roditelj je manji ili jednak detetu. I najmanji čvor je na samom vrhu stabla.
Algoritam za sortiranje[uredi | uredi izvor]
![](http://upload.wikimedia.org/wikipedia/commons/1/1b/Sorting_heapsort_anim.gif)
Prostorna složenost:
Algoritam za sortiranje gomila zove se Heap Sort i njegova složenost je O(nlogn).
Pseudo kod
BuildMax-Heap(A)
for i = A.length downto 2
exchange A[1] with A[i]
A.heap-size = A.heap-size-1
MAX-HEAPIFY(A,1)
Reference[uredi | uredi izvor]
- ^ Škarić, Milan. „12”. Uvod u programiranje (na jeziku: Srpski jezik). Beograd: Mikro knjiga. „Binarno stablo”
- ^ Cormen, Thomas H. (1990 (first edition)). „Heapsort”. Introduction to Algorithms, Third Edition (PDF) (na jeziku: engleski). Charles E. Leiserson Ronald L. Rivest Clifford Stein (3. izd.). United States: MIT Press. str. 1292. ISBN 978-0-262-03384-8. Arhivirano iz originala (PDF) 18. 10. 2016. g. Pristupljeno 08. 2. 2016. „Heap(Gomila)” Proverite vrednost paramet(a)ra za datum:
|date=
(pomoć)
Literatura[uredi | uredi izvor]
- Cormen, Thomas H. (1990 (first edition)). „Heapsort”. Introduction to Algorithms, Third Edition (PDF) (na jeziku: engleski). Charles E. Leiserson Ronald L. Rivest Clifford Stein (3. izd.). United States: MIT Press. str. 1292. ISBN 978-0-262-03384-8. Arhivirano iz originala (PDF) 18. 10. 2016. g. Pristupljeno 03. 01. 2016. „Heap(Gomila)” Proverite vrednost paramet(a)ra za datum:
|date=
(pomoć) - Škarić, Milan. „12”. Uvod u programiranje (na jeziku: Srpski jezik). Beograd: Mikro knjiga. „Binarno stablo”
- Introductions to algorithms -Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein, knjigu možete pogledati ovde Arhivirano na sajtu Wayback Machine (18. oktobar 2016)
- Algoritmi i strukture podataka - Milo Tomašević