Curs 3 - Agendadlucanu/cursuri/ap/resurse/...iesire: atomul din C cu cheia cea mai mare elimina...

Preview:

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

Recommended