Sunteți pe pagina 1din 153

Se consider vectorul w = (w1,..., wn).

S se determine un subvector al lui w care nu conine


elemente consecutive n w i are suma elementelor
maxim

Exemplu
Pentru
w = (1, 4, 7, 5)
soluia este
(4, 5)

Problem echivalent

Se consider un graf de tip lan cu V = {v1,..., vn}.

Vrfurile grafului au asociate ponderile w1,..., respectiv wn.


S se determine o mulime independent de vrfuri de
pondere maxim

ponderea unei mulimi de vrfuri = suma ponderilor vrfurilor

Aplicaii probleme de alocare de resurse cu evitarea


interferenei (indicat prin muchii -> graf de conflicte)
Ponderea asociat vrfurilor poate reprezenta cantitatea de
date pe care staia trebuie s o transmit
Problem transmiterea cantitii maxime de date fr
interferene

Nu se cunosc algoritmi polinomiali n cazul general


(NP-completitudine)

Maximum Weighted Independent Set

Abordare cu metoda Greedy

La un pas este adugat n soluie vrful de pondere


maxim neadiacent cu cele deja selectate
Soluia: {v3, v1} cu ponderile {7, 1} nu este optim

Abordare cu metoda Divide et Impera

Incorect reuniunea soluiilor subproblemelor nu este o


soluie posibil (corect) pentru problema iniial

Cutarea exhaustiv a soluiei optime

Generarea tuturor soluiilor posibile i determinarea celei


optime algoritm exponenial

Problema nu se poate rezolva folosind metode


deja studiate

Analizm structura unei soluii optime, evideniind


un element (primul/ultimul) al acesteia, pentru a
determina subprobleme utile i relaii de recuren

Fie S V = {v1,..., vn} o soluie optim


Dac vn S S-{vn} este soluie optim pentru
G-{vn, vn-1}
Dac vn S S este soluie optim pentru
G-{vn}

Fie S V = {v1,..., vn} o soluie optim


Dac vn S S-{vn} este soluie optim pentru
G-{vn, vn-1}
Dac vn S S este soluie optim pentru
G-{vn}

Fie S V = {v1,..., vn} o soluie optim


Dac vn S S-{vn} este soluie optim pentru
G-{vn, vn-1}
Dac vn S S este soluie optim pentru
G-{vn}

Dac am tii deja soluiile pentru grafurile G-{vn, vn-1} i


G-{vn} , am putea determina S alegnd dintre cele dou
situaii cazul n care se obine soluia optim

Recuren:
Notm S(i) = ponderea maxim a unei mulimi
independete n graful indus de vrfurile {v1,..., vi}

S(n) = max{ S(n-2)+wn, S(n-1)}


S(1) = w1, S(0) = 0

S(n)
S(n-1)
S(n-2)

S(n-3)

S(n-2)
S(n-3)

S(n-3)

S(n-4)

S(n-4)
Subproblemele se repet algoritm exponenial

S(n)
S(n-1)
S(n-2)

S(n-3)

S(n-2)
S(n-3)

S(n-3)

S(n-4)

S(n-4)
Putem evita rezolvarea unei subprobleme de mai
multe ori?

Recuren:
S(n)= max{ S(n-2)+wn, S(n-1)}
Memorm ntr-un vector rezultatele subproblemelor
deja rezolvate (memoizare) o subproblem va fi
rezolvat o singur dat algoritm O(n)

S(4)
S(3)

S(2)

S(0)

S(1)

Mai eficient implementare iterativ a recurenei


(bottom-up)

int Sol(int n){


if(n==0) return 0;

if(n==1) return w[1];


if (s[n]==0) //nerezolvata
s[n]= Math.max(Sol(n-2)+w[n],Sol(n-1));
return s[n];
}]; poz = i;}

for(int i=0;i<=n;i++)
s[i]=0;
System.out.println(Sol(n));

int SolNerec(int n){


s[0] = 0;
s[1] = w[1];
for(int i=2;i<=n;i++)
s[i]= Math.max(s[i-2]+w[i],s[i-1]);
return s[n];
}

Cum putem determina i o submulime optim, nu


doar ponderea?

Cum putem determina i o submulime optim, nu


doar ponderea?

Din relaia de recuren putem deduce ce vrfuri au


