28.10.2014 Views

Curs 3 - Agenda - Profs.info.uaic.ro

Curs 3 - Agenda - Profs.info.uaic.ro

Curs 3 - Agenda - Profs.info.uaic.ro

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!