42
Dorel Lucanu Algoritmica si programare Curs 3 - Agenda recursie arbori binari aplicatie: reprezentarea expresiilor ca arbori coada cu prioritati si max-heap colectii de multimi disjuncte si “union-find”

Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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”

Page 2: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 3: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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)

Page 4: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 5: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 6: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

Functii recursive: turnurile din Hanoi

sursa intermediar destinatie

sursa intermediar destinatie

sursa intermediar destinatie

Page 7: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 8: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 9: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

Arbori binari: exemplu

C

DMK A

E G

IFL

H

B

Page 10: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 11: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 12: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

ArbBin: inserare

C

DMK A

E G

IFL

H

BX

Y

Page 13: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 14: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

ArbBin: eliminare

C

L

DMK A

E G

IF

H

B

Page 15: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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)

Page 16: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 17: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 18: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 19: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 20: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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)

Page 21: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 22: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

ArbBin : implementare cu structuri inlantuite

reprezentarea obiectelor

C

E G

B

H

K A

L F

M D

I

Page 23: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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 */

Page 24: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 25: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

Arbori binari: implementarea parcurgerii BFS

C

DMK A

E G

Coada = C( E G K A M D )

Page 26: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 27: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 28: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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)?

Page 29: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

Expresiile reprezentate ca arbori

-12 + 17 * 5 – (43 + 34 / 21 * 66)

+ +

* *

/

-12

17 5

34 21

66

43

Page 30: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 31: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 32: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 33: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 34: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

maxHeap: eliminarea

12

437 1

9 8

5 2

Page 35: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

Dorel Lucanu Algoritmica si programare

maxHeap: inserarea

12

437 1

9 8

5 2

10

Page 36: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 37: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 38: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 39: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 40: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 41: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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

Page 42: Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina intrare: o coada cu prioritati C iesire: C din care s-a eliminat atomul cu cheiaceamaimare

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