Sunteți pe pagina 1din 5

HEAPSORT

I. CONSIDERAŢII TEORETICE

Algoritm de sortare care combină calităţile sortării prin inserţie cu cele ale sortării prin
interclasare. A fost inventat de Williams 1964.
Prin heapsort se ordonează elementele în spaţiul alocat vectorului.
La un moment dat doar un număr constant de elemente ale vectorului sunt păstrate în
afara spaţiului alocat vectorului de intrare (sortare pe loc).
Timpul de execuţie al agoritmului heapsort este O(nlgn).
Introduce structura de date heap utilă şi în tratarea eficientă a unei cozi de prioritate. Se
foloseşte şi în legătură cu alocarea dinamică, respectiv în tratarea memoriei bazate pe
"colectarea reziduurilor" (garbage collected storage).
Deşi este un algoritm excelent, o implementare bună a algoritmului de sortare rapidă se
poate dovedi de multe ori mai eficientă.

HEAP-URI (ansamblu, “grămadă” binară)

Definiţie: Un vector care poate fi vizualizat sub forma unui arbore binar aproape complet.
Fiecare nod al arborelui corespunde unui element al vectorului care conţine valorile ataşate
nodurilor. Arborele este plin, exceptând eventual nivelul inferior, care este plin de la
stânga la dreapta doar până la un anumit loc.
Caracteristici:
Heap-ul prezintă două atribute:
Lungime[A] - numărul elementelor din vector.
dimensiune-heap[A] - numărul elementelor heap-ului memorat în vectorul A.
Rădăcina arborelui este A[1].
Fiecare nod de indice i este caracterizat de:
PĂRINTE(i) al fiului STÂNGA(i) şi al fiului DREAPTA(i) - returnează [i/2].
STÂNGA(i) returnează 2i.
DREAPTA(i) returnează 2i + 1.
Pentru orice nod i, diferit de rădăcină, este adevărată următoarea proprietate de heap:
A[PĂRINTE(i)] > A[i] (cel mai mare element din heap este păstrat în rădăcină, iar
valorile nodurilor oricărui subarbore al unui nod sunt mai mici sau egale cu valoarea
nodului respectiv).
înălţimea unui nod al arborelui - numărul muchiilor aparţinând celui mai lung drum
care leagă nodul respectiv cu o frunză; înălţimea arborelui - înălţimea rădăcinii (=lgn
pentru un heap având n elemente).
Proceduri utilizate în algoritmul de sortare, respectiv într-o structură de tip coadă de
prioritate:
RECONSTITUIE-HEAP are timpul de execuţie O(lg n) şi este de primă importanţă
în întreţinerea proprietăţii de heap.
CONSTRUTEŞTE-HEAP are un timp de execuţie liniar şi generează un heap dintr-
un vector neordonat furnizat la intrare.
HEAPSORT se execută în timpul O(nlgn) şi ordonează un vector în spaţiul alocat
acestuia.
EXTRAGE-MAX şi INSEREAZĂ se execută în timpul O(lg n); utile în generarea
unei cozi de prioritate dintr-un heap.

RECONSTITUIREA PROPRIETĂŢII DE HEAP


Datele de intrare: vectorul A şi un indice i din vector.
La apelul RECONSTITUIE-HEAP, se presupune că subarborii, având ca rădăcini
nodurile STÂNGA(i) respectiv DREAPTA(i) sunt heap-uri.
Sarcina procedurii RECONSTITUIE-HEAP este de a "scufunda" în heap valoarea A[i],
astfel încât subarborele care are în rădăcină valoarea elementului de indice i, să devină
un heap.

RECONSTITUIE-HEAP(A, i)
1: left ← STÂNGA(i)
2: right ← DREAPTA(i)
3: dacă left ≤ dimensiune-heap[A] şi A[left] > A[i] atunci
4: maxim ← left
5: altfel
6: maxim ← i
7: dacă right ≤ dimensiune-heap[A] şi A[right] > A[maxim] atunci
8: maxim ← right
9: dacă maxim ≠ i atunci
l0: schimbă A[i] ↔ A[maxim]
11: RECONSTITUIE-HEAP(A, maxim)

