Curs 3 - Agenda - Profs.info.uaic.ro
Curs 3 - Agenda - Profs.info.uaic.ro
Curs 3 - Agenda - Profs.info.uaic.ro
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<st<strong>ro</strong>ng>Curs</st<strong>ro</strong>ng> 3 - <st<strong>ro</strong>ng>Agenda</st<strong>ro</strong>ng><br />
recursie<br />
arbori binari<br />
aplicatie: reprezentarea expresiilor ca arbori<br />
coada cu prioritati si max-heap<br />
colectii de multimi disjuncte si “union-find”<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Subp<strong>ro</strong>grame recursive<br />
subp<strong>ro</strong>gramul f() apeleaza direct<br />
subp<strong>ro</strong>gramul g() daca blocul care defineste<br />
f() include un apel al lui g()<br />
subp<strong>ro</strong>gramul f() apeleaza indirect<br />
subp<strong>ro</strong>gramul g() daca f() apeleaza direct un<br />
subp<strong>ro</strong>gram h() si h() apeleaza direct sau<br />
indirect g()<br />
f() este definit recursiv daca se<br />
autoapeleaza direct sau indirect<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Subp<strong>ro</strong>grame recursive: Fibonacci<br />
function fibRec(n)<br />
if (n
Fibonacci – nerecursiv<br />
function fib(n)<br />
if (n
Functii recursive: conversie binara<br />
p<strong>ro</strong>cedure convert(x)<br />
1.if (x != 0)<br />
2.then convert(x/2)<br />
3. print(x % 2)<br />
}<br />
convert(12)<br />
convert(6)<br />
convert(3)<br />
1100<br />
110<br />
11<br />
0<br />
1 3<br />
3 3<br />
6 3<br />
12 3<br />
x adr.retur<br />
convert(1)<br />
convert(0)<br />
1<br />
─<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare<br />
stiva<br />
arborele apelurilor
Functii recursive: turnurile din Hanoi<br />
sursa intermediar destinatie<br />
sursa intermediar destinatie<br />
sursa intermediar destinatie<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Functii recursive: turnurile din Hanoi<br />
p<strong>ro</strong>cedure muta(n, a, b, c)<br />
// a = sursa<br />
// b = destinatia<br />
// c = intermediar<br />
if (n = 1)<br />
then print(a, “->”, b);<br />
else muta(n-1, a, c, b);<br />
print(a, “->”, b);<br />
muta(n-1, c, b, a);<br />
end<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Tipul de date abstract ArbBin<br />
‣ obiecte : arbori binari<br />
• un arbore binar este o colectie de noduri cu<br />
p<strong>ro</strong>prietatile:<br />
1.orice nod are 0, 1 sau 2 succesori (fiii, copiii)<br />
2.orice nod, exceptand unul singur – radacina, are<br />
un singur nod predecesor (tata, parintele)<br />
3.radacina nu are predecesori<br />
4.fiii sunt ordonati: fiul stang, fiul drept (daca un<br />
nod are un singur fiu, trebuie mentionat care)<br />
5.nodurile fara fii formeaza f<strong>ro</strong>ntiera arborelui<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Arbori binari: exemplu<br />
C<br />
E<br />
G<br />
K<br />
A<br />
M<br />
D<br />
B<br />
L<br />
F<br />
I<br />
H<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Arbori binari: definitia recursiva:<br />
• arborele cu nici un nod (vid) este arbore<br />
binar<br />
• daca v este un nod si t1, t2 sunt arbori<br />
binari atunci arborele care are pe v ca<br />
radacina, t1 subarbore stang al radacinii si<br />
t2 subarbore drept al radacinii, este arbore<br />
binar<br />
v<br />
t1<br />
t2<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin: operatii<br />
insereaza()<br />
• intrare:<br />
un arbore binar t, adresa unui nod cu<br />
cel mult un fiu (tatal noului nod), tipul<br />
fiului adaugat (stinga, dreapta) si<br />
<st<strong>ro</strong>ng>info</st<strong>ro</strong>ng>rmatia e din noul nod<br />
• iesire<br />
arborele la care s-a adaugat un nod ce<br />
memoreaza e; noul nod nu are fii<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin: inserare<br />
C<br />
E<br />
G<br />
K<br />
A<br />
M<br />
D<br />
X<br />
B<br />
L<br />
F<br />
I<br />
H<br />
Y<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin: eliminare<br />
elimina()<br />
• intrare:<br />
un arbore binar t, adresa un nod fara<br />
fii si adresa nodului-tata<br />
• iesire<br />
arborele din care s-a eliminat nodul de<br />
pe f<strong>ro</strong>ntiera dat<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin: eliminare<br />
C<br />
E<br />
G<br />
K<br />
A<br />
M<br />
D<br />
B<br />
L<br />
F<br />
I<br />
H<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin :parcurgere preordine<br />
parcurgePreordine()<br />
• intrare<br />
un arbore binar t, o p<strong>ro</strong>cedura<br />
viziteaza()<br />
• iesire<br />
arborele binar t dar cu nodurile p<strong>ro</strong>cesate<br />
cu viziteaza()in ordinea:<br />
• radacina (R)<br />
• subarborele stanga (S)<br />
• subarborele dreapta (D)<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin :parcurgere preordine - exemplu<br />
C<br />
E<br />
G<br />
K<br />
A<br />
M D<br />
B<br />
L<br />
F<br />
I<br />
H<br />
C, E, K, B, H, A, L, F, G, M, D, I<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin :parcurgere inordine<br />
parcurgeInordine()<br />
• intrare<br />
un arbore binar t, o p<strong>ro</strong>cedura<br />
viziteaza()<br />
• iesire<br />
arborele binar t dar cu nodurile p<strong>ro</strong>cesate<br />
cu viziteaza()in ordinea S R D<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin :parcurgere inordine - exemplu<br />
C<br />
E<br />
G<br />
K<br />
A<br />
M D<br />
B<br />
L<br />
F<br />
I<br />
H<br />
K, H, B, E, L, A, F, C, M, G, I, D<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin: parcurgere postordine<br />
parcurgePostordine()<br />
• intrare<br />
un arbore binar t, o p<strong>ro</strong>cedura<br />
viziteaza()<br />
• iesire<br />
arborele binar t dar cu nodurile p<strong>ro</strong>cesate<br />
cu viziteaza()in ordinea S D R<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin: parcurgere BFS<br />
parcurgeBFS()<br />
• intrare<br />
un arbore binar t, o p<strong>ro</strong>cedura<br />
viziteaza()<br />
• iesire<br />
arborele binar t dar cu nodurile p<strong>ro</strong>cesate<br />
cu viziteaza()in ordinea BFS (pe<br />
nivele)<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin: parcurgere BFS - exemplu<br />
C<br />
E<br />
G<br />
K<br />
A<br />
M D<br />
B<br />
L<br />
F<br />
I<br />
H<br />
C, E, G, K, A, M, D, B, L, F, I, H<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin : implementare cu structuri inlantuite<br />
reprezentarea obiectelor<br />
C<br />
E<br />
G<br />
K<br />
A<br />
M<br />
D<br />
B<br />
L<br />
F<br />
I<br />
H<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
ArbBin : structura unui nod<br />
un nod v este o structura cu trei campuri:<br />
• v->inf /* <st<strong>ro</strong>ng>info</st<strong>ro</strong>ng>rmatia memorata in nod */<br />
• v->stg /* adresa fiului stanga */<br />
• v->drp /* adresa fiului dreapta */<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Arbori binari: parcurgePreordine()<br />
p<strong>ro</strong>cedure parcurgePreordine(v)<br />
if (v = NULL)<br />
then return<br />
else viziteaza(v)<br />
parcurgePreordine(v->stg)<br />
parcurgePreordine(v->drp)<br />
end<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Arbori binari: implementarea parcurgerii BFS<br />
C<br />
E<br />
G<br />
K<br />
A<br />
M D<br />
Coada =<br />
( C E G K A M D )<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Arbori binari: implementarea parcurgerii BFS<br />
p<strong>ro</strong>cedure parcurgeBFS(t)<br />
begin<br />
if (t = NULL)<br />
then return<br />
else C ← (t)<br />
while (not esteVida(C))<br />
citeste(C, v)<br />
viziteaza(v)<br />
elimina(C)<br />
if (v→stg ≠ NULL)<br />
then insereaza(C, v->stg)<br />
if (v→drp ≠ NULL)<br />
then insereaza(C, v->drp)<br />
end<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Aplicatie: expresii intregi<br />
Expresii intregi<br />
• definitie<br />
• exemple<br />
Reprezentarea expresiilor ca arbori<br />
• similaritati intre cele doua definitii<br />
• arborele asociat unei expresii<br />
• notatiile pref-, in- si postfixate si parcurgeri<br />
ale arborilor<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Definitia expresiilor intregi<br />
::= ... –2 | -1 | 0 | 1 | 2 ...<br />
::= <br />
| <br />
| ()<br />
::= + | − | * | / | %<br />
reguli de precedenta<br />
12-5*2 este (12-5)*2 sau 12-(5*2)<br />
reguli de asociere<br />
15/4/2 este (15/4)/2 sau 15/(4/2)?<br />
15/4*2 este (15/4)*2 sau 15/(4*2)?<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Expresiile reprezentate ca arbori<br />
-12 + 17 * 5 – (43 + 34 / 21 * 66)<br />
−<br />
+ +<br />
-12<br />
* 43 *<br />
17 5<br />
/<br />
66<br />
34 21<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Notatiile postfixate si prefixate<br />
notatia postfixata se obtine prin parcurge<br />
postordine<br />
-12 17 5 * + 43 34 21 / 66 * + -<br />
notatia prefixata se obtine prin parcurge<br />
preordine<br />
- + -12 * 17 5 + 43 * / 34 21 66<br />
−<br />
+ +<br />
-12<br />
* 43<br />
*<br />
17 5 /<br />
34 21<br />
66<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Coada cu prioritati: tip de data abstract<br />
obiecte de tip data: structuri de date in care<br />
elementele sunt numite atomi; orice atom un<br />
camp-cheie numit prioritate<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Coada cu prioritati:operatii<br />
citeste<br />
• intrare: o coada cu prioritati C<br />
• iesire: atomul din C cu cheia cea mai mare<br />
elimina<br />
• intrare: o coada cu prioritati C<br />
• iesire: C din care s-a eliminat atomul cu<br />
cheiaceamaimare<br />
insereaza<br />
• intrare: o coada cu prioritati C si un atom<br />
at<br />
• iesire: C la care s-a adaugat at<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
maxHeap<br />
arbori binari completi cu p<strong>ro</strong>prietatea: pentru<br />
orice nod, cheia din acel nod este mare decit<br />
sau egala cu cheile din nodurile fii<br />
exemplu<br />
12<br />
9 8<br />
7 1<br />
3<br />
4<br />
5 2<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
maxHeap: eliminarea<br />
12<br />
9 8<br />
7 1<br />
3<br />
4<br />
5 2<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
maxHeap: inserarea<br />
12<br />
10<br />
9 8<br />
7 1<br />
3<br />
4<br />
5 2<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
maxHeap:implementarea cu tablouri<br />
(∀k) 1 ≤ k ≤ n-1 ⇒ a[k] ≤ a[(k-1)/2]<br />
12 9 8 7 1 3 4 5 2<br />
0 1 2 3 4 5 6 7 8<br />
12<br />
0<br />
9 8<br />
1<br />
2<br />
7 1<br />
3<br />
3<br />
4<br />
4 5 6<br />
5 2<br />
7 8<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
maxHeap: inserare<br />
p<strong>ro</strong>cedure insereaza(a, n, cheie)<br />
begin<br />
n ← n+1<br />
a[n-1] ← cheie<br />
j ← n-1<br />
heap ← false<br />
while ((j > 0) and not heap) do<br />
k ← [(j-1)/2]<br />
if (a[j] > a[k])<br />
then swap(a[j], a[k])<br />
j ← k<br />
else heap ← true<br />
end<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
maxHeap - elimina<br />
p<strong>ro</strong>cedure elimina(a, n)<br />
begin<br />
a[0] ← a[n-1]<br />
n ← n-1<br />
j ← 0<br />
heap ← false<br />
while ((2*j+1 < n) and not heap) do<br />
k ← 2*j+1<br />
if ((k < n-1) and (a[k] < a[k+1]))<br />
then k ← k+1<br />
if (a[j] < a[k])<br />
then swap(a[j], a[k])<br />
j ← k<br />
else heap ← true<br />
end<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
maxHeap: timp de executie<br />
inaltime (adancime) arbore = lungimea celui<br />
mai lung drum de la radacina la f<strong>ro</strong>ntiera<br />
lungime drum = numar arce<br />
n =2 k+1 -1<br />
inaltime arbore = k = log (n+1)-1<br />
operatiile inserare/eliminare necesita timpul<br />
O(inaltime abore) = O(log n)<br />
0<br />
1<br />
2<br />
3 4 5 6<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Colectii de multimi disjuncte: tip de data abstract<br />
obiecte: colectii de submultimi disjuncte (partitii) ale<br />
unei multimi univers<br />
operatii:<br />
• find()<br />
intrare: o colectie C, un element x din univers<br />
iesire: submultimea din C la care apartine x<br />
• union()<br />
intrare: o colectie C, doua elemente x si y din<br />
univers<br />
iesire: C in care componentele lui x si resp. y<br />
sint reunite<br />
• single()<br />
intrare: o colectie C, un element x din univers<br />
iesire: C la care componenta lui x are pe x ca<br />
unic element<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Colectii de multimi disjuncte: “union-find”<br />
structura “union-find”<br />
• multimea univers = {0,1, ..., n-1}<br />
• submultime = arbore<br />
• colectie = padure<br />
• reprezentarea unei paduri prin legatura<br />
parinte<br />
6<br />
5 9<br />
2<br />
1 3 0<br />
8<br />
7<br />
parinte<br />
5 6 6 -1 8 -1 -1 9 5 -1<br />
0 1 2 3 4 5 6 7 8 9<br />
4<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare
Colectii de multimi disjuncte: “union-find”<br />
function find(C, i)<br />
begin<br />
temp ← i<br />
while (parinte[temp] >= 0) do<br />
temp ← parinte[temp]<br />
return temp<br />
end<br />
p<strong>ro</strong>cedure union(C, i, j)<br />
begin<br />
ri ← find(i)<br />
rj ← find(j)<br />
if (ri ≠ rj)<br />
then parinte[rj] ← ri<br />
end<br />
Dorel Lucanu<br />
Algoritmica si p<strong>ro</strong>gramare