Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
Dorel Lucanu Algoritmica si programare
Curs 3 - Agenda
recursiearbori binariaplicatie: reprezentarea expresiilor ca arboricoada cu prioritati si max-heapcolectii de multimi disjuncte si “union-find”
Dorel Lucanu Algoritmica si programare
Subprograme recursive
subprogramul f() apeleaza directsubprogramul g() daca blocul care definestef() include un apel al lui g()subprogramul f() apeleaza indirectsubprogramul g() daca f() apeleaza direct un subprogram h() si h() apeleaza direct sauindirect g()f() este definit recursiv daca se autoapeleaza direct sau indirect
Dorel Lucanu Algoritmica si programare
Subprograme recursive: Fibonacci
function fibRec(n)if (n <= 1) then return nelse return fibRec(n-1) + fibRec(n-2)
endfibRec(5)
fibRec(4)
fibRec(3)
fibRec(2)
fibRec(0)fibRec(1)
fibRec(1)
fibRec(2)
fibRec(3)
fibRec(2)
fibRec(0)fibRec(1)
fibRec(1)
fibRec(0)fibRec(1)
Dorel Lucanu Algoritmica si programare
Fibonacci – nerecursiv
function fib(n)if (n<=1) return n
// k = 0fk_1 ← 0 // fib[k-1]fk ← 1 // fib[k]for k ← 2 to n dofk_2 ← fk_1fk_1 ← fkfk ← fk_2 + fk_1
return fk;end
Dorel Lucanu Algoritmica si programare
Functii recursive: conversie binara
procedure convert(x)1.if (x != 0)2.then convert(x/2)3. print(x % 2)}
convert(12)
convert(6)
convert(3)
convert(1)
convert(0) ─
11
1
110
1100
12 3
x adr.retur
stiva arborele apelurilor
0 1 33 36 3
Dorel Lucanu Algoritmica si programare
Functii recursive: turnurile din Hanoi
sursa intermediar destinatie
sursa intermediar destinatie
sursa intermediar destinatie
Dorel Lucanu Algoritmica si programare
Functii recursive: turnurile din Hanoi
procedure muta(n, a, b, c)// a = sursa// b = destinatia// c = intermediarif (n = 1) then print(a, “->”, b);else muta(n-1, a, c, b);
print(a, “->”, b);muta(n-1, c, b, a);
end
Dorel Lucanu Algoritmica si programare
Tipul de date abstract ArbBin
obiecte : arbori binari• un arbore binar este o colectie de noduri cu
proprietatile:1.orice nod are 0, 1 sau 2 succesori (fiii, copiii)2.orice nod, exceptand unul singur – radacina, are
un singur nod predecesor (tata, parintele)3.radacina nu are predecesori4.fiii sunt ordonati: fiul stang, fiul drept (daca un
nod are un singur fiu, trebuie mentionat care)5.nodurile fara fii formeaza frontiera arborelui
Dorel Lucanu Algoritmica si programare
Arbori binari: exemplu
C
DMK A
E G
IFL
H
B
Dorel Lucanu Algoritmica si programare
Arbori binari: definitia recursiva:
arborele cu nici un nod (vid) este arborebinardaca v este un nod si t1, t2 sunt arboribinari atunci arborele care are pe v ca radacina, t1 subarbore stang al radacinii sit2 subarbore drept al radacinii, este arborebinar
t2t1
v
Dorel Lucanu Algoritmica si programare
ArbBin: operatii
insereaza()intrare:
un arbore binar t, adresa unui nod cu cel mult un fiu (tatal noului nod), tipulfiului adaugat (stinga, dreapta) siinformatia e din noul nod
iesirearborele la care s-a adaugat un nod cememoreaza e; noul nod nu are fii
Dorel Lucanu Algoritmica si programare
ArbBin: inserare
C
DMK A
E G
IFL
H
BX
Y
Dorel Lucanu Algoritmica si programare
ArbBin: eliminare
elimina()intrare:
un arbore binar t, adresa un nod farafii si adresa nodului-tata
iesirearborele din care s-a eliminat nodul de pe frontiera dat
Dorel Lucanu Algoritmica si programare
ArbBin: eliminare
C
L
DMK A
E G
IF
H
B
Dorel Lucanu Algoritmica si programare
ArbBin :parcurgere preordine
parcurgePreordine()intrare
un arbore binar t, o proceduraviziteaza()
iesirearborele binar t dar cu nodurile procesatecu viziteaza()in ordinea:
radacina (R)subarborele stanga (S)subarborele dreapta (D)
Dorel Lucanu Algoritmica si programare
ArbBin :parcurgere preordine - exemplu
C
L
DMK A
E G
IF
H
B
C, E, K, B, H, A, L, F, G, M, D, I
Dorel Lucanu Algoritmica si programare
ArbBin :parcurgere inordine
parcurgeInordine()intrare
un arbore binar t, o proceduraviziteaza()
iesirearborele binar t dar cu nodurile procesatecu viziteaza()in ordinea S R D
Dorel Lucanu Algoritmica si programare
ArbBin :parcurgere inordine - exemplu
C
L
DMK A
E G
IF
H
B
K, H, B, E, L, A, F, C, M, G, I, D
Dorel Lucanu Algoritmica si programare
ArbBin: parcurgere postordine
parcurgePostordine()intrare
un arbore binar t, o proceduraviziteaza()
iesirearborele binar t dar cu nodurile procesatecu viziteaza()in ordinea S D R
Dorel Lucanu Algoritmica si programare
ArbBin: parcurgere BFS
parcurgeBFS()intrare
un arbore binar t, o proceduraviziteaza()
iesirearborele binar t dar cu nodurile procesatecu viziteaza()in ordinea BFS (penivele)
Dorel Lucanu Algoritmica si programare
ArbBin: parcurgere BFS - exemplu
C
L
DMK A
E G
IF
H
B
C, E, G, K, A, M, D, B, L, F, I, H
Dorel Lucanu Algoritmica si programare
ArbBin : implementare cu structuri inlantuite
reprezentarea obiectelor
C
E G
B
H
K A
L F
M D
I
Dorel Lucanu Algoritmica si programare
ArbBin : structura unui nod
un nod v este o structura cu trei campuri:v->inf /* informatia memorata in nod */v->stg /* adresa fiului stanga */v->drp /* adresa fiului dreapta */
Dorel Lucanu Algoritmica si programare
Arbori binari: parcurgePreordine()
procedure parcurgePreordine(v)if (v = NULL) then returnelse viziteaza(v)
parcurgePreordine(v->stg) parcurgePreordine(v->drp)
end
Dorel Lucanu Algoritmica si programare
Arbori binari: implementarea parcurgerii BFS
C
DMK A
E G
Coada = C( E G K A M D )
Dorel Lucanu Algoritmica si programare
Arbori binari: implementarea parcurgerii BFS
procedure parcurgeBFS(t)begin
if (t = NULL) then returnelse C ← (t)
while (not esteVida(C))citeste(C, v)viziteaza(v)elimina(C)if (v→stg ≠ NULL)then insereaza(C, v->stg)if (v→drp ≠ NULL)then insereaza(C, v->drp)
end
Dorel Lucanu Algoritmica si programare
Aplicatie: expresii intregi
Expresii intregidefinitieexemple
Reprezentarea expresiilor ca arborisimilaritati intre cele doua definitiiarborele asociat unei expresiinotatiile pref-, in- si postfixate si parcurgeri
ale arborilor
Dorel Lucanu Algoritmica si programare
Definitia expresiilor intregi
<int> ::= ... –2 | -1 | 0 | 1 | 2 ... <expr_int> ::= <int>
| <exp_int> <op_bin> <exp_int>| (<exp_int>)
<op_bin> ::= + | − | * | / | %
reguli de precedenta12-5*2 este (12-5)*2 sau 12-(5*2)reguli de asociere15/4/2 este (15/4)/2 sau 15/(4/2)?15/4*2 este (15/4)*2 sau 15/(4*2)?
Dorel Lucanu Algoritmica si programare
Expresiile reprezentate ca arbori
-12 + 17 * 5 – (43 + 34 / 21 * 66)
−
+ +
* *
/
-12
17 5
34 21
66
43
Dorel Lucanu Algoritmica si programare
Notatiile postfixate si prefixate
notatia postfixata se obtine prin parcurgepostordine-12 17 5 * + 43 34 21 / 66 * + -notatia prefixata se obtine prin parcurgepreordine- + -12 * 17 5 + 43 * / 34 21 66
−
+ +
* *
/-12
17 5
34 21
66
43
Dorel Lucanu Algoritmica si programare
Coada cu prioritati: tip de data abstract
obiecte de tip data: structuri de date in care elementele sunt numite atomi; orice atom un camp-cheie numit prioritate
Dorel Lucanu Algoritmica si programare
Coada cu prioritati:operatii
citesteintrare: o coada cu prioritati Ciesire: atomul din C cu cheia cea mai mare
eliminaintrare: o coada cu prioritati Ciesire: C din care s-a eliminat atomul cu cheia cea mai mare
insereazaintrare: o coada cu prioritati C si un atom at iesire: C la care s-a adaugat at
Dorel Lucanu Algoritmica si programare
maxHeap
arbori binari completi cu proprietatea: pentruorice nod, cheia din acel nod este mare decitsau egala cu cheile din nodurile fiiexemplu
12
437 1
9 8
5 2
Dorel Lucanu Algoritmica si programare
maxHeap: eliminarea
12
437 1
9 8
5 2
Dorel Lucanu Algoritmica si programare
maxHeap: inserarea
12
437 1
9 8
5 2
10
Dorel Lucanu Algoritmica si programare
maxHeap:implementarea cu tablouri
(∀k) 1 ≤ k ≤ n-1 ⇒ a[k] ≤ a[(k-1)/2]
876543210
12
437 1
9 8
5 2
0
21
3
7 8
4 5 6
12 9 8 7 1 3 4 5 2
Dorel Lucanu Algoritmica si programare
maxHeap: inserare
procedure insereaza(a, n, cheie)begin
n ← n+1a[n-1] ← cheiej ← n-1heap ← falsewhile ((j > 0) and not heap) do
k ← [(j-1)/2]if (a[j] > a[k])then swap(a[j], a[k])
j ← kelse heap ← true
end
Dorel Lucanu Algoritmica si programare
maxHeap - elimina
procedure elimina(a, n)begin
a[0] ← a[n-1]n ← n-1j ← 0heap ← falsewhile ((2*j+1 < n) and not heap) do
k ← 2*j+1if ((k < n-1) and (a[k] < a[k+1]))then k ← k+1if (a[j] < a[k])then swap(a[j], a[k])
j ← kelse heap ← true
end
Dorel Lucanu Algoritmica si programare
maxHeap: timp de executie
inaltime (adancime) arbore = lungimea celuimai lung drum de la radacina la frontieralungime drum = numar arcen =2k+1-1inaltime arbore = k = log (n+1)-1operatiile inserare/eliminare necesita timpulO(inaltime abore) = O(log n)
0
21
3 4 5 6
Dorel Lucanu Algoritmica si programare
Colectii de multimi disjuncte: tip de data abstract
obiecte: colectii de submultimi disjuncte (partitii) ale unei multimi universoperatii:
find()intrare: o colectie C, un element x din universiesire: submultimea din C la care apartine x
union()intrare: o colectie C, doua elemente x si y din universiesire: C in care componentele lui x si resp. y sint reunite
single()intrare: o colectie C, un element x din universiesire: C la care componenta lui x are pe x ca unic element
Dorel Lucanu Algoritmica si programare
Colectii de multimi disjuncte: “union-find”
structura “union-find”multimea univers = {0,1, ..., n-1}submultime = arborecolectie = padurereprezentarea unei paduri prin legaturaparinte
2
6
1 3 0
5
8
4
7
9
9876543210
-159-1-18-1665parinte
Dorel Lucanu Algoritmica si programare
Colectii de multimi disjuncte: “union-find”
function find(C, i)begin
temp ← iwhile (parinte[temp] >= 0) do
temp ← parinte[temp]return temp
endprocedure union(C, i, j)begin
ri ← find(i)rj ← find(j)if (ri ≠ rj)then parinte[rj] ← ri
end