Sunteți pe pagina 1din 7

Anghel Ovidiu-Gabriel - 322 AC -

Heapsort
1 INTRODUCERE
Prin algoritmul heapsort se ordoneaz elementele n spaiul alocat vectorului: la un moment dat doar un numr constant de elemente ale vectorului sunt pstrate n afara spaiului alocat vectorului de intrare. Astfel, algoritmul heapsort combin calitile a dou tipuri de algoritmi de sortare, sortare intern i sortare extern. Heapsort introduce o tehnica nou de proiectare a algoritmilor bazat pe utilizarea unei structuri de date, numit de regula heap. Structura de date heap este util nu doar pentru algoritmul heapsort, ea poate fi la fel de util i n tratarea eficient a unei cozi de prioritate. Termenul heap a fost introdus i utilizat iniial n contextul algoritmului heapsort, dar acesta se folosete i n legtur cu alocarea dinamic, respectiv n tratarea memoriei bazate pe colectarea reziduurilor (garbage collected storage), de exemplu n limbajele de tip Lisp. Structura de date heap nu se refera la heap-ul menionat n alocarea dinamica, i ori de cte ori, n aceasta lucrare voi vorbi despre heap, vom nelege structura definit aici pentru heapsort. Structura de date heap (binar) este un vector care poate fi vizualizat sub forma unui arbore binar aproape complet. Fiecare nod al arborelui corespunde unui element al vectorului care conine valorile ataate nodurilor. Arborele este plin, exceptnd eventual nivelul inferior, care este plin de la stnga la dreapta doar pn la un anumit loc. Un vector A care reprezint un heap are doua atribute: lungime[A], reprezint numrul elementelor din vector i dimensiune-heap*A+ reprezint numrul elementelor heapului memorat n vectorul A. Astfel, chiar daca A*1..lungime*A++ conine n fiecare element al sau date valide, este posibil ca elementele urmtoare elementului A*dimensiune-heap[A]], unde dimensiuneheap*A+ lungime*A+, s nu aparin heap-ului. Rdcina arborelui este A*1+. Dat fiind un indice i, corespunztor unui nod, se pot determina uor indicii printelui acestuia Parinte(i), al fiului Stanga(i) i al fiului Dreapta(i). Parinte(i) returneaza [i/2] Stanga(i) returneaza 2i Dreapta(i) returneaz 2i + 1

Anghel Ovidiu-Gabriel - 322 AC -

n cele mai multe cazuri, procedura Stnga poate calcula valoarea 2i cu o singura instruciune, translatnd reprezentarea binara a lui i la stnga cu o poziie binara. Similar, procedura Dreapta poate determina rapid valoarea 2i + 1, translatnd reprezentarea binara a lui i la stnga cu o poziie binara, iar bitul nou intrat pe poziia binara cea mai nesemnificativa va fi 1. n procedura Parinte valoarea [i/2]se va calcula prin translatarea cu o poziie binara la dreapta a reprezentrii binare a lui i. ntr-o implementare eficienta a algoritmului heapsort, aceste proceduri sunt adeseori codificate sub forma unor macro-uri sau a unor proceduri n-line. Pentru orice nod i, diferit de rdcina, este adevrat urmtoarea proprietate de heap: A[Parinte(i)] A[i] adic valoarea ataata nodului este mai mic sau egal cu valoarea asociat printelui su. Astfel cel mai mare element din heap este pstrat n rdcin, iar valorile nodurilor oricrui subarbore al unui nod sunt mai mici sau egale cu valoarea nodului respectiv. Definim nlimea unui nod al arborelui ca fiind numrul muchiilor aparinnd celui mai lung drum care leag nodul respectiv cu o frunz, iar nlimea arborelui ca fiind nlimea rdcinii. Deoarece un heap avnd n elemente corespunde unui arbore binar complet, nlimea acestuia este (log2 n). Vom vedea c timpul de execuie al operaiilor de baz, care se efectueaz pe un heap, este proporional cu nlimea arborelui i este (log2 n). n cele ce urmeaz, vom prezenta trei proceduri i modul lor de utilizare n algoritmul de sortare, respectiv ntr-o structura de tip coada de prioritate. Procedura Reconstituie-Heap are timpul de execuie (log2 n) i este de prima importana n ntreinerea proprietii de heap. Procedura Construieste-Heap are un timp de execuie liniar i genereaz un heap dintr-un vector neordonat, furnizat la intrare. Procedura Heapsort se executa n timpul O(n log2 n) i ordoneaz un vector n spaiul alocat acestuia. Procedura Reconstituie-Heap este un subprogram important n prelucrarea heap-urilor. Datele de intrare ale acesteia sunt un vector A i un indice i din vector. Atunci cnd se apeleaz Reconstituie-Heap, se presupune c subarborii, avnd ca rdcini nodurile Stnga(i) respectiv Dreapta(i), sunt heap-uri. Dar, cum elementul A*i+ poate fi mai mic dect descendenii si, acesta nu respecta proprietatea de heap. Sarcina procedurii Reconstituie-Heap este de a scufunda n heap valoarea A*i+, astfel nct subarborele care are n rdcina valoarea elementului de indice i, s devina un heap.

