Curs 3 arbori binari aplicaie reprezentarea expresiilor ca
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” Algoritmi şi programare 2008 - 2009 1
Tipul de date abstract Arb. Bin Ø obiecte : arbori binari • un arbore binar este o colecţie de noduri cu proprietăţile: 1. orice nod are 0, 1 sau 2 succesori (fii, copii) 2. orice nod, exceptând unul singur – rădăcina, are un singur nod predecesor (tatăl, părintele) 3. rădăcina nu are predecesori 4. fiii sunt ordonaţi: fiul stâng, fiul drept (daca un nod are un singur fiu, trebuie menţionat care) 5. nodurile fără fii formează frontiera arborelui Algoritmi şi programare 2008 - 2009 2
Arbori binari: exemplu C rădăcină fiu stâng fiu drept E G A K B H Algoritmi şi programare L M F D I subarbore stâng 2008 - 2009 3
Arbori binari: definiţia recursivă: – arborele cu nici un nod (vid) este arbore binar – daca v este un nod şi t 1, t 2 sunt arbori binari atunci arborele care pe v ca rădăcină, t 1 subarbore stâng al rădăcinii şi t 2 subarbore drept al rădăcinii, este arbore binar v t 1 Algoritmi şi programare t 2 2008 - 2009 4
Arb. Bin: 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 Algoritmi şi programare 2008 - 2009 5
Arb. Bin: inserare C E G A K X B H Algoritmi şi programare L M F D I Y 2008 - 2009 6
Arb. Bin: 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ă) Algoritmi şi programare 2008 - 2009 7
Arb. Bin: eliminare C E G A K B L M F D I H Algoritmi şi programare 2008 - 2009 8
Arb. Bin : parcurgere preordine • parcurge. Preordine() – 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) Algoritmi şi programare 2008 - 2009 9
Arb. Bin : parcurgere preordine exemplu C E G A K B L M F D I H C, E, K, B, H, A, L, F, G, M, D, I Algoritmi şi programare 2008 - 2009 10
Arb. Bin : parcurgere inordine • parcurge. Inordine() – intrare • un arbore binar t • o procedură viziteaza() – ieşire • arborele binar t dar cu nodurile procesate cu viziteaza()în ordinea S R D Algoritmi şi programare 2008 - 2009 11
Arb. Bin : parcurgere inordine exemplu C E G A K B L M F D I H K, H, B, E, L, A, F, C, M, G, I, D Algoritmi şi programare 2008 - 2009 12
Arb. Bin: parcurgere postordine • parcurge. Postordine() – intrare • un arbore binar t • o procedură viziteaza() – ieşire • arborele binar t dar cu nodurile procesate cu viziteaza()în ordinea S D R Algoritmi şi programare 2008 - 2009 13
Arb. Bin : parcurgere postordine exemplu C E G A K B L M F D I H H, B, K, L, F, A, E, M, I, D, G, C Algoritmi şi programare 2008 - 2009 14
Arb. Bin: parcurgere BFS • parcurge. BFS() - 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) Algoritmi şi programare 2008 - 2009 15
Arb. Bin: parcurgere BFS exemplu C E G A K B L M F D I H C, E, G, K, A, M, D, B, L, F, I, H Algoritmi şi programare 2008 - 2009 16
Arb. Bin: implementare cu structuri înlănţuite • reprezentarea obiectelor C E G A K B L M F D I H Algoritmi şi programare 2008 - 2009 17
Arb. Bin: 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*/ Algoritmi şi programare 2008 - 2009 18
Arbori binari: parcurge. Preordine() procedure parcurge. Preordine(v, viziteza) if (v = NULL) then return else viziteaza(v) parcurge. Preordine(v->stg) parcurge. Preordine(v->drp) end Algoritmi şi programare 2008 - 2009 19
Arbori binari: implementarea parcurgerii BFS C E K G A M D Coada = ( C E G K A M D ) Algoritmi şi programare 2008 - 2009 20
Arbori binari: implementarea parcurgerii BFS procedure parcurge. BFS(t, viziteza) begin if (t = NULL) then return else Coada coada. Vida() insereaza(Coada, t) while (not este. Vida(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 Algoritmi şi programare 2008 - 2009 21
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 Algoritmi şi programare 2008 - 2009 22
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 15/4*2 Algoritmi şi programare este (15/4)/2 (15/4)*2 sau 2008 - 2009 15/(4/2)? 15/(4*2)? 23
Expresiile reprezentate ca arbori -12 + 17 * 5 – (43 + 34 / 21 * 66) + + * -12 17 * 43 5 34 Algoritmi şi programare 2008 - 2009 66 / 21 24
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 + + * -12 17 * 43 5 / 34 Algoritmi şi programare 2008 - 2009 66 21 25
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 Algoritmi şi programare 2008 - 2009 26
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 Algoritmi şi programare 2008 - 2009 27
max. Heap • 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 12 • exemplu 9 1 7 5 Algoritmi şi programare 8 3 4 2 2008 - 2009 28
max. Heap: eliminarea 12 9 1 7 5 Algoritmi şi programare 8 3 4 2 2008 - 2009 29
max. Heap: inserarea 10 12 9 1 7 5 Algoritmi şi programare 8 3 4 2 2008 - 2009 30
max. Heap: implementarea cu tablouri ( k) 1 k n-1 a[k] a[(k-1)/2] 12 9 8 7 1 3 4 5 x a[i] 2 0 1 2 3 4 5 6 7 8 y 12 0 9 7 5 7 Algoritmi şi programare 8 1 2 a[2*i+1] 1 3 4 z 3 5 a[2*i+2] 2 4 6 8 2008 - 2009 31
max. Heap: 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 Algoritmi şi programare 2008 - 2009 32
max. Heap - 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 Algoritmi şi programare 2008 - 2009 33
max. Heap: 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 =2 k-1 • înălţime arbore = k = log (n+1) • operaţiile înserare/eliminare necesită timpul O(înălţime abore) = O(log n) 0 1 3 Algoritmi şi programare 2 4 2008 - 2009 5 6 34
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 Algoritmi şi programare 2008 - 2009 35
Colectii de multimi disjuncte: “unionfind” • 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 9 5 6 2 1 3 8 0 7 4 parinte 5 Algoritmi şi programare 0 6 1 6 -1 8 -1 -1 9 2 2008 3 - 2009 4 5 6 7 5 -1 8 9 36
Colecţii de mulţimi disjuncte: “unionfind” 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 Algoritmi şi programare 2008 - 2009 37
- Slides: 37