fost selectate n soluie
s[n]= max{ s[n-2]+w[n], s[n-1]}
Dac s[n] = s[n-2]+w[n] , vrful n se adaug n
soluie i problema se reduce la primele n-2 vrfuri
Dac s[n] = s[n-1] , nu se adaug nici un vrf la
soluie i problema se reduce la primele n-1 vrfuri

Cum putem determina i o submulime optim, nu


doar ponderea?

Din relaia de recuren putem deduce ce vrfuri au


fost selectate n soluie
s[n]= max{ s[n-2]+w[n], s[n-1]}
Dac s[n] = s[n-2]+w[n] , vrful n se adaug n
soluie i problema se reduce la primele n-2 vrfuri
Dac s[n] = s[n-1] , nu se adaug nici un vrf la
soluie i problema se reduce la primele n-1 vrfuri

static void SolNerecCuAfis(int n){


int i;
s[0]=0; s[1]=w[1];
for(i=2;i<=n;i++)

s[i]= Math.max(s[i-2]+w[i],s[i-1]);

System.out.print("ponderea maxima "+ s[n]);


System.out.println(" pentru varfurile: ");
i=n;
while(i>1){
if(s[i]==s[i-2]+w[i]){
System.out.println(i+" de pondere "+w[i]);
i=i-2;
}
else
i=i-1;

}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}

static void SolNerecCuAfis(int n){


int i;
s[0]=0; s[1]=w[1];
for(i=2;i<=n;i++)

s[i]= Math.max(s[i-2]+w[i],s[i-1]);

System.out.print("ponderea maxima "+ s[n]);


System.out.println(" pentru varfurile: ");
i=n;
while(i>1){
if(s[i]==s[i-2]+w[i]){
System.out.println(i+" de pondere "+w[i]);
i=i-2;
}
else
i=i-1;

}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}

static void SolNerecCuAfis(int n){


int i;
s[0]=0; s[1]=w[1];
for(i=2;i<=n;i++)

s[i]= Math.max(s[i-2]+w[i],s[i-1]);

System.out.print("ponderea maxima "+ s[n]);


System.out.println(" pentru varfurile: ");
i=n;
while(i>1){
if(s[i]==s[i-2]+w[i]){
System.out.println(i+" de pondere "+w[i]);
i=i-2;
}
else
i=i-1;

}
if(i==1)
System.out.println(i+" de pondere "+w[i]);
}

Greedy nu furnizeaz mereu soluia optim

Alte exemple:
Problema rucsacului, cazul discret
Problema monedelor, cazul general

Divide et Impera ineficient dac subproblemele se


repet

Exemplu - Calculm numrul Fibonacci F(n)


F(n) = F(n-1)+F(n-2)
F(0) = F(1) = 1
F(4)

F(4)

F(3)
F(1) F(1)

F(2)

F(1)

F(2)

F(0)

F(0)

Exemplu Calculm numrul Fibonacci F(n)


F(n) = F(n-1)+F(n-2)
F(0) = F(1) = 1
F(4)

F(4)

F(3)
F(1) F(1)

F(2)

F(1)

F(2)

F(0)

F(0)

Soluii
reducere la subprobleme utile + relaii de recuren
rezolvarea eficient a subproblemelor
recursiv cu memoizare (salvarea rezultatelor subproblemelor
deja rezolvate)
algoritmi iterativi buttom-up

Metoda programrii dinamice

Probleme care presupun rezolvarea de relaii de


recuren
De obicei aceste relaii se obin din respectarea unui
principiu de optimalitate (subprobleme optime)

Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )


Fiecrui xA urmeaz s i se asocieze o valoare v(x)B.
xA
v(x)B

Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )


Fiecrui xA urmeaz s i se asocieze o valoare v(x)B.
xA
v(x)B
v este cunoscut doar pe submulimea XA

Fie A i B dou mulimi oarecare (B = N, Z, R, {0,1} )


Fiecrui xA urmeaz s i se asocieze o valoare v(x)B.
xA
v(x)B
v este cunoscut doar pe submulimea XA
Pentru fiecare xA\X avem relaia
v(x) = fx(v(a1),...,v(ak))
unde
Ax = {a1,...,ak}
este mulimea elementelor din A de a cror valoare
depinde v(x)

Dat zA, se cere s se calculeze, dac este posibil,


valoarea v(z) - eficient

Putem reprezenta problema pe un graf de dependene.

Vrfurile corespund elementelor din A, iar descendenii


unui vrf x sunt vrfurile din Ax.
x

valoarea lui x depide