Anghel Ovidiu-Gabriel - 322 AC -

Subalgoritm Reconstituie-Heap(A, i) 1: l Stnga(i) 2: r Dreapta(i) 3: daca l dimesiune-heap[A] i A[l] > A[i] atunci 4: maxim l 5: altfel 6: maxim i 7: daca r dimesiune-heap[A] i A[r] > A[maxim] atunci 8: maxim r 9: daca maxim <> i atunci 10: schimba A[i] A[maxim] 11: Reconstituie-Heap(A, maxim)
Timpul de execuie al procedurii Reconstituie-Heap, corespunztor unui arbore de rdcin i i dimensiune n, este (1), timp n care se pot analiza relaiile dintre A*i+, A*Stnga(i)+ i A*Dreapta(i)+ la care trebuie adugat timpul n care Reconstituie-Heap se executa pentru subarborele avnd ca rdcin unul dintre descendenii lui i. Dimensiunea acestor subarbori este de cel mult 2n/3 cazul cel mai defavorabil fiind acela n care nivelul inferior al arborelui este plin exact pe jumtate astfel, timpul de execuie al procedurii Reconstituie-Heap poate fi descris prin urmtoarea inegalitate recursiva: T(n) T(2n/3) + (1): Timpul de execuie al procedurii Reconstituie-Heap pentru un nod de nlime h poate fi exprimat alternativ ca fiind egal cu (h).

Figura ilustreaz efectul procedurii Reconstituie-Heap. La fiecare pas se determina cel mai mare element dintre A*i+, A*Stnga(i)+ i A*Dreapta(i)+, iar indicele sau se pstreaz n variabila maxim. Daca A*i+ este cel mai mare, atunci subarborele avnd ca rdcin nodul i este un heap i procedura se termina. n caz

Anghel Ovidiu-Gabriel - 322 AC contrar, cel mai mare element este unul dintre cei doi descendeni i A[i] este interschimbat cu A*maxim+. Astfel, nodul i i descendenii si satisfac proprietatea de heap. Nodul maxim are acum valoarea iniiala a lui A*i+, deci este posibil ca subarborele de rdcin maxim s nu ndeplineasc proprietatea de heap. Rezulta c procedura Reconstituie-Heap trebuie apelata recursiv din nou pentru acest subarbore.

2 CONSTRUIREA UNUI HEAP


Procedura Reconstituie-Heap poate fi utilizata de jos n sus pentru transformarea vectorului A*1..n+ n heap, unde n = lungime[A]. Deoarece toate elementele subirului A*(*n/2++1)..n+ sunt frunze, acestea pot fi considerate ca fiind heap-uri formate din cte un element. Astfel, procedura Construieste-Heap trebuie s traverseze doar restul elementelor i s execute procedura Reconstituie-Heap pentru fiecare nod ntlnit. Ordinea de prelucrare a nodurilor asigura c subarborii, avnd ca rdcin descendeni ai nodului i s formeze heap-uri nainte ca Reconstituie-Heap s fie executat pentru aceste noduri.

Subalgoritm Construieste-Heap(A) 1: dimesiune-heap[A] lungime[A] 2: pentru i [lungime[A]/2],1 executa 3: Reconstituie-Heap(A, i)


