Heap
Reprezentarea arborilor cu array
Insertia in heap
Extragerea din heap
Heap Sort
Heap(ansamblu) este un arbore binar complet pe nivele.
Este e structura arborescenta reprezentata printr-un tablou(array).
In loc de pointeri, legaturile dintre nodurile parinte si fiu sunt date de pozitia elementelor in tablou(array).
Heap-ul este un arbore ordonat:
min-heap: parintele < ambii fii
max-heap: parintele > ambii fii
Min-heap:
Pentru array-uri care incep de la pozitia 1 iar pozitia 0 este nefolosita:
fiul stang al elementului i se gaseste la pozitia 2*i
fiul drept al elementului i se gaseste la pozitia 2*i+1
tatal elementului i se gaseste la pozitia i/2
Pentru array-uri care incep de la pozitia 0:
fiul stang al elementului i se gaseste la pozitia 2*i+1
fiul drept al elementului i se gaseste la pozitia 2*i+2
tatal elementului i se gaseste la pozitia (i-1)/2
Economisim multa memorie pentru ca nu mai stocam pointeri.
Avem la dispozitie imediat si legatura catre parintele unui nod fara a fi nevoie de un pointer suplimentar.
Nu mai e nevoie sa facem management-ul pointerilor.
Mai putin "dinamic" decat arborele cu pointeri pentru ca trebuie realocat array-ul in momentul depasirii dimensiunii maxime.
Nu putem sa reprezentam decat arbori binari completi pe nivele, sau arbori cat mai asemanatori cu acestia. Un arbore degenerat nu se poate reprezenta eficient cu array!
Inserarea sau Eliminarea unui element nu se poate face decat de la final pentru a mentine proprietatea complet-pe-nivele.
Heap-ul este un arbore ordonat:
min-heap: parintele < ambii fii
Pentru a realiza insertia in min-heap:
noul element se insereaza pe ultima pozitie din array, dimensiunea heap-ului creste cu 1,
elementul se propaga in sus prin interschimbari pana cand este verificata conditia parinte<fiu
sau pana cand elementul ajunge in radacina (deci era cel mai mic din toate elementele din heap)
Pentru a realiza extragerea radacinii din min-heap:
radacina face swap pe ultima pozitie din array, dimensiunea heap-ului scade cu 1,
elementul din radacina se propaga in jos prin interschimbari pana cand este verificata conditia parinte<fiu
sau pana cand elementul nu mai are fii
Pentru a sorta cu heapsort:
Construim un heap cu valorile pe care le dorim sortate.
Min-heap pentru a sorta descrescator
Max-heap pentru a sorta crescator
Extragem radacina de n-1 ori si o punem la final.
Insertia in heap, average = worst: O( log n )
Extragerea radacinii, average = worst: O( log n )
Constructia heapului prin n insertii : O( n log n )
Extragerea radacinii de n ori: O( n log n )
Total: O( n log n ) + O( n log n ) = O( n log n )