ai

direct de v(ai)

Problema are soluie numai dac n graful de dependene nu


exist circuite accesibile din z

Calcul numr Fibonacci Fn


F(n) = F(n-1)+F(n-2)
F(0) = F(1) = 1

Calcul numr Fibonacci Fn


F(n) = F(n-1)+F(n-2)
F(0) = F(1) = 1
X ={0, 1}
4
3
2
tim iniial

Alt exemplu
A = {1,2,...,5,6};
v(1) = v(2) = 1
v(3) = v(1) + v(2) + v(4)
v(4) = v(1) + v(2)
v(5) = v(2) + v(3)
v(6) = v(1) + v(3) + v(4)
v(6) = ?

Alt exemplu
A = {1,2,...,5,6};
v(1) = v(2) = 1
X = {1, 2}
v(3) = v(1) + v(2) + v(4)
v(4) = v(1) + v(2)
v(5) = v(2) + v(3)
v(6) = v(1) + v(3) + v(4)

3
4

v(6) = ?

3
4

v(6) = ?

5 nu intervine n calculul

lui v(6)

Fie Gz graful indus de mulimea vrfurilor y de a cror


valoare depinde v(z) = pentru care exist un drum de la y la
z = vrfuri observabile din z
Gz

graful vrfurilor observabile din z

Problema presupune o parcurgere a grafului Gz

v(6) = ?

graful vrfurilor observabile din 6

Ar fi bine dac

am cunoate de la nceput Gz
forma acestui graf ar permite o parcurgere mai simpl,
care s conduc la calcularea valorii v(z).

ncercare de rezolvare cu metoda Divide et Impera.


procedure DivImp(x)
for yAx\X

{y de care x depinde direct}

DivImp(y)
calculeaz v(x) conform funciei fx
end;

ncercare de rezolvare cu metoda Divide et Impera.


procedure DivImp(x)
for yAx\X

{y de care x depinde direct}

DivImp(y)
calculeaz v(x) conform funciei fx
end;
algoritmul nu se termin pentru grafuri ciclice

valoarea unui vrf poate fi calculat de mai multe ori

Soluie - sortarea topologic pentru Gz


ordinea
n care se calculeaz valorile v ale vrfurilor
Ar fi mai bine dac forma grafului ar permite o
parcurgere mai simpl.

Metoda programrii dinamice const n urmtoarele:

Se asociaz problemei un graf de dependene

Metoda programrii dinamice const n urmtoarele:

Se asociaz problemei un graf de dependene

Metoda programrii dinamice const n urmtoarele:

Se asociaz problemei un graf de dependene


n graf este pus n eviden un graf de vrfuri observabile
din z, numit PD-arbore de rdcin z, cu proprietile

Metoda programrii dinamice const n urmtoarele:

Se asociaz problemei un graf de dependene


n graf este pus n eviden un graf de vrfuri observabile
din z, numit PD-arbore de rdcin z, cu proprietile
nu conine circuite

Metoda programrii dinamice const n urmtoarele:

Se asociaz problemei un graf de dependene


n graf este pus n eviden un graf de vrfuri observabile
din z, numit PD-arbore de rdcin z, cu proprietile
nu conine circuite
mulimea vrfurilor cu gradul intern 0 (ale cror valori
nu depind de o alt valoare) este inclus n X

Metoda programrii dinamice const n urmtoarele:

Se asociaz problemei un graf de dependene


n graf este pus n eviden un graf de vrfuri observabile
din z, numit PD-arbore de rdcin z, cu proprietile
nu conine circuite
mulimea vrfurilor cu gradul intern 0 (ale cror valori
nu depind de o alt valoare) este inclus n X

se poate aeza pe niveluri (nivelul lui y = lungimea


maxim a unui drum de la y la z)

Metoda programrii dinamice const n urmtoarele :

Se asociaz problemei un graf de dependene


n graf este pus n eviden un graf de vrfuri observabile
din z, numit PD-arbore de rdcin z
Se parcurge n postordine PD-arborele

procedure postord(x)
for jAx
if viz[j]=false {diferena fa de DI}
postord(j)
calculeaz v(x) conform funciei fx;
viz[x]true
end
Apel postord(z)

v(6) = ?

3
4

Prin parcurgerea n postordine, vrfurile vor fi


sortate topologic

Generalizeaz metoda Divide et Impera - dependenele


nu au forma unui arbore, ci a unui PD-arbore.