Timpul de execuie al procedurii Construieste-Heap poate fi calculat simplu, determinnd limita superioara a acestuia: fiecare apel al procedurii Reconstituie-Heap necesita un timp (log2 n) i, deoarece pot fi (n) asemenea apeluri, rezulta c timpul de execuie poate fi cel mult (n log2 n). Aceasta estimare este corecta, dar nu este suficient de tare asimptotic. Vom obine o limita mai tare observnd c timpul de execuie a procedurii Reconstituie-Heap depinde de nlimea nodului n arbore, aceasta fiind mica pentru majoritatea nodurilor. Estimarea noastr mai riguroasa se bazeaz pe faptul c un heap avnd n elemente are nlimea log2n i c pentru orice nlime h, n heap exista cel mult *n/2h+1+noduri de nlime h. Timpul de execuie a procedurii Reconstituie-Heap pentru un nod de nlime h fiind (h), obinem pentru timpul de execuie a procedurii Construieste-Heap:

Anghel Ovidiu-Gabriel - 322 AC -

Figura ilustreaz modul de funcionare al procedurii Construieste-Heap. n figura se vizualizeaz structurile de date n starea lor anterioara apelului procedurii Reconstituie-Heap (linia 3 din procedura Construieste-Heap). (a) Se considera un vector A avnd 10 elemente i arborele binar corespunztor. Dupa cum se vede n figura, variabila de control i a ciclului, n momentul apelului Reconstituie- Heap(A, i), indica nodul 5. (b) reprezint rezultatul, variabila de control i a ciclului acum indica nodul 4. (c) - (e) vizualizeaz iteraiile succesive ale ciclului pentru din Construieste-Heap. Se observa c, atunci cnd se apeleaz procedura Reconstituie-Heap pentru un nod dat, subarborii acestui nod sunt deja heap-uri. (f) reprezint heap-ul final al procedurii Construieste-Heap.

Anghel Ovidiu-Gabriel - 322 AC -

3 ALGORITMUL HEAPSORT
Algoritmul heapsort ncepe cu apelul procedurii Construieste-Heap n scopul transformrii vectorului de intrare A*1..n+ n heap, unde n = lungime*A+. Deoarece cel mai mare element al vectorului este ataat nodului rdcin A*1+, acesta va ocupa locul definitiv n vectorul ordonat prin interschimbarea sa cu A*n+. n continuare, excluznd din heap cel de-al n-lea element (i micornd cu 1 dimesiune-heap[A]), restul de A[1..(n - 1)] elemente se pot transforma uor n heap, deoarece subarborii nodului rdcin au proprietatea de heap, cu eventuala excepie a elementului ajuns n nodul rdcin.

SubalgoritmHeapsort(A) 1: Construieste-Heap(A) 2: pentru i lungime[A], 2 executa 3: schimba A[1] A[i] 4: dimesiune-heap[A] dimesiune-heap[A] - 1 5: Reconstituie-Heap(A, 1)
Apelnd procedura Reconstituie-Heap(A, 1) se restabilete proprietatea de heap pentru vectorul A[1..(n - 1)+. Acest procedeu se repeta micornd dimensiunea heap-ului de la n - 1 pn la 2.

Anghel Ovidiu-Gabriel - 322 AC Figura ilustreaz, pe un exemplu, modul de funcionare a procedurii Heapsort, dupa ce n prealabil datele au fost transformate n heap. Fiecare heap reprezint starea iniiala la nceputul pasului iterativ (linia 2 din ciclul pentru). (a) Structura de date heap, imediat dupa construirea sa de ctre procedura Construieste-Heap. (b)-(j) Heap-ul, imediat dupa cte un apel al procedurii Reconstituie-Heap (linia 5 n algoritm). Figura reprezint valoarea curenta a variabilei i. Din heap fac parte doar nodurile din cercurile nehaurate. (k) Vectorul A ordonat, obinut ca rezultat.

Bibliografie : http://en.wikipedia.org/wiki/Heapsort http://rosettacode.org/wiki/Sorting_algorithms/Heapsort http://www.sorting-algorithms.com/heap-sort

S-ar putea să vă placă și