You are on page 1of 19

UNIVERZITET U BEOGRADU

MAŠINSKI FAKULTET

ALGORITMI I STRUKTURE PODATAKA

asistent Maja Rosić

mrosic@mas.bg.ac.rs
HEAP
 Heap je struktura podataka u vidu stabla.

 Struktura će imati izgled kompletnog ili delimično


kompletnog stabla.

 Popunjavanje se vrši po nivoima.

 Prvo se popunjava levo, pa desno podstablo.

2
OSOBINA HEAP-a
 Čvor stabla koji predstavlja roditelja mora imati
veću vrednost od svih svojih levih i desnih potomaka.

 Binarno stablo je heap, ukoliko svaki čvor stabla


ispunjava prethodnu osobinu.
12 12 12

8 3 8 12 8 14
Plavi čvor Plavi čvor Plavi čvor nema
poseduje osobinu poseduje osobinu osobinu heap-a
heap-a heap-a

3
OSOBINA HEAP-a
 Ukoliko neki čvor stabla ne poseduje osobinu
heap-a potrebno je izvršiti zamenu sa potomkom koji
poseduje veću vrednost.

12 14

8 14 8 12
Plavi čvor nema Plavi čvor
osobinu heap-a poseduje osobinu
heap-a

4
KONSTRUKCIJA HEAP-A
 Heap se pravi dodavanjem čvorova jedan za drugim.

 Popunjavanje se vrši po nivoima. Kada se jedan nivo


popuni, prelazi se na novi nivo.

 Prvo se popunjava levo, pa desno podstablo.

Dodavanje Dodavanje
novog čvora novog čvora

5
KONSTRUKCIJA HEAP-A

 Pri dodavanju novog čvora može se narušiti


svojstvo heap-a, gde su roditelji manji od potomaka.

 U tom slučaju vrši se zamena.

 Zamena sve vrši iterativno, sve dok svi čvorovine


zadovolje osobinu heap-a.

6
KONSTRUKCIJA HEAP-A
8 8 10 10

10 8 8 5

1 2 3

10 10 12

8 5 12 5 10 5

12 8 8
4

7
PRIMENA HEAP-a
 Prioriteni red može se implementirati pomoću
različitih struktura podataka, jedna od implementacija
je pomoću heap-a, koji je sortiran po određenom
prioritetu.

 Čvor sa najvećim prioritetom biće prvi izbačen iz


stabla bez obzira kada je ubačen.

8
PRIMER PRIORITETAN RED
25

22 17

19 22 14 15

18 14 21 3 9 11

 Dato stablo predstavlja prioritetan red.

 Iz prioritetnog reda uzima se čvor sa najvećim


prioritetom i izbacuje se. 9
PRIMER PRIORITETAN RED
 Poslednji čvor postaje root i primenjujemo
postupak zamene čvorova.
 Možemo primetiti da je svojstvo heap-a narušeno.

11

22 17

19 22 14 15

18 14 21 3 9 11

10
PRIMER PRIORITETAN RED
 Primenjuje se zamena sa prvim većim potomkom.

11

22 17

19 22 14 15

18 14 21 3 9

11
PRIMER PRIORITETAN RED
 Primenjuje se zamena sa većim potomkom.

22

11 17

19 22 14 15

18 14 21 3 9

12
PRIMER PRIORITETAN RED
 Primenjuje se zamena sa većim potomkom.

22

22 17

19 11 14 15

18 14 21 3 9

13
PRIMER PRIORITETAN RED
 Ponovo smo dobili heap, koji ujedno predstavlja i
prioritetni red.
22

22 17

19 21 14 15

18 14 11 3 9

14
SORTIRANJE
 Kako heap predstaviti pomoću niza?
0 25
1 2
22 17

3 4 5 6
19 22 14 15
7 8 10
9 11 12
18 14 21 3 9 11

0 1 2 3 4 5 6 7 8 9 10 11 12
25 22 17 19 22 14 15 18 14 21 3 9 11

 Levi potomak čvora sa indeksom i nalazi se na indeksu 2*i +1


 Desni potomak čvora sa indeksom i nalazi se na indeksu 2*i +2
15
SORTIRANJE
 Da bi iz heap-a dobili sortirani niz. Prvi element iz
heap-a zamenjujemo sa poslednjim elementom heap-a.

0 1 2 3 4 5 6 7 8 9 10 11 12
25 22 17 19 22 14 15 18 14 21 3 9 11

0 1 2 3 4 5 6 7 8 9 10 11 12
11 22 17 19 22 14 15 18 14 21 3 9 25

16
SORTIRANJE
 Posle zamene narušeno je svojstvo heap-a. Da bi dobili
sortirani niz pri svakoj zameni moramo prvo da uredimo ostatak
niza u heap, pa onda da vršimo zamenu, sve dok ne dobijemo
sortiran niz.
0 1 2 3 4 5 6 7 8 9 10 11 12
11 22 17 19 22 14 15 18 14 21 3 9 25

0 1 2 3 4 5 6 7 8 9 10 11 12
22 22 17 19 21 14 15 18 14 11 3 9 25

0 1 2 3 4 5 6 7 8 9 10 11 12
9 22 17 19 21 14 15 18 14 11 3 22 25 17
SORTIRANJE
3
def swap(i, j):
heap[i], heap[j] = heap[j], heap[i]

1 if __name__ == '__main__':
heap = [25, 22, 17, 19, 22, 14, 15, 18, 14, 21, 3, 9, 11]
heap_sort()
print(heap)
SORTIRANJE
2def heapify(i, end):
left = 2 * i + 1
right = 2 * i + 2
max_index = i

if left < end and heap[i] < heap[left]:


max_index = left

if right < end and heap[max_index] < heap[right]:


max_index = right

if max_index != i:
swap(i, max_index)
heapify(max_index, end)

def heap_sort():
end = len(heap)
start = end // 2 - 1

for i in range(start, -1, -1):


heapify(i, end)

for i in range(end - 1, 0, -1):


swap(0, i)
heapify(0, i)

You might also like