Generalizeaz metoda Divide et Impera - dependenele


nu au forma unui arbore, ci a unui PD-arbore.

Este util s cutm n PD-arbore regulariti care s


evite memorarea valorilor tuturor vrfurilor i/sau s
simplifice parcurgerea n postordine.

A = {0,...,n},

B = N

X = {0,1} (tim F0=0; F1=1)

v(k) = Fk , deci
v(k) = v(k-1)+ v(k-2)

A = {0,...,n},

B = N

X = {0,1} (tim F0=0; F1=1)

v(k) = Fk , deci
v(k) = v(k-1)+ v(k-2)
Ak = {k-1,k-2}, k2

fk(a,b) = a + b, k2

A = {1,...,n},

v(k) = (Fk-1, Fk)

v(1) = (0, 1)

B = N N

A = {1,...,n},

v(k) = (Fk-1, Fk)

v(1) = (0, 1)

B = N N

Ak = {k-1}, k2
fk(a,b) = (b, a+b) k2

v(k) = fk(v(k-1))

A = {1,...,n},

v(k) = (Fk-1, Fk)

v(1) = (0, 1)

B = N N

Ak = {k-1}, k2
fk(a,b) = (b, a+b) k2

v(k) = fk(v(k-1))

a0; b1
for i=2,n
(a,b)(b,a+b)
write(b)

Se poate utiliza n problemele de optim care verific


un principiu de optimalitate, din care se obin relaiile
de calcul

Fie secvena de stri S0 (starea iniial), S1, , Sn (starea


final) ale sistemului.

Fie soluia optim d1, ..., dn


Principiul de optimalitate poate fi satisfcut sub una
din urmtoarele forme:
optim

d1

dn

optim

ir optim
ambele subsecvene
sunt optime

Fie soluia optim d1, ..., dn


Principiul de optimalitate poate fi satisfcut sub una
din urmtoarele forme:

(1) d1 , d 2 ,...., d n optim d k ,...., d n optim pentru subproblema


corespunzatoare, 1 k n
(2) d1 , d 2 ,...., d n optim d1 ,...., d k optim, 1 k n

(3) d1 , d 2 ,...., d n optim d1 ,...., d k optim, 1 k n


si
d k , ...., d n optim, 1 k n

Stabilirea subproblemelor utile (de exemplu din


principiul de optimalitate)

Care subprobleme le putem rezolva direct

Relaiile de recuren

Ordinea de parcurgere a grafului de dependene


(ordinea de calcul)

Se consider vectorul a = (a1,..., an).


S se determine lungimea maxim a unui subir
cresctor din a i un astfel de subir de lungime
maxim

Exemplu
Pentru
a = (8, 1, 7, 4, 6, 5, 11)

lungimea maxim este 4, un subir fiind


1,

4, 6,

11

Longest Increasing Subsequence


nrudit cu problema determinrii celui mai lung subir
comun a dou iruri (Longest Common Subsequence)
Aplicaii
cautarea de tiparuri (patterns):
baze de date mari
bioinformatica

similitudini n genetic (ADN)


sequence alignment

Lavanya, B., Murugan, A.: Discovery of longest increasing


subsequences and its variants using DNA operations.
International Journal of Engineering and Technology 5(2),
11691177 (2013)

Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subir optim care ncepe pe poziia i1, atunci:
ai2, , aip
este un subir optim care ncepe pe poziia i2;
Mai general

aik, , aip
este un subir optim care ncepe pe poziia ik.

Principiu de optimalitate

Subprobleme:
Calculm pentru fiecare poziie i lungimea maxim a
unui subir cresctor ce ncepe pe poziia i (cu elementul

ai)

Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i

Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i

Soluie problem:
nr = max{lung[i]i = 1,2,,n}

Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i

Soluie problem:
nr = max{lung[i]i = 1,2,,n}

Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i

tim direct

Relaie de recuren

Ordinea de parcurgere a grafului de dependene


(ordinea de calcul)

Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i

tim direct

lung[n] = 1

Relaie de recuren
lung[i] = 1 + max{lung[j]j>i , ai<aj}
Ordinea de parcurgere a grafului de dependene
(ordinea de calcul)

i = n, n-1, , 1

Subproblem:
lung[i] = lungimea maxim a unui subir
cresctor ce ncepe pe poziia i

tim direct

lung[n] = 1