Modul de funcţionare:
La fiecare pas se determină cel mai mare element dintre A[i], A[STÂNGA(i)] şi
A[DREAPTA(i)], iar indicele său se păstrează în variabila maxim. Dacă A(i) este cel
mai mare, atunci subarborele având ca rădăcină nodul i este un heap şi procedura se
termină. În caz contrar, cel mai mare element este unul dintre cei doi descendenţi şi A[i]
este interschimbat cu A[maxim]. Astfel, nodul i şi descendenţii săi satisfac proprietatea
de heap. Nodul maxim are acum valoarea iniţială a lui A[i], fiind posibil ca subarborele
de rădăcină maxim să nu îndeplinească proprietatea de heap. Rezultă necesitatea apelării
recursive a procedurii RECONSTITUIE-HEAP pentru acest arbore.

CONSTRUIREA UNUI HEAP - a fost propusă de Floyd 1964.

CONSTRUIEŞTE-HEAP(A)
1: dimesiune-heap[A] ← lungime[A]
2: pentru i ← lungime[A]/2, 1 execută
3: RECONSTITUIE-HEAP(A, i)
Mod de funcţionare:
Procedura RECONSTITUTE-HEAP poate fi utilizată "de jos în sus" pentru
transformarea vectorului A[l..n] în heap, unde n = lungime[A]. Deoarece toate
elementele subşirului A[([n/2] + 1)..n] sunt frunze, acestea pot fi considerate ca fiind
heap-uri formate din câte un element. Astfel, procedura CONSTRUIEŞTE-HEAP
trebuie să traverseze doar restul elementelor şi să execute procedura RECONSTITUIE-
HEAP pentru fiecare nod întâlnit. Ordinea de prelucrare a nodurilor asigură că
subarborii, având ca rădăcină descendenţi ai nodului i să formeze heap-uri înainte ca
RECONSTITUIE-HEAP să fie executat pentru aceste noduri.

ALGORITMUL HEAPSORT (metoda sortarii cu ansambluri)

HEAPSORT(A)
1: CONSTRUIEŞTE-HEAP(A)
2: pentru i ← lungime[A], 2 execută
3: schimbă A[1] ↔ A[i]
4: dimesiune-heap[A] ← dimesiune-heap[A] − 1
5: RECONSTITUIE-HEAP(A, 1)

Mod de funcţionare:
Algoritmul heapsort începe cu apelul procedurii CONSTRUIEŞTE-HEAP în scopul
transformării vectorului de intrare A[l..n] în heap, unde n = lungime[A]. Deoarece cel
mai mare element al vectorului este ataşat nodului rădăcină A[1], acesta va ocupa locul
definitiv în vectorul ordonat prin interschimbarea sa cu A[n]. "Excluzând" din heap cel
de-al n-lea element (şi micşorând cu 1 dimesiune-heap(A)), restul de A[1..(n - 1)]
elemente se pot transforma uşor în heap, deoarece subarborii nodului rădăcină au
proprietatea de heap, cu eventuala excepţie a elementului ajuns în nodul rădăcină.
Apelând procedura RECONSTRUIEŞTE-HEAP(A, 1) se restabileşte proprietatea de
heap pentru vectorul A[1..(n - 1)]. Procedeul se repetă micşorând dimensiunea heap-
ului de la n - 1 la 2.

COZI DE PRIORITĂŢI
Una din cele mai frecvente aplicaţii ale unui heap (introdusă de Williams) o constituie
utilizarea lui sub forma unei cozi de priorităţi.
Coada de priorităţi este o structură de date care conţine o mulţime S de elemente,
fiecare având asociată o valoare numită cheie.
Asupra unei cozi de priorităţi se pot efectua următoarele operaţii:
INSEREAZĂ(S, x) - inserează elementul x în mulţimea S (S ← S U {x}).
MAXIM(S) - returnează elementul din S având cheia cea mai mare.
EXTRAGE-MAX(S) - elimină şi returnează elementul din S având cheia cea mai
mare.
Aplicabilitate în:
Planificarea lucrărilor pe calculatoare partajate. Sarcinile care trebuie efectuate şi
priorităţile relative se memorează într-o coadă de prioritate. Când o lucrare este
terminată sau întreruptă, procedura EXTRAGE-MAX va selecta lucrarea având
prioritatea cea mai mare dintre lucrările în aşteptare. Cu ajutorul procedurii
INSERARE în coadă poate fi introdusă oricând o lucrare nouă.
Simularea unor evenimente controlate. Din coadă fac parte evenimentele de simulat,
fiecăruia ataşându-i-se o cheie reprezentând momentul când va avea loc evenimentul.
Evenimentele trebuie simulate în ordinea desfăşurării lor în timp, deoarece simularea
unui eveniment poate determina necesitatea simulării altuia în viitor. În acest caz,
ordinea evenimentelor în coada de priorităţi trebuie inversată, iar procedurile
MAXIM şi EXTRAGE-MAX se vor înlocui cu MINIM Şi EXTRAGE-MIN.
Programul de simulare va determina următorul eveniment cu ajutorul procedurii
EXTRAGE-MIN, iar dacă va trebui introdus un nou element în şir se va apela
procedura INSERARE.
Sortarea și afișarea celor mai relevante k documente în etapele de indexare și
procesare a interogărilor într-un motor de căutare (Yahoo).
Operaţii implementate:
MAXIM-HEAP va determina în timpul θ(1) cel mai mare element al heap-ului
(A[1]).
EXTRAGE-MAX-DIN-HEAP - similară structurii repetitive din liniile 3-5 din
procedura HEAPSORT. Timpul de execuţie este O(lgn).
INSEREAZĂ-ÎN-HEAP - inserează un nod în heap-ul A. Timpul de execuţie pentru
un heap având n elemente este O(lg n). Apelând în mod repetat procedura
INSERARE-ÎN-HEAP poate fi implementată un heap.
EXTRAGE-MAX-D1N-HEAP(A)
1: dacă dimesiune-heap[A] < 1 atunci
2: eroare "depăşire inferioară heap"
3: max ← A[1]
4: A[1] ← A[dimensiune-heap[A]]
5: dimensiune-heap[A] ← dimensiune-heap[A] − 1
6: RECONSTITUIE-HEAP(A, 1)
7: returnează maxim

INSEREAZĂ-ÎN-HEAP(A, cheie)
1: dimensiune-heap[A] ← dimensiune-heap[A] + 1
2: i ← dimensiune-heap[A]
3: cât timp i > 1 şi A[PĂRINTE(i)] < cheie execută
4: A[i] ← A[PĂRINTE(i)]
5: i ← PĂRINTE(i)
6: A[i] ← cheie

Construirea unui Heap prin Inserţie


CONSTRUIEŞTE-HEAP'(A)
1: dimensiune-heap[A] ← 1
2: pentru i ← 2, lungime[A] execută
3: INSEREAZĂ-ÎN-HEAP(A, A[i])

În cazul cel mai defavorabil se execută într-un timp θ(nlgn) pentru construirea unui
heap având n elemente.

II. APLICAŢII

II.1. Scrieţi un program care implementează operaţiile aferente heap-urilor (RECONSTITUIE-HEAP,


CONSTRUIEŞTE-HEAP, HEAPSORT, EXTRAGE-MAX-D1N-HEAP, MAXIM şi
INSEREAZĂ-ÎN-HEAP) folosind funcţiile descrise în prezentul document.

II.2. Scrieţi un program care construiește un ansamblu (Heap) din toate elementele a două heap-uri cu n,
respectiv m elemente.

II.3. Scrieţi un program care verifică dacă un șir dat de numere este ansamblu (heap).

II.4. Se dă un ansamblu într-un vector a. Să se înlocuiască elementul a[i] cu o valoare dată x și să se


refacă ansamblul.

BIBLIOGRAFIE

[Iva98] Ivaşc C., Prună M. – „Bazele informaticii (Grafuri şi elemente de combinatorică), Manual
pentru clasa a X-a”, Editura Petrion, 1998.
[Cor90] Cormen, T. H., Leiserson, C. E., Rivest, R. L. – Introduction to Algorithms. McGraw-Hill,
New York, 1990.

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

  • Intrebarea 1
    Intrebarea 1
    Document2 pagini
    Intrebarea 1
    vvx
    Încă nu există evaluări
  • Tema 6
    Tema 6
    Document14 pagini
    Tema 6
    vvx
    Încă nu există evaluări
  • Intrebarea 5
    Intrebarea 5
    Document2 pagini
    Intrebarea 5
    vvx
    Încă nu există evaluări
  • Intrbarea 2
    Intrbarea 2
    Document1 pagină
    Intrbarea 2
    vvx
    Încă nu există evaluări
  • Intrebarea 4
    Intrebarea 4
    Document1 pagină
    Intrebarea 4
    vvx
    Încă nu există evaluări
  • Tema 5
    Tema 5
    Document14 pagini
    Tema 5
    vvx
    Încă nu există evaluări
  • Tema 5
    Tema 5
    Document14 pagini
    Tema 5
    vvx
    Încă nu există evaluări
  • Tema 2.2
    Tema 2.2
    Document8 pagini
    Tema 2.2
    vvx
    Încă nu există evaluări
  • Tema 4
    Tema 4
    Document14 pagini
    Tema 4
    vvx
    Încă nu există evaluări
  • Tema 5
    Tema 5
    Document14 pagini
    Tema 5
    vvx
    Încă nu există evaluări
  • Tema 3
    Tema 3
    Document18 pagini
    Tema 3
    vvx
    Încă nu există evaluări
  • Tema 2.2
    Tema 2.2
    Document8 pagini
    Tema 2.2
    vvx
    Încă nu există evaluări
  • Tema 4
    Tema 4
    Document14 pagini
    Tema 4
    vvx
    Încă nu există evaluări
  • Tema 2.1
    Tema 2.1
    Document14 pagini
    Tema 2.1
    vvx
    Încă nu există evaluări
  • Tema 1.2
    Tema 1.2
    Document7 pagini
    Tema 1.2
    vvx
    Încă nu există evaluări
  • Analiza Matematica I - Chis Codruta PDF
    Analiza Matematica I - Chis Codruta PDF
    Document101 pagini
    Analiza Matematica I - Chis Codruta PDF
    Silviu Boga
    Încă nu există evaluări
  • Tema 9
    Tema 9
    Document13 pagini
    Tema 9
    vvx
    Încă nu există evaluări
  • Algoritmica
    Algoritmica
    Document85 pagini
    Algoritmica
    Klaudiu
    Încă nu există evaluări
  • Tema 1.1
    Tema 1.1
    Document6 pagini
    Tema 1.1
    vvx
    Încă nu există evaluări
  • Cuvmax
    Cuvmax
    Document2 pagini
    Cuvmax
    vvx
    Încă nu există evaluări
  • Countsort TALAB1
    Countsort TALAB1
    Document2 pagini
    Countsort TALAB1
    vvx
    Încă nu există evaluări
  • Integrale Si Ecuatii Diferentiale PDF
    Integrale Si Ecuatii Diferentiale PDF
    Document51 pagini
    Integrale Si Ecuatii Diferentiale PDF
    vvx
    Încă nu există evaluări
  • Comenzi Linux
    Comenzi Linux
    Document2 pagini
    Comenzi Linux
    vvx
    Încă nu există evaluări
  • Orar Licenta - Absolventi - 2020 2021 1
    Orar Licenta - Absolventi - 2020 2021 1
    Document3 pagini
    Orar Licenta - Absolventi - 2020 2021 1
    vvx
    Încă nu există evaluări
  • Paritate PDF
    Paritate PDF
    Document1 pagină
    Paritate PDF
    vvx
    Încă nu există evaluări
  • 08 Template
    08 Template
    Document8 pagini
    08 Template
    vvx
    Încă nu există evaluări
  • 18.10.19 Desen
    18.10.19 Desen
    Document1 pagină
    18.10.19 Desen
    vvx
    Încă nu există evaluări
  • Formular 1
    Formular 1
    Document1 pagină
    Formular 1
    vvx
    Încă nu există evaluări
  • Formular 1
    Formular 1
    Document1 pagină
    Formular 1
    vvx
    Încă nu există evaluări
  • Comenzi Linux
    Comenzi Linux
    Document2 pagini
    Comenzi Linux
    vvx
    Încă nu există evaluări