380 likes | 707 Views
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:
E N D
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: • 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
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
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
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
C E G A K M D B L F I H ArbBin: inserare X Y
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ă)
E G A K M D B F I H ArbBin: eliminare C L
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)
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,
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
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,
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
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
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)
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,
C E G A M D K F L I B H ArbBin: implementare cu structuri înlănţuite • reprezentarea obiectelor
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*/
Arbori binari: parcurgePreordine() procedure parcurgePreordine(v, viziteza) if (v = NULL) then return else viziteaza(v) parcurgePreordine(v->stg) parcurgePreordine(v->drp) end
Arbori binari: implementarea parcurgerii BFS C E G A K M D ( C E G Coada = K ) A D M
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 (vstg NULL) then insereaza(Coada, v->stg) if (vdrp NULL) then insereaza(Coada, v->drp) elimina(Coada) end
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
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)?
+ + * * 43 -12 5 / 17 66 34 21 Expresiile reprezentate ca arbori -12 + 17 * 5 – (43 + 34 / 21 * 66)
+ + * * 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
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
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
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
maxHeap: eliminarea 12 9 8 1 7 3 4 2 5
maxHeap: inserarea 10 12 9 8 1 7 3 4 2 5
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
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
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
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)
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
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
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