Relaie de recuren
lung[i] = 1 + max{lung[j]j>i, ai<aj}
Ordinea de parcurgere a grafului de dependene
(ordinea de calcul)

i = n, n-1, , 1

Graful de dependene

i =1n, n-1, , 1
2

Graful de dependene
1
2

Ordinea de parcurgere a grafului de dependene


(ordinea de calcul)
i = n, n-1, , 1 n, n-1, , 1

Cum determinm un subir maxim?

Pentru a determina i un subir optim putem memora


n plus
succ[i] = indicele urmtorului element
dintr-un subir optim care ncepe
pe poziia i (n+1 dac nu exist)
= indicele pentru care se realizeaz
maximul n relaia de recuren

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

a:

5 11

lung : 2

succ : 7

Soluie: lung = 4

a:

5 11

lung : 2

succ : 7

Subir: 1,

a:

5 11

lung : 2

succ : 7

Subir: 1,

a:

5 11

lung : 2

succ : 7

Subir: 1, 4,

a:

5 11

lung : 2

succ : 7

Subir: 1, 4, 6

a:

5 11

lung : 2

succ : 7

Subir: 1, 4, 6, 11

nr = 1;

poz = n; //poz de inceput a sirului maxim


lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calcul

succ[i]= n+1; lung[i]=1;


//formula de recurenta
for(int j=i+1;j<=n; j++){

if((a[i]<a[j]) && (1+lung[j]>lung[i])){


lung[i]= 1 + lung[j];
succ[i] = j;
}
}
if(lung[i]> nr){nr = lung[i]; poz = i;}
}

nr = 1;

poz = n; //poz de inceput a sirului maxim


lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calcul

succ[i]= n+1; lung[i]=1;


//formula de recurenta
for(int j=i+1;j<=n; j++){

if((a[i]<a[j]) && (1+lung[j]>lung[i])){


lung[i]= 1 + lung[j];
succ[i] = j;
}
}
if(lung[i]> nr){nr = lung[i]; poz = i;}
}

nr = 1;

poz = n; //poz de inceput a sirului maxim


lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calcul

succ[i]= n+1; lung[i]=1;


//formula de recurenta
for(int j=i+1;j<=n; j++){

if((a[i]<a[j]) && (1+lung[j]>lung[i])){


lung[i]= 1 + lung[j];
succ[i] = j;
}
}
if(lung[i]> nr){nr = lung[i]; poz = i;}
}

nr = 1;

poz = n; //poz de inceput a sirului maxim


lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calcul

succ[i]= n+1; lung[i]=1;


//formula de recurenta
for(int j=i+1;j<=n; j++){

if((a[i]<a[j]) && (1+lung[j]>lung[i])){


lung[i]= 1 + lung[j];
succ[i] = j;
}
}
if(lung[i]> nr){nr = lung[i]; poz = i;}
}

nr = 1;

poz = n; //poz de inceput a sirului maxim


lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calcul

succ[i]= n+1; lung[i]=1;


//formula de recurenta
for(int j=i+1;j<=n; j++){

if((a[i]<a[j]) && (1+lung[j]>lung[i])){


lung[i]= 1 + lung[j];
succ[i] = j;
}
}
if(lung[i]> nr){nr = lung[i]; poz = i;}
}

nr = 1;

poz = n; //poz de inceput a sirului maxim


lung[n] = 1; succ[n] = n+1; //stim
for (int i=n-1;i>=1;i--){//ordine de calcul

succ[i]= n+1; lung[i]=1;


//formula de recurenta
for(int j=i+1;j<=n; j++){

if((a[i]<a[j]) && (1+lung[j]>lung[i])){


lung[i]= 1 + lung[j];
succ[i] = j;
}
}
if(lung[i]> nr){nr = lung[i]; poz = i;}
}

//afisare subsir
for (int i=1;i<=nr;i++){
System.out.print(a[poz]+" ");
poz = succ[poz];
}

//afisare subsir
for (int i=1;i<=nr;i++){
System.out.print(a[poz]+" ");
poz = succ[poz];
}

Complexitate - O(n2)

//afisare subsir
for (int i=1;i<=nr;i++){
System.out.print(a[poz]+" ");
poz = succ[poz];
}

Complexitate - O(n2)

Tem O(n log n)

Alt soluie

Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subir optim care se termin pe poziia ip,
atunci
ai1, , aik
este un subir optim care se termin pe poziia ik.
Subproblem:
Calculm pentru fiecare poziie i lungimea maxim a
subirului cresctor ce se termin pe poziia i

Alt soluie

Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subir optim care se termin pe poziia ip,
atunci
ai1, , aik
este un subir optim care se termin pe poziia ik.
Subproblem:
Calculm pentru fiecare poziie i lungimea maxim a
subirului cresctor ce se termin pe poziia i

Alt soluie

Principiu de optimalitate:
Dac
ai1, ai2, , aip,
este un subir optim care se termin pe poziia ip,
atunci
ai1, , aik
este un subir optim care se termin pe poziia ik.
Subproblem:
Calculm pentru fiecare poziie i lungimea maxim a
unui subir cresctor ce se termin pe poziia i

a:

5 11

lung : 2

pred : 7

a:

8
1

lung : 12
pred : 07

1
2

7
4
4

4
2
7

6
3
5

5 11
2
7

2
7

a:

8
1

lung : 1

1
2

14

pred : 07 0 4

4
2
7

6
3
5

5 11
2
7

2
7

a:

8
1

lung : 1

1
2

7
3

142 2

pred : 07 0

2 7

6
3

5 11
2

a:

8
1

lung : 1

1
2

7
3

4
4

1 4 2 22 3

pred : 07 0

6
5

2 5

5 11
2

a:

8
1

lung : 1

1
2

7
3

4
4

6
5

5 11
6

1 4 2 22 3 3 2 2

pred : 07 0

a:

8
1

lung : 1

1
2

7
3

4
4

6
5

5 11
6

1 4 2 22 3 3 2 32

pred : 07 0

a:

8
1

lung : 1

1
2

7
3

4
4

6
5

5 11
6

1 4 2 22 3 3 2 3

pred : 07 0

4
6

Algoritm O(n log n)- Indicaii

1. Folosind tot programare dinamic


Pentru fiecare lungime j=1..,n reinem
m[j] = poziia celui mai mic element din ir cu
proprietatea c exist un subir de lungime j care se
termin cu el

a[m[1]] a[m[2]] a[m[n]]

La pasul i cutm binar cea mai mare lungime j cu


a[m[j]] a[i]

Patience solitaire / patience sort

prima
carte

https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/
LongestIncreasingSubsequence.pdf

Numr minim de teancuri

Patience solitaire / patience sort

prima
carte

Numr minim de teancuri

https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/
LongestIncreasingSubsequence.pdf

Patience solitaire
Algoritm: Greedy cartea curent este adugat la cel mai
din stnga teanc pe care se potrivete
- La fiecare pas, crile din topul fiecrui teanc formeaz un ir
cresctor
- Determinarea celui mai din stnga teanc pe care se potrivete
cartea cu cutare binar

- O(n log n)

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3

10

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3

10

12

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3
2

10

12

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3
2

10
9

12

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3
2

10
9

12

15

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3
2

10
9

12

15
14

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3
2

10
9
7

12

15
14

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3
2

5
4

10
9
7

12

15
14

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3
2

5
4

10
9
7

12
8

15
14

Patience solitaire / patience sort


6, 3, 5, 10, 12, 2, 9, 15, 14, 7, 4,8,13

6
3
2

5
4

10
9
7

12
8

15
14
13

Patience solitaire / patience sort


Evident: numrul minim de subiruri descresctoare n
care se poate descompune un ir
lungimea maxim a unui subir cresctor

Patience solitaire / patience sort


Proprietate: numrul minim de subiruri descresctoare n
care se poate descompune un ir =
lungimea maxim a unui subir cresctor

Patience solitaire / patience sort


Proprietate: numrul minim de subiruri descresctoare n
care se poate descompune un ir =
lungimea maxim a unui subir cresctor
Pentru a memora un subir cresctor, memorm la fiecare pas al
algoritmului Greedy, pentru cartea curent adugat o legtur de tip
predecesor ctre vrful teancului anterior celui n care a fost
adugat

Subirul cresctor se obine pornind de la ultima carte adugat i


urmnd legtura predecesor

Patience solitaire / patience sort

prima
carte

>:D<

https://www.cs.princeton.edu/courses/archive/spring13/cos423/lectures/
LongestIncreasingSubsequence.pdf

Patience sort
-dup distribuirea crilor n teancuri alegem succesiv
cartea cu cea mai mic valoare din vrful unui teanc i o
adugm n ir

obinem irul de cri ordonat cresctor

Marinescu Ghemeci Ruxandra