You are on page 1of 3

Kreiranje hipa od niza

Hip možemo kreirati dodavanjem jednog po jednog elementa niza u hip. Na početku hip sadrži prvi element
niza, a zatim ga proširujemo i na taj način kreiramo hip odozgo nadole. Prilikom dodavanja i-tog elementa prvi
deo niza do pozicije i predstavlja hip, a elementi od pozicije i do kraja niza još nisu uključeni u hip.

Sledi ilustracija kreiranja hipa za niz 4, 7, 3, 10, 2. U binarnom drvetu čvorovi koji su deo hipa označeni su
punom linijom, a ostali elementi niza prikazani su isprekidanom linijom.

Na početku, prvi element niza (4) je koren hipa.

Prilikom dodavanja elementa 7 u hip potrebno je taj element „pomeriti naviše", jer je vedi od vrednosti koju
sadrži njegov predak.

Element 3 je manji od vrednosti pridružene pretku, pa njegovo dodavanje ne prouzokuje razmene vrednosti u
hipu.

Dodavanjam elementa 10 izvršavaju se razmene sadržaja čvorova hipa kao što je prikazano na slici.

Posle dodavanja elementa 2 hip izgleda ovako:


Formiranje hipa na prethodno opisan način realizujemo metodom napraviHip.

void napraviHip(int[] a, int n)


{
int d = 1; // veličina hipa
for ( int i = 1; i < n; i++)
dodaj(a, ref d, a[i]);
}

Hip možemo formirati odozdo nagore. Druga polovina elemenata niza a(a*n/2+,a*n-1]) nema potomke, pa
svaki od tih elemenata možemo posmatrati kao jednočlani hip. Preostale članove niza analiziramo, i to
slededim redom a*n/2-1], ,a[1], a[0]. Svaki od njih postaje koren drveta kome su i desno i levo poddrvo hip i
tako spajamo dva hipa u jedan korišdenjem metode urediHip. Prilikom analize i-tog elementa elementi niza
do i-tog još nisu uključeni u neki hip, a elementi od pozicije i do kraja pripadaju nekom hipu. Nakon analize
svih elemenata ostaje jedan hip. Opisani način formiranje hipa realizovan je metodom napraviHip2.

void napraviHip2(int[] a, int n)


{
for (int i = n / 2 - 1; i >= 0; i--)
urediHip(a, n, i);
}

Sledi ilustracija kreiranja hipa odozdo nagore za niz 4, 7, 3, 10, 2. U binarnom drvetu čvorovi koji su deo nekog
hipa označeni su punom linijom, a ostali elementi niza prikazani su isprekidanom linijom. Na početku,
poslednja tri elementa, 3, 10 i 2, predstavljaju tri jednočlana hipa.

Dodavanjem elementa 7 spajamo dva jednočlana hipa (10 i 2) u jedno drvo koje uređujemo tako da postane
hip.

Preostaje nam da dodamo element 4 i na taj način spojimo dva hipa (tročlani hip 10, 7, 2, i jednočlani hip 3) u
drvo, koje uredimo tako da postane hip.
Kreiranje hipa odozdo nagore je efikasniji način jer je veliki broj čvorova na dnu drveta, a manji broj pri vrhu,
pa se dobija brže rešenje ako minimiziramo obradu čvorova na dnu.

You might also like