1 / 37

Curs 3

Curs 3. arbori binari aplicaţie: reprezentarea expresiilor ca arbori coada cu priorităţi şi max-heap colecţii de mulţimi disjuncte şi “union-find”. Tipul de date abstract ArbBin. obiecte : arbori binari un arbore binar este o colecţie de noduri cu proprietăţile:

dore
Download Presentation

Curs 3

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Curs 3 • arbori binari • aplicaţie: reprezentarea expresiilor ca arbori • coada cu priorităţi şi max-heap • colecţii de mulţimi disjuncte şi “union-find”

  2. Tipul de date abstract ArbBin • obiecte : arbori binari • un arbore binar este o colecţie de noduri cu proprietăţile: • orice nod are 0, 1 sau 2 succesori (fii, copii) • orice nod, exceptând unul singur – rădăcina, are un singur nod predecesor (tatăl, părintele) • rădăcina nu are predecesori • fiii sunt ordonaţi: fiul stâng, fiul drept (daca un nod are un singur fiu, trebuie menţionat care) • nodurile fără fii formează frontiera arborelui

  3. C E G A K M D B L F I H Arbori binari: exemplu rădăcină fiu stâng fiu drept subarbore stâng

  4. v t1 t2 Arbori binari: definiţia recursivă: • arborele cu nici un nod (vid) este arbore binar • daca v este un nod şi t1, t2 sunt arbori binari atunci arborele care are pe v ca rădăcină, t1 subarbore stâng al rădăcinii şi t2 subarbore drept al rădăcinii, este arbore binar

  5. ArbBin: operaţii • insereaza() • intrare: • un arbore binar t • adresa unui nod cu cel mult un fiu (tatăl noului nod) • tipul fiului adăugat (stânga, dreapta) • informaţia e din noul nod • ieşire • arborele la care s-a adăugat un nod ce memorează e; noul nod nu are fii

  6. C E G A K M D B L F I H ArbBin: inserare X Y

  7. ArbBin: eliminare • elimina() • intrare: • un arbore binar t • adresa unui nod fără fii şi adresa nodului-tată • ieşire • arborele din care s-a eliminat nodul dat (de pe frontieră)

  8. E G A K M D B F I H ArbBin: eliminare C L

  9. ArbBin :parcurgere preordine • parcurgePreordine() • intrare • un arbore binar t • o procedură viziteaza() • ieşire • arborele binar t dar cu nodurile procesate cu viziteaza()în ordinea: • rădăcina (R) • subarborele stânga (S) • subarborele dreapta (D)

  10. ArbBin :parcurgere preordine - exemplu C E G A K M D B L F I H C, A, L, K, E, H, B, F, G, D, I M,

  11. ArbBin :parcurgere inordine • parcurgeInordine() • intrare • un arbore binar t • o procedură viziteaza() • ieşire • arborele binar t dar cu nodurile procesate cu viziteaza()în ordinea S R D

  12. ArbBin :parcurgere inordine - exemplu C E G A K M D B L F I H K, A, F, B, H, L, E, C, M, I, D G,

  13. ArbBin: parcurgere postordine • parcurgePostordine() • intrare • un arbore binar t • o procedurăviziteaza() • ieşire • arborele binar t dar cu nodurile procesate cu viziteaza()în ordinea S D R

  14. ArbBin :parcurgere postordine - exemplu C E G A K M D B L F I H H, B, K, L, F, A, E, M, I, D, G, C

  15. ArbBin: parcurgere BFS • parcurgeBFS() - Breadth-first search • intrare • un arbore binar t • o procedurăviziteaza() • ieşire • arborele binar t dar cu nodurile procesate cu viziteaza()în ordinea BFS (pe niveluri)

  16. ArbBin: parcurgere BFS - exemplu C E G A K M D B L F I H C, M, D, G, E, A, K, B, L, I, H F,

  17. C E G A M D K F L I B H ArbBin: implementare cu structuri înlănţuite • reprezentarea obiectelor

  18. ArbBin: structura unui nod • un nod v(aflat la adresa v) este o structură cu trei câmpuri: • v->inf /*informaţia memorata în nod*/ • v->stg /*adresa fiului stânga*/ • v->drp /*adresa fiului dreapta*/

  19. Arbori binari: parcurgePreordine() procedure parcurgePreordine(v, viziteza) if (v = NULL) then return else viziteaza(v) parcurgePreordine(v->stg) parcurgePreordine(v->drp) end

  20. Arbori binari: implementarea parcurgerii BFS C E G A K M D ( C E G Coada = K ) A D M

  21. Arbori binari: implementarea parcurgerii BFS procedure parcurgeBFS(t, viziteaza) begin if (t = NULL) then return else Coada coadaVida() insereaza(Coada, t) while (not esteVida(Coada)) citeste(Coada, v) viziteaza(v) if (vstg  NULL) then insereaza(Coada, v->stg) if (vdrp  NULL) then insereaza(Coada, v->drp) elimina(Coada) end

  22. Aplicaţie: expresii întregi • Expresii întregi • definiţie • exemple • Reprezentarea expresiilor ca arbori • similarităţi între cele două definiţii • arborele asociat unei expresii • notaţiile prefixate, infixate şi postfixate şi parcurgeri ale arborilor

  23. Definiţia expresiilor întregi <int> ::= ... –2 | -1 | 0 | 1 | 2 ... <expr_int> ::= <int> | <exp_int> <op_bin> <exp_int> | (<exp_int>) <op_bin> ::= + |  | * | / | % • reguli de precedenţă 12-5*2 este (12-5)*2 sau 12-(5*2)? • reguli de asociere 15/4/2 este (15/4)/2 sau 15/(4/2)? 15/4*2 este (15/4)*2 sau 15/(4*2)?

  24. + + * * 43 -12 5 / 17 66 34 21 Expresiile reprezentate ca arbori -12 + 17 * 5 – (43 + 34 / 21 * 66)

  25. + + * * 43 -12 5 / 17 66 34 21 Notaţiile postfixate şi prefixate • notaţia postfixată se obţine prin parcurge postordine -12, 17, 5, *, +, 43, 34, 21, /, 66, *, +, - • notaţia prefixata se obţine prin parcurge preordine -,+, -12, *, 17, 5, +, 43, *, /, 34, 21, 66

  26. Coada cu priorităţi: tip de data abstract • obiecte: structuri de date în care elementele sunt numite atomi; orice atom are un câmp-cheie numit prioritate

  27. Coada cu priorităţi: operaţii • citeste • intrare: o coadă cu priorităţi C • ieşire: atomul din C cu cheia cea mai mare • elimina • intrare: o coadă cu priorităţi C • ieşire: C din care s-a eliminat atomul cu cheia cea mai mare • insereaza • intrare: o coadă cu priorităţi C şi un atom at • ieşire: C la care s-a adăugat at

  28. 12 9 8 1 7 3 4 2 5 maxHeap • arbori binari compleţi cu proprietatea: pentru orice nod, cheia din acel nod este mai mare decât sau egală cu cheile din nodurile fii • exemplu

  29. maxHeap: eliminarea 12 9 8 1 7 3 4 2 5

  30. maxHeap: inserarea 10 12 9 8 1 7 3 4 2 5

  31. x a[i] y z 12 a[2*i+1] a[2*i+2] 9 8 1 7 3 4 2 5 maxHeap:implementarea cu tablouri (k) 1  k  n-1  a[k]  a[(k-1)/2] 12 9 8 7 1 3 4 5 2 0 1 2 3 4 5 6 8 7

  32. maxHeap: inserare procedure insereaza(a, n, cheie) begin n  n+1 a[n-1]  cheie j  n-1 heap  false while ((j > 0) and not heap) do k  [(j-1)/2] if (a[j] > a[k]) then swap(a[j], a[k]) j  k else heap  true end

  33. maxHeap - elimina procedure elimina(a, n) begin a[0]  a[n-1] n  n-1 j  0 heap  false while ((2*j+1 < n) and not heap) do k  2*j+1 if ((k < n-1) and (a[k] < a[k+1])) then k  k+1 if (a[j] < a[k]) then swap(a[j], a[k]) j  k else heap  true end

  34. 0 1 2 3 4 5 6 maxHeap: timp de execuţie • înălţime (adâncime) arbore = lungimea celui mai lung drum de la rădăcina la frontiera • lungime drum = număr arce • n =2k-1 • înălţime arbore = k = log (n+1) • operaţiile înserare/eliminare necesită timpul O(înălţime abore) = O(log n)

  35. Colecţii de mulţimi disjuncte: tip de dată abstract • obiecte: colecţii de submulţimi disjuncte (partiţii) ale unei mulţimi univers • operaţii: • find() • intrare: o colecţie C, un element x din univers • ieşire: submulţimea din C la care aparţine x • union() • intrare: o colecţie C, două elemente x şi y din univers • ieşire: C in care componentele lui x şi resp. y sunt reunite • single() • intrare: o colecţie C, un element x din univers • ieşire: C la care componenta lui x are pe x ca unic element

  36. 9 5 6 8 0 1 3 7 2 4 Colectii de multimi disjuncte: “union-find” • structura “union-find” • mulţimea univers = {0,1, ..., n-1} • submulţime = arbore • colecţie = pădure • reprezentarea unei păduri prin legătura părinte parinte

  37. Colecţii de mulţimi disjuncte: “union-find” function find(C, i) begin temp  i while (parinte[temp] >= 0) do temp  parinte[temp] return temp end procedure union(C, i, j) begin ri  find(i) rj  find(j) if (ri  rj) then parinte[rj]  ri end

More Related