L7a

3
Structuri de Date L A B O R A T O R 7a MinHeap binar Un minheap este un vector cu urmatoarele proprietati: !aloarea "iecarui nod este mai mica sau e#ala cu valorile din nodurile "ii$ deci valoarea minima se a"la in radacina arborelui% !aloarea din po&itia ' are "iul stan#a in po&itia ()' si "iul dreapta in po&itia ()'*+% ,arintele valorii din po&itia ' este in po&itia '-(% ./emple de vectori minheap de lun#ime 0 construiti cu valorile +$($1$0 : +$1$($0 +$($1$0 +$($0$1 + + + - 2 - 2 - 2 1 ( ( 1 ( 0 - - - 0 0 1 Adau#area unui nou element la un vector Heap se "ace in prima po&itie libera 3de la s"arsitul vectorului4$ dupa care se ridica acest element in vector ast"el ca sa se respecte conditia de minheap% addH 3/4 5 '6**n -- ' este prima po&itie libera pune / in po&itia ' repeta cat timp '8+ si a9'-( 8a9' 5 -- daca a9' mai mic ca parintele sau schimba a9' cu a9'-( '6'-( ; ; La e/tra#erea si eliminarea valorii minime dintrun minheap 3primul element4 se aduce apoi ultimul element in prima po&itie$ dupa care se corectea&a vectorul pentru respectarea conditie de heap 3prin propa#area in <os a valorii din prima po&itie$ cat timp este necesar4: delH 5 /6a9+ -- prima valoare e minima a9+ 6a9n -- se aduce ultima valoare la inceput heapi"=3+4 -- re"acere heap return / ; Operatia >heapi"=> se poate e/prima recursiv sau iterativ: se determina repetat valoarea ma/ima dintre elementele a9' $ a9()' si a9()'*+ si$ daca e nevoie$ se aduce acest ma/im in po&itia '% ?otand cu a vectorul si cu n dimensiunea sa$ "orma recursiva este: heapi"=3'4 5 -- a<ustare arbore cu radacina in '

description

tol

Transcript of L7a

Structuri de Date

L A B O R A T O R 7a MinHeap binar

Un minheap este un vector cu urmatoarele proprietati:- Valoarea fiecarui nod este mai mica sau egala cu valorile din nodurile fii,deci valoarea minima se afla in radacina arborelui.- Valoarea din pozitia k are fiul stanga in pozitia 2*k si fiul dreapta inpozitia 2*k+1. Parintele valorii din pozitia k este in pozitia k/2. Exemple de vectori minheap de lungime 4 construiti cu valorile 1,2,3,4 :

1,3,2,4 1,2,3,4 1,2,4,3

1 1 1 / \ / \ / \ 3 2 2 3 2 4 / / / 4 4 3

Adaugarea unui nou element la un vector Heap se face in prima pozitie libera(de la sfarsitul vectorului), dupa care se ridica acest element in vector astfel ca sa se respecte conditia de minheap.

addH (x) { k=++n; // k este prima pozitie libera pune x in pozitia k repeta cat timp k>1 si a[k/2]>a[k] { // daca a[k] mai mic ca parintele sau schimba a[k] cu a[k/2] k=k/2 } }

La extragerea si eliminarea valorii minime dintr-un minheap (primul element)se aduce apoi ultimul element in prima pozitie, dupa care se corecteaza vectorul pentru respectarea conditie de heap (prin propagarea in jos a valorii din prima pozitie, cat timp este necesar):

delH { x=a[1]// prima valoare e minima a[1]=a[n--] // se aduce ultima valoare la inceput heapify(1)// refacere heap return x }

Operatia "heapify" se poate exprima recursiv sau iterativ: se determina repetat valoarea maxima dintre elementele a[k], a[2*k] si a[2*k+1] si, daca e nevoie, se aduce acest maxim in pozitia k. Notand cu a vectorul si cu n dimensiunea sa, forma recursiva este:

heapify(k) { // ajustare arbore cu radacina in k m=indmin (k) // indice minim dintre a[k],a[2k],a[2k+1] daca m != k atunci { schimba a[k] cu a[m] heapify(m) // ajustare subarbore cu radacina in m } }

Varianta iterativa a functiei anterioare este:

heapify(k) { repeta cat timp e necesar un interschimb { m=indmin (k) // indice maxim dintre a[k],a[2k],a[2k+1] daca m != k atunci{ schimba a[k] cu a[m] k=m } } }

Observatie: inainte de a folosi indicii 2*k si 2*k+1 se verifica daca exista acesti indici in vector (daca sunt inferiori lui n).

indmin (k) { st=2*k, dr=st+1 m=k// indice val. minima (initial k) daca st