Sunteți pe pagina 1din 51

PROIECTAREA ALGORITMILOR

AU

Conf. univ. dr. COSTEL BALC


2016

Tematica
1 Elemente de complexitatea algoritmilor si teoria grafurilor
6
1.1 Notatii asimptotice . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2 Parcurgerea grafurilor. Aplicatii . . . . . . . . . . . . . . . . . 11
2 Metoda Greedy
2.1 Descrierea metodei. Algoritmi generali . . . .
2.2 Aplicatii ale Inegalitatii rearanjamentelor . . .
2.2.1 Inegalitatea rearanjamentelor . . . . .
2.2.2 Produs scalar maxim/minim . . . . . .
2.2.3 Memorarea optima a textelor pe benzi
2.3 Problema rucsacului, varianta continua . . . .
2.4 Problema planificarii spectacolelor . . . . . . .

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.

21
21
24
24
26
30
32
39

3 Metoda Backtracking

46

4 Metoda Divide et Impera

47

5 Metoda program
arii dinamice

48

6 Metoda Branch and Bound

49

7 Algoritmi euristici

50

Evaluare
Prezenta: 10%
Activitate laborator: 30% (Programe si probleme din Temele de laborator)
Teme de casa: 10% (Programe si probleme suplimentare)
Examen final: 50% (Proba scrisa: teorie, algoritmi -cu implementaresi probleme)

Bibliografie
[1] A.V. Aho, J.E. Hopcroft, J.D. Ullman, Data Structures and Algorithms, AddisonWesley, Massachusetts, 2009.
[2] Gh. Barbu, V. P
aun, Programarea n limbajul C/C++, Editura Matrix Rom, Bucuresti, 2011.
[3] Gh. Barbu, V. P
aun, Calculatoare personale si programare n C/C++, Editura Didactic
a si Pedagogic
a, Bucuresti, 2005.
[4] Gh. Barbu, I. V
aduva, M. Bolosteanu, Bazele informaticii, Editura Tehnica, Bucuresti, 1997.
[5] C. Balc
au, Combinatoric
a si teoria grafurilor, Editura Universitatii din Pitesti,
Pitesti, 2007.
[6] O. Basc
a, L. Livovschi, Algoritmi euristici, Editura Universitatii din Bucuresti, Bucuresti, 2003.
[7] E. Cerchez, M. Serban, Programarea n limbajul C/C++ pentru liceu. Vol. 2: Metode
si tehnici de programare, Ed. Polirom, Iasi, 2005.
[8] E. Ciurea, L. Ciupal
a, Algoritmi. Introducere n algoritmica fluxurilor n retele, Editura Matrix Rom, Bucuresti, 2006.
[9] T.H. Cormen, Algorithms Unlocked, MIT Press, Cambridge, 2013.
[10] T.H. Cormen, C.E. Leiserson, R.L. Rivest, C. Stein, Introduction to Algorithms, MIT
Press, Cambridge, 2009.
[11] C. Croitoru, Tehnici de baz
a n optimizarea combinatorie, Editura Universitatii Al.
I. Cuza, Iasi, 1992.
[12] N. Dale, C. Weems, Programming and problem solving with JAVA, Jones & Bartlett
Publishers, Sudbury, 2008.
[13] D. Du, X. Hu, Steiner Tree Problems in Computer Communication Networks, World
Scientific Publishing Co. Pte. Ltd., Hackensack, 2008.
[14] S. Even, Graph Algorithms, Cambridge University Press, Cambridge, 2012.

4
[15] H. Georgescu, Tehnici de programare, Editura Universitatii din Bucuresti, Bucuresti,
2005.
[16] C.A. Giumale, Introducere n analiza algoritmilor. Teorie si aplicatii, Ed. Polirom,
Iasi, 2004.
[17] M. Goodrich, R. Tamassia, Algorithm Design. Foundatiolis, Analysis and Internet
Examples, Wiley, New Delhi, 2011.
[18] F.V. Jensen, T.D. Nielsen, Bayesian Networks and Decision Graphs, Springer, New
York, 2007.
[19] D. Jungnickel, Graphs, Networks and Algorithms, Springer, Heidelberg, 2013.
[20] D.E. Knuth, The Art Of Computer Programming. Vol. 4A: Combinatorial Algorithms, Addison-Wesley, Massachusetts, 2011.
[21] B. Korte, J. Vygen, Combinatorial Optimization. Theory and Algorithms, Springer,
Heidelberg, 2012.
[22] R. Lafore, Data Structures and Algorithms in Java, Sams Publishing, Indianapolis,
2002.
[23] A. Levitin, Introduction to The Design and Analysis of Algorithms, Pearson, Boston,
2012.
[24] L. Livovschi, H. Georgescu, Sinteza si analiza algoritmilor, Editura Stiintific
a si
Enciclopedica, Bucuresti, 1986.
[25] D. Logofatu, Algoritmi fundamentali n C++: Aplictii, Ed. Polirom, Iasi, 2007.
[26] D. Lucanu, M. Craus, Proiectarea algoritmilor, Ed. Polirom, Iasi, 2008.
[27] D.R. Popescu, Combinatoric
a si teoria grafurilor, Societatea de Stiinte Matematice
din Rom
ania, Bucuresti, 2005.
[28] N. Popescu, Data structures and algorithms using Java, Editura Politehnica Press,
Bucuresti, 2008.
[29] V. Preda, C. Balc
au, Entropy optimization with applications, Editura Academiei
Rom
ane, Bucuresti, 2010.
[30] R. Sedgewick, P. Flajolet, An Introduction to the Analysis of Algorithms, AddisonWesley, New Jersey, 2013.
[31] R. Sedgewick, K. Wayne, Algorithms, Addison-Wesley, Massachusetts, 2011.
[32] R. Stephens, Essential Algorithms: A Practical Approach to Computer Algorithms,
Wiley, Indianopolis, 2013.
[33] S. T
anasa, C. Olaru, S. Andrei, Java de la 0 la expert, Ed. Polirom, Iasi, 2007.

5
[34] T. Toadere, Grafe. Teorie, algoritmi si aplicatii, Editura Albastr
a, Cluj-Napoca,
2002.
[35] I. Tomescu, Combinatoric
a si teoria grafurilor, Tipografia Universitatii din Bucuresti, Bucuresti, 1978.
[36] I. Tomescu, Probleme de combinatoric
a si teoria grafurilor, Editura Didactica si
Pedagogic
a, Bucuresti, 1981.
[37] I. Tomescu, Data structures, Editura Universitatii din Bucuresti, Bucuresti, 2004.
[38] M.A. Weiss, Data Structures and Algorithm Analysis in Java, Addison-Wesley, New
Jersey, 2012.
[39] ***, Handbook of combinatorics, edited by R.L. Graham, M. Grotschel and L. Lovasz,
Elsevier, Amsterdam, 1995.
[40] ***, Handbook of discrete and combinatorial mathematics, edited by K.H. Rosen,
J.G. Michaels, J.L. Gross, J.W. Grossman and D.R. Shier, CRC Press, Boca Raton,
2000.

Tema 1
Elemente de complexitatea
algoritmilor si teoria grafurilor
1.1

Notatii asimptotice

Vom defini un tip de functii care reprezinta un bun model pentru descrierea
complexitatii temporale a unui algoritm, adica a dependentei timpului de
executie fata de dimensiunea datelor de intrare.
Definitia 1.1.1. O functie asimptotic pozitiv
a (prescurtat a.p.) este o
functie f : N \ A R a..
A N este o multime finita;
n0 N \ A astfel ncat f (n) > 0, n n0 .
Observatia 1.1.1. De cele mai multe ori, multimea A este de forma
A=

{0, 1, 2, . . . , k} , unde k N.
{z
}
|

primele numere naturale

(3n4 + n + 3) n 5
Exemplul 1.1.1. Functia f : D R, f (n) =
, unde
(5n + 1)(n 8)
D = {n N | n 5, n 6= 8}, este asimptotic pozitiva, deoarece D = N \ A
cu A = {0, 1, 2, 3, 4, 8} (multime finita) si f (n) > 0, n 9.
ln(n5 + 1) n
, nu este
(n 1)(n 6)
asimptotic pozitiva, deoarece (n 1)(n 6) > 0, n 7, dar lim [ln(n5 +
Exemplul 1.1.2. Functia g : N \ {1, 6} R, g(n) =

1) n] = , deci n0 N, n0 7 a.. g(n) < 0, n n0 .


6

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

Lema 1.1.1. O functie polinomiala f : N R, de grad p,


f (n) = ap np + ap1 np1 + + a1 n + a0 , a0 , a1 , . . . , ap R, ap 6= 0,
este asimptotic pozitiva daca si numai daca ap > 0.
Definitia 1.1.2. Fie f si g doua functii asimptotic pozitive. Spunem ca f
si g sunt asimptotic echivalente si notam
f g (sau f (n) g(n))
daca

f (n)
= 1.
n g(n)

lim

Definitia 1.1.3. Fie g o functie a.p. (asimptotic pozitiva). Definim multimea


de functii O (g) (sau O (g(n))) ca fiind

O (g) = f f = functie a.p., c > 0, n0 N a..

f (n) c g(n), n n0 .
Daca f O (g) spunem ca f este asimptotic m
arginit
a superior
de g.
Pentru f O (g) se mai utilizeaza (n mod abuziv!) si scrierea f (n) =
O (g(n)).
Se citeste:
f este de ordinul O mare de g sau

f (n) este de ordinul O mare de g(n) (cand n ).

Observatia 1.1.2. Ilustrarea grafica a notatiei f O (g), si anume ca pentru


n n0 graficul functiei c g se afla deasupra graficului functiei f , este data
n Figura 1.1.1.
Definitia 1.1.4. Fie g o functie a.p. (asimptotic pozitiva). Definim multimea
de functii (g) (sau (g(n))) ca fiind

(g) = f f = functie a.p., c > 0, n0 N a..

c g(n) f (n), n n0 .
Daca f (g) spunem ca f este asimptotic m
arginit
a inferior
de g.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

Figura 1.1.1:

Pentru f (g) se mai utilizeaza (n mod abuziv!) si scrierea f (n) =


(g(n)).
Se citeste:
f este de ordinul Omega mare de g sau
f (n) este de ordinul Omega mare de g(n) (cand n ).
Observatia 1.1.3. Ilustrarea grafica a notatiei f (g), si anume ca pentru
n n0 graficul functiei c g se afla sub graficul functiei f , este data n Figura
1.1.2.
Definitia 1.1.5. Fie g o functie a.p. (asimptotic pozitiva). Definim multimea
de functii (g) (sau (g(n))) ca fiind

(g) = f f = functie a.p., c1 , c2 > 0, n0 N a..

c1 g(n) f (n) c2 g(n), n n0 .
Daca f (g) spunem ca f este asimptotic m
arginit
a inferior

si superior de g (sau ca f si g au acela


si ordin de cre
stere).
Pentru f (g) se mai utilizeaza (n mod abuziv!) si scrierea f (n) =
(g(n)).
Se citeste:
f este de ordinul Theta (mare) de g sau

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

Figura 1.1.2:

f (n) este de ordinul Theta (mare) de g(n) (cand n ).


Observatia 1.1.4. Ilustrarea grafica a notatiei f (g), si anume ca pentru
n n0 graficul functiei f este cuprins ntre graficele functiilor c1 g si c2 g,
este data n Figura 1.1.3.

Figura 1.1.3:

Observatia 1.1.5. Notatia O se foloseste pentru a exprima complexitatea unui


algoritm corespunzatoare timpului de executie n cazul cel mai defavorabil,
fiind astfel cea mai adecvata analizei algoritmilor.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

10

Notatia se foloseste pentru a exprima complexitatea unui algoritm corespunzatoare timpului de executie n cazul cel mai favorabil.
Notatiile si se folosesc atunci cand se poate determina exact timpul
de executie al unui algoritm. Notatia se foloseste si atunci cand timpii de
executie corespunzatori cazurilor extreme sunt exprimati prin functii care au
acelasi ordin de crestere.
Propozitia 1.1.1. Fie f si g doua functii asimptotic pozitive.
a) f (n) = O(g(n)) daca si numai daca g(n) = (f (n)).
b) f (n) = (g(n)) daca si numai daca f (n) = O (g(n)) si f (n) = (g(n)).
Propozitia 1.1.2. Fie f si g doua functii asimptotic pozitive astfel ncat
exista
f (n)
= .
lim
n g(n)
a) f (n) = O (g(n)) daca si numai daca [0, +).
b) f (n) = (g(n)) daca si numai daca (0, +].
c) f (n) = (g(n)) daca si numai daca (0, +).
Exemplul 1.1.3. Vom aplica propozitia anterioar
a pentru functia asimptotic
4
(3n + n + 3) n 5
, unde D = {n N | n
pozitiva f : D R, f (n) =
(5n + 1)(n 8)
5, n 6= 8}, considerata n Exemplul 1.1.1.
Deoarece

(3n4 + n + 3) n 5
f (n)
= lim
lim
n n3 (5n + 1)(n 8)
n n3
q

1 n5
n4 n 3 + n13 + n34
= lim
= 0,
n
n5 (5 + n1 )(1 n8 )
rezulta ca f (n) = O (n3 ), dar f (n) 6= (n3 ) si f (n) 6= (n3 ).
Deoarece

f (n)
(3n4 + n + 3) n 5
lim
= lim
n n2
n n2 (5n + 1)(n 8)
q

3
1
4
n n 3 + n3 + n4
1 n5
= lim
= ,
n
n4 (5 + n1 )(1 n8 )

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

11

rezulta ca f (n) = (n2 ), dar f (n) 6= O (n2 ) si f (n) 6= (n2 ).


Deoarece

f (n)
(3n4 + n + 3) n 5
lim
= lim 2
n n2 n
n n
n(5n + 1)(n 8)
q

3
1
4
n n 3 + n3 + n4
1 n5
3
= lim

= ,
1
8
4
n
5
n n(5 + n )(1 n )

rezulta ca f (n) = (n2 n), deci f (n) = O (n2 n) si f (n) = (n2 n).
Propozitia 1.1.3. Daca f : N R este o functie polinomiala de grad p,
f (n) = ap np + ap1 np1 + + a1 n + a0 , a0 , a1 , . . . , ap R, ap > 0,

atunci
a) f (n) = O (nk ), k p;
b) f (n) = (nk ), k p;
c) f (n) = (np ).
Definitia 1.1.6. Fie A un algoritm, n dimensiunea datelor de intrare si
T (n) timpul de executie estimat pentru algoritmul A. Se spune ca algoritmul
A are comportare polinomial
a (sau ca este polinomial sau ca apartine
clasei P ) daca p > 0 astfel ncat T (n) = O (np ).
Observatia 1.1.6. Algoritmii polinomiali sunt, n general, acceptabili n practica. Algoritmii care necesita un timp de calcul exponential sunt utilizati
numai n cazuri exceptionale si doar pentru date de intrare de dimensiuni
relativ mici.

1.2

Parcurgerea grafurilor. Aplicatii

Prin parcurgerea unui graf se ntelege o metoda sistematica de vizitare succesiva a nodurilor sale (n vederea prelucrarii informatiilor atasate n structura
de date modelata prin graful dat).
Definitia 1.2.1. Fie G = (V, E) un graf si x V un nod arbitrar fixat.
Parcurgerea n ad
ancime (DF, depth first) a grafului G pornind din
nodul x, numit si r
ad
acin
a a acestei parcurgeri, consta n:
se vizitez
a nodul x, acesta devine nod curent;

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

12

daca nodul curent vi are succesori directi (adica noduri vj pentru care
exista muchie sau arc de la vi la vj ) nevizitati, atunci se viziteaza primul
astfel de nod vj ; nodul vj devine nod curent si se continua procedeul de
parcurgere pornind din acest nod;
daca nodul curent vj nu mai are succesori directi nevizitati, atunci se
revine la nodul predecesor direct vi (cel din care a fost vizitat); nodul vi
redevine nod curent si se continua procedeul de parcurgere pornind din
acest nod;
daca nodul curent nu mai are nici succesori directi nevizitati, nici predecesor direct (deci este chiar radacina x), atunci parcurgerea se ncheie.
Observatia 1.2.1. Pentru parcurgerea DF, considerand cate o muchie sau un
arc de la fiecare nod curent vi la primul sau succesor direct nevizitat vj (care
va deveni urmatorul nod curent) se obtine un arbore, numit arbore DF.
Exemplul 1.2.1. Fie graful orientat din Figura 1.2.1.
1

2
5

4
Figura 1.2.1:

Parcurgerea n adancime pornind din nodul 2 este


DF (2) : 2, 3, 1, 4, 5
(considerand ca ordinea dintre succesorii directi ai fiecarui nod este ordinea
crescatoare). Arborele DF corespunzator acestei parcurgeri este reprezentat
n Figura 1.2.2.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

13

1
Figura 1.2.2:

5
Figura 1.2.3:

Pentru acelasi graf, parcurgerea DF pornind din nodul 3 este


DF (3) : 3, 1, 2, 4, 5,
iar arborele DF corespunzator este reprezentat n Figura 1.2.3.
Prezentam n continuare doi algoritmi, unul recursiv si altul nerecursiv,
pentru implementarea parcurgerii n adancime.
Algoritmul 1.2.1 (parcurgerea DF, recursiv). Fie graful G = (V, E) avand
multimea de noduri V = {1, . . . , n} si matricea de adiacenta A = (aij )i,j=1,n .
Fie x V un nod arbitrar fixat. Pentru implementarea parcurgerii DF (x)
vom utiliza un vector V IZ avand semnificatia

1, daca nodul i a fost vizitat,
i {1, . . . , n}.
V IZ[i] =
0, n caz contrar,
Pentru memorarea arborelui DF (x) vom utiliza un vector T AT A avand
semnificatia

0, daca i = x (radacina),
T AT A[i] =
predecesorul direct al lui i, daca i 6= x,

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

14

pentru orice nod i din parcurgerea DF .


Descrierea n pseudocod a algoritmului recursiv de parcurgere n adancime
pornind din nodul x are forma
DF RECURSIV(x) :

VIZITEAZA(x);
// se viziteaz
a x, de exemplu se afi
seaz
a x
V IZ[x] 1;
// x a fost vizitat
for y = 1, n do
if (a[x, y] 1) and (V IZ[y] = 0) then
// y este primul succesor direct nevizitat al lui x
T AT A[y] x;
DF RECURSIV(y);
// se continu
a parcurgerea DF
// din nodul y
Programul C++ corespunzator, cu citirea grafului dintr-un fisier (avand
pe prima linie numerele n de noduri si m de muchii sau arce ale grafului si
pe liniile urmatoare perechile de noduri ce formeaza aceste muchii sau arce)
si afisarea parcurgerii DF (x) si a vectorului T AT A (ce memoreaza arborele
DF (x)) este:
#include<iostream.h> //parcurgerea DF a unui graf, recursiv
#include<conio.h>
#include<fstream.h>
#define nmax 50
// nr. maxim de noduri
int n,m,A[nmax][nmax],VIZ[nmax],TATA[nmax];
void citire_graf()
// citirea grafului din fisierul "graf2.dat"
{ int i,j,k;
ifstream f("graf2.dat");
f>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) A[i][j]=0;
for(k=1;k<=m;k++)
{ f>>i>>j;
A[i][j]++;
// if (j!=i) A[j][i]++;
// doar pt. grafuri NEORIENTATE
}
f.close();
}
void viziteaza(int x)
// vizitarea nodului x
{ cout<<x<<" ";
}
void DF_recursiv(int x) // parcurgerea DF pornind din nodul x
{ int y;
viziteaza(x);
VIZ[x]=1;
for(y=1;y<=n;y++)

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

15

if ((A[x][y]>=1)&&(VIZ[y]==0))
{ TATA[y]=x;
DF_recursiv(y);
}
}
void main()
{ int x,i;
clrscr();
citire_graf();
for(i=1;i<=n;i++)
{ VIZ[i]=0; TATA[i]=0;
}
cout<<"Nodul de pornire: x=";cin>>x;
cout<<"Parcurgerea DF: ";
DF_recursiv(x);
cout<<"\nArborele DF este dat de vectorul TATA: ";
for (i=1;i<=n;i++) cout<<TATA[i]<<" ";
getch();
}

Exemplul 1.2.2. Pentru graful din Figura 1.2.1, fisierul de intrare graf2.dat
folosit la citirea grafului n programul anterior contine datele:
5 7
//5 noduri si 7 arce
1 2
//arcul (1, 2)
2 3
//arcul (2, 3)
2 4
//arcul (2, 4)
2 5
//arcul (2, 5)
3 1
//arcul (3, 1)
3 2
//arcul (3, 2)
5 4
//arcul (5, 4).
Algoritmul 1.2.2 (parcurgerea DF, nerecursiv). Fie din nou G = (V, E)
un graf avand multimea de noduri V = {1, . . . , n} si matricea de adiacenta
A = (aij )i,j=1,n . Fie x V un nod arbitrar fixat. Pentru implementarea nerecursiva a parcurgerii DF (x) vom utiliza vectorii V IZ si T AT A cu aceleasi
semnificatii ca n algoritmul anterior, un vector URM cu semnificatia
URM[i] = urmatorul succesor direct al nodului i,
si o structura de tip stiv
a S, memorata ca un vector, ce contine nodurile
vizitate si n curs de prelucrare, adica de vizitare a tuturor succesorilor.
Descrierea n pseudocod a algoritmului are forma

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

16

DF(x) :

VIZITEAZA(x);
// se viziteaz
a x, de exemplu se afi
seaz
a x
V IZ[x] 1;
// x a fost vizitat
T AT A[x] 0;
varf 1; S[varf ] x;
// x se introduce ^
n v^
arful stivei
while (varf > 0) do
// stiva este nevid
a
i S[varf ];
// i este nodul din v^
arful stivei
j URM[i] + 1;
// j va fi urm
atorul succesor direct
// nevizitat al lui i, dac
a exist
a
while (a[i, j] = 0) and (j n) do j j + 1;
if (j > n) then
// nodul i nu mai are succesori direct
i nevizitat
i
varf varf 1;
// s-a ^
ncheiat prelucrarea lui i
//
si ^
l elimin
am din stiv
a
else
URM[i] j;
// j este urm
atorul succesor direct
// al lui i
if (V IZ[j] = 0) then
// j nu a fost vizitat

VIZITEAZA(j);
// se viziteaz
a j
V IZ[j] 1;
// j a fost vizitat
T AT A[j] i;
varf varf + 1;
S[varf ] j;
// se introduce j ^
n v^
arful stivei
// stiva este vid
a, nu mai exist
a noduri neprelucrate,
// parcurgerea este
^ncheiat
a.
Observatia 1.2.2. Pentru un graf cu n noduri si m muchii sau arce, implementarea anterioara a parcurgerii DF are complexitatea O (n2 ), deoarece
oricare din cele n noduri este vizitat (deci introdus si extras din stiva) cel
mult cate o data, iar cautarea succesorilor directi j nevizitati ai fiecarui nod
i extras din stiva se efectueaza n cel mult n pasi, prin parcurgerea liniei i
din matricea de adiacenta.
Daca graful este memorat prin intermediul listelor de adiacenta, atunci
cautarea succesorilor directi j nevizitati ai fiecarui nod i extras din stiva
se efectueaza, prin parcurgerea lor succesiva, n exact d(i) (pentru graf
P
neorientat) sau d+ (i) (pentru graf orientat) pasi. Cum
d(x) = 2m si
xV
P +
d (x) = m, obtinem ca n acest caz parcurgerea DF are complexitatea
xV

O (n + m).

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

17

Observatia 1.2.3. Daca G = (V, E) este un graf neorientat, atunci pentru


orice nod x V componenta conexa a nodului x este (indusa de) chiar
multimea nodurilor vizitate prin parcurgerea DF (x).
Pe baza acestei observatii obtinem urmatorul algoritm.
Algoritmul 1.2.3 (determinarea componentelor conexe). Fie din nou
G = (V, E) un graf neorientat, V = {1, . . . , n} si fie A = (aij )i,j=1,n matricea
de adiacenta a grafului G. Pentru determinarea componentelor conexe ale
grafului G vom utiliza un vector CC cu semnificatia
CC[i] = numarul componentei conexe n care se afla nodul i,
i {1, . . . , n} si o variabila nrc ce reprezinta numarul de componente
conexe. Evident, graful G este conex daca si numai daca valoarea finala a
variabilei nrc este egala cu 1.
Descrierea n pseudocod a algoritmului are forma
COMPONENTE CONEXE :
nrc 0;
for i = 1, n do CC[i] 0;
for i = 1, n do
if (CC[i] = 0) then
// nodul i nu a fost vizitat
nrc nrc + 1;
// nodurile din parcurgerea DF (i)
DF(i);
// vor forma o nou
a component
a conex
a
unde functia DF(i) este cea din Algoritmul 1.2.1 sau cea din Algoritmul

1.2.2, adaugand instructiunea CC[i] nrc n functia VIZITEAZA(i).

Observatia 1.2.4. Algoritmul anterior poate fi utilizat si pentru determinarea


componentelor conexe ale unui graf orientat, nlocuind conditia axy 1 din
functia DF RECURSIV(x) cu axy 1 sau ayx 1, respectiv conditia
aij = 0 din functia DF(x) cu aij = 0 si aji = 0 (deoarece n determinarea
componentelor conexe nu se tine cont de orientarea arcelor).
Observatia 1.2.5. Daca G = (V, E) este un graf orientat, atunci pentru orice
nod x V componenta tare-conexa a nodului x este (indusa de) multimea
nodurilor y vizitate prin parcurgerea DF (x) a grafului G cu proprietatea ca
y este vizitat si n parcurgerea DF (x) a grafului
G = (V, E), unde E = {(j, i)|(i, j) E},
numit transpusul (simetricul) lui G. Evident, orice drum (y, v1 , . . . , vk , x)
n graful G corespunde drumului (x, vk , . . . , v1 , y) n graful G, deci x si y
sunt n aceeasi componenta tare-conexa a lui G daca si numai daca exista un

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

18

drum de la x la y n G si un drum de la x la y n G, adica y este vizitat prin


parcurgerea DF (x) atat n G cat si n G.
Matricea de adiacenta a grafului G este transpusa matricei de adiacenta
a grafului G, deci pentru parcurgerea DF (x) a grafului G putem utiliza
tot matricea de adiacenta A a grafului dat G, nlocuind conditia aij = 0
cu aji = 0, iar conditia axy 1 cu ayx 1 n functiile DF(x),
respectiv DF RECURSIV(x). Astfel, algoritmul DF poate fi utilizat si
pentru determinarea componentelor tare-conexe, deci si pentru verificarea
tare-conexitatii grafului.
Definitia 1.2.2. Fie G = (V, E) un graf si x V un nod arbitrar fixat.
Parcurgerea n l
atime (BF,breadth first, parcurgerea pe nivele) a
grafului G pornind din nodul x, numit si r
ad
acin
a a acestei parcurgeri,
consta n:
se vizitez
a nodul x, considerat nod de nivelul zero;
se viziteaza apoi succesorii directi nevizitati ai acestuia (diferiti de x),
considerati noduri de nivelul 1;
se viziteaza apoi, pe rand, succesorii directi nevizitati ai acestora, considerati noduri de nivelul 2;
s.a.m.d.;
parcurgerea se ncheie cand niciun nod de pe un nivel nu mai are succesori directi nevizitati.
Observatia 1.2.6. Analog parcurgerii DF, considerand cate o muchie sau un
arc de la fiecare nod curent v al parcurgerii BF la fiecare din nodurile nevizitate (de pe urmatorul nivel) pentru care v este predecesorul direct, se obtine
un arbore, numit arbore BF.
Exemplul 1.2.3. Pentru graful din Figura 1.2.1, parcurgerea n latime pornind
din nodul 2 este
BF (2) : 2, 3, 4, 5, 1
(considerand din nou ordinea dintre succesorii directi ai fiecarui nod ca fiind ordinea crescatoare). Arborele BF corespunzator acestei parcurgeri este
reprezentat n Figura 1.2.4.

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.


2

19

4
Figura 1.2.4:

Figura 1.2.5:

Pentru acelasi graf, parcurgerea BF pornind din nodul 3 este


BF (3) : 3, 1, 2, 4, 5,
iar arborele BF corespunzator este reprezentat n Figura 1.2.5.
Algoritmul 1.2.4 (parcurgerea BF). Fie graful G = (V, E) avand multimea
de noduri V = {1, . . . , n} si matricea de adiacenta A = (aij )i,j=1,n . Fie x V
un nod arbitrar fixat. Pentru implementarea parcurgerii BF (x) vom utiliza
vectorii V IZ, T AT A, URM si S avand aceleasi semnificatii ca la parcurgerea
DF (x) (Algoritmul 1.2.2), cu deosebirea ca vectorul S al nodurilor vizitate
si n curs de prelucrare este organizat si utilizat acum ca o structura de tip
coad
a.
Aceasta fiind singura modificare fata de Algoritmul 1.2.2, obtinem urmatoarea descriere n pseudocod a algoritmului de parcurgere n latime

TEMA 1. ELEMENTE DE COMPLEX. ALG. SI TEOR. GRAF.

20

BF(x) :

VIZITEAZA(x);
V IZ[x] 1;
T AT A[x] 0;
coada 1;
// nodurile se adaug
a la S pe pozit
ia "coada "
varf 1;
//
si se elimin
a de pe pozit
ia "varf "
S[coada] x;
while (varf coada) do
// coada este nevid
a
i S[varf ];
j URM[i] + 1;
while (a[i, j] = 0) and (j n) do j j + 1;
if (j > n) then
varf varf + 1;
else
URM[i] j;
if (V IZ[j] = 0) then

VIZITEAZA(j);
V IZ[j] 1;
T AT A[j] i;
coada coada + 1;
S[coada] j;
Observatia 1.2.7. Analog parcurgerii DF, implementarea anterioara a parcurgerii BF are complexitatea O (n2 ), iar daca graful este memorat prin
intermediul listelor de adiacenta, atunci complexitatea este O (n + m).
Observatia 1.2.8. Observatiile 1.2.3, 1.2.4 si 1.2.5 si algoritmii corespunzatori
raman valabile daca nlocuim parcurgerea DF cu parcurgerea BF.

Tema 2
Metoda Greedy
2.1

Descrierea metodei. Algoritmi generali

Metoda Greedy (a optimului local) presupune elaborarea unor strategii


de rezolvare a problemelor de optim, n care se urmareste maximizarea sau
minimizarea unei functii obiectiv.
Se aplica problemelor n care se da o multime finita A = {a1 , a2 , . . . , an }
(multimea de candidati), continand n date de intrare, pentru care se cere
sa se determine o submultime B A care sa ndeplineasca anumite conditii
pentru a fi acceptata. Aceasta submultime se numeste solutie posibil
a
(solutie admisibil
a, pe scurt solutie).
Deoarece, n general, exista mai multe solutii posibile, trebuie avut n
vedere si un criteriu de selectie, conform caruia, dintre acestea, sa fie aleasa
una singura ca rezultat final, numita solutie optim
a.
Solutiile posibile au urmatoarele proprietati:
multimea vida este ntotdeauna solutie posibila;
daca B este solutie posibila si C B, atunci si C este solutie posibila.
In continuare sunt prezentate doua scheme de lucru, care urmeaza aceeasi
idee, diferentiindu-se doar prin ordinea de efectuare a unor operatii:
Algoritmul 2.1.1 (Metoda Greedy, varianta I).
Se pleaca de la solutia vida ();
Se alege, pe rand, ntr-un anumit fel, un element din A neales la pasii
precedenti.

21

TEMA 2. METODA GREEDY

22

Daca includerea elementului ales n solutia partiala construita anterior conduce la o solutie posibila, atunci construim noua solutie prin
adaugarea elementului ales.
GREEDY1(A, n, B) :
B ;
for i = 1, n do
x ALEGE(A, i, n);
if SOLUTIE POSIBILA (B, x) then
B B {x};
Observatia 2.1.1.
Functia ALEGE(A, i, n) returneaza un element x = aj {ai , . . . , an }
si efectueaza interschimbarea ai aj ;
Functia SOLUTIE POSIBILA(B, x) verifica daca B{x} este solutie
posibila a problemei.
Functia ALEGE este cea mai dificil de realizat, deoarece trebuie sa
implementeze criteriul conform caruia alegerea la fiecare pas a cate
unui candidat sa conduca n final la obtinerea solutiei optime.
Algoritmul 2.1.2 (Metoda Greedy, varianta a II-a).
Metoda e asemanatoare primeia, cu exceptia faptului ca se stabileste de
la nceput ordinea n care trebuie analizate elementele din A.
GREEDY2(A, n, B) :
PRELUCREAZA (A, n);
B ;
for i = 1, n do
if SOLUTIE POSIBILA (B, ai ) then
B B {ai };
Observatia 2.1.2. Prin apelul procedurii PRELUCREAZA(A, n) se efectueaza o permutare a elementelor multimii A, stabilind ordinea de analiza a
acestora. Aceasta este procedura cea mai dificil de realizat.
Observatia 2.1.3.

23

TEMA 2. METODA GREEDY

Metoda Greedy nu cauta sa determine toate solutiile posibile si apoi


sa aleaga pe cea optima conform criteriului de optimizare dat (ceea ce
ar necesita n general un timp de calcul si spatiu de memorie mari), ci
consta n a alege pe rand cate un element, urmand sa-l nghita eventual n solutia optima. De aici vine si numele metodei (Greedy = lacom).
Astfel, daca trebuie determinat maximul unei functii de cost depinzand
de a1 , . . . , an , ideea generala a metodei este de a alege la fiecare pas acel
element care face sa creasca cat mai mult valoarea acestei functii. Din
acest motiv metoda se mai numeste si a optimului local.
Optimul global se obtine prin alegeri succesive, la fiecare pas, ale optimului local, ceea ce permite rezolvarea problemelor fara revenire la
deciziile anterioare (asa cum se ntampla la metoda backtracking).
In general metoda Greedy ofera o solutie posibila si nu ntotdeauna
solutia optima. De aceea, daca problema cere solutia optima, algoritmul trebuie sa fie nsotit si de justificarea faptului ca solutia generata
este optima. Pentru aceasta, este frecvent ntalnit urmatorul procedeu:
se demonstreaza prin inductie matematica faptul ca pentru orice
pas i {0, 1, . . . , n}, daca Bi este solutia posibila construita la
pasul i, atunci exista o solutie optima B astfel ncat Bi B ;

se arata ca pentru solutia finala, Bn , incluziunea Bn B devine


egalitate, Bn = B , deci Bn este solutie optima.

Exemplul 2.1.1. Se da o multime A = {a1 , a2 , . . . , an } cuPai R, i = 1, n. Se


cere sa se determine o submultime B A, astfel ncat
b sa fie maxima.
bB

Rezolvare. Daca B A si b0 B, cu b0 0, atunci


X
X
b
b.
bB

bB\{b0 }

Rezulta ca putem ntelege prin solutie posibil


a o submultime B a lui A
cu toate elementele strict pozitive.
Vom aplica metoda Greedy, n varianta I, n care
functia ALEGE furnizeaza x = ai ;
functia SOLUTIE POSIBILA returneaza 1 (adevarat) daca x > 0
si 0 (fals) n caz contrar.


24

TEMA 2. METODA GREEDY


ALEGE (A, i, n) :
x ai ;
returneaz
a x;
SOLUTIE POSIBILA(B, x) :
if x > 0 then
returneaz
a 1;
else
returneaz
a 0;

2.2
2.2.1

// adev
arat
// fals

Aplicatii ale Inegalit


atii rearanjamentelor
Inegalitatea rearanjamentelor

Teorema 2.2.1 (Inegalitatea rearanjamentelor). Fie sirurile crescatoare


de numere reale
a1 a2 . . . an si b1 b2 . . . bn , n N .
Atunci, pentru orice permutare p Sn (Sn = grupul permutarilor de ordin
n), avem
n
n
n
X
X
X
ai bi .
(2.2.1)
ai bp(i)
ai bn+1i
i=1

i=1

i=1

Demonstratie. Pentru orice permutare p Sn , notam


s(p) =

n
X
i=1

ai bp(i) .

Fie
M = max s(p).
pSn

(2.2.2)

Demonstram ca pentru orice k {0, 1, . . . , n} exista p Sn astfel ncat


s(p) = M si p(i) = i 1 i k,

(2.2.3)

prin inductie dupa k.


Pentru k = 0 afirmatia este evidenta, luand orice permutare p Sn astfel
ncat s(p) = M.
Presupunem (2.2.3) adevarata pentru k 1, adica exista p Sn astfel
ncat
s(p) = M si p(i) = i 1 i k 1

25

TEMA 2. METODA GREEDY

si o demonstram pentru k (k {1, 2, . . . , n}).


Avem doua cazuri.
Cazul 1) p(k) = k. Atunci p(i) = i 1 i k.
Cazul 2) p(k) 6= k. Cum p este o permutare si p(i) = i 1 i k 1,
rezulta ca p(k) > k si exista j > k a.. p(j) = k. Definim permutarea p Sn
prin

p (k) = p(j),
p (j) = p(k),

p (i) = p(i), i {1, . . . , n} \ {k, j}.
Avem

s(p ) s(p) =

n
X
i=1

ai bp (i)

n
X
i=1

ai bp(i)

= ak bp (k) + aj bp (j) ak bp(k) aj bp(j)


= ak bp(j) + aj bp(k) ak bp(k) aj bp(j)
= (aj ak )(bp(k) bp(j) )
= (aj ak ) (bp(k) bk ) 0
| {z } | {z }
0

(deoarece j > k, p(k) > k, iar sirurile (ai )i=1,n si (bi )i=1,n sunt crescatoare).
Deci s(p ) s(p) = M.
Cum, conform (2.2.2), avem s(p ) M, rezulta ca
s(p ) = s(p) = M
(n plus, aj = ak sau bp(k) = bk ).
Evident, p (i) = i 1 i k, deci relatia (2.2.3) este adevarata pentru
k, ceea ce ncheie demonstratia prin inductie a acestei relatii.
Luand k = n n aceasta relatie rezulta ca
s(e) = M,

(2.2.4)

unde e Sn este permutarea identica, definita prin e(i) = i i {1, . . . , n}.


Fie p Sn o permutare arbitrara. Din (2.2.2) si (2.2.4) rezulta ca s(p)
s(e), adica
n
n
X
X
ai bp(i)
ai bi .
i=1

i=1

Aplicand aceasta inegalitate pentru sirurile crescatoare

a1 a2 . . . an si bn bn1 . . . b1

26

TEMA 2. METODA GREEDY


rezulta ca

n
X
i=1

adica

ai (bp(i) )
n
X
i=1

2.2.2

n
X
i=1

ai bn+1i

ai (bn+1i ),

n
X
i=1

ai bp(i) .

Produs scalar maxim/minim

Se considera sirurile de numere reale


a1 , a2 , . . . , an si b1 , b2 , . . . , bn , n N .
Se cere sa se determine doua permutari aq(1) , aq(2) , . . . , aq(n) si bp(1) , bp(2) , . . . , bp(n)
ale celor doua siruri, q, p Sn (Sn = grupul permutarilor de ordin n), astfel
n
X
ncat suma
aq(i) bp(i) sa fie
i=1

a) maxima;
b) minima.

Observatia 2.2.1. Suma

n
X
i=1

aq(i) bp(i) reprezinta produsul scalar al vecto-

rilor (aq(i) )i=1,n si (bp(i) )i=1,n . Astfel problema anterioara cere determinarea
unor permutari ale elementelor vectorilor (a1 , a2 , . . . , an ) si (b1 , b2 , . . . , bn ) astfel ncat dupa permutare produsul lor scalar sa fie maxim, respectiv minim.
Rezolvarea problemei de maxim
Algoritmul 2.2.1. Conform Teoremei 2.2.1 deducem urmatoarea strategie Greedy
n varianta I pentru rezolvarea problemei:
Pentru obtinerea celor n termeni ai sumei maxime, la fiecare pas i = 1, n
luam produsul dintre:
cel mai mic dintre termenii sirului (a1 , a2 , . . . , an ) neales la pasii
anteriori;
cel mai mic dintre termenii sirului (b1 , b2 , . . . , bn ) neales la pasii
anteriori.

27

TEMA 2. METODA GREEDY

Descrierea n pseudocod a algoritmului are urmatoarea forma.


MAXIM1 (a, b, n, s) :
// a = (a1 , . . . , an ), b = (b1 , . . . , bn )
s 0;
// s = suma maxim
a
// pasul i
for i = 1, n do
k i;
// calcul
am termenul minim ak din (ai , . . . , an )
m a[i];
for j = i + 1, n do
if a[j] < m then
k j;
m a[j];
a[i] a[k];
// interschimb
am termenii ai s
i ak
k i;
// calcul
am termenul minim bk din (bi , . . . , bn )
m b[i];
for j = i + 1, n do
if b[j] < m then
k j;
m b[j];
b[i] b[k];
s s + a[i] b[i];
AFISARE(s, a, b, n);

// interschimb
am termenii bi s
i bk
// adun
am produsul termenilor minimi
// la suma s
// se afi
seaz
a suma maxim
a s
i
// permut
arile obt
inute

Functia de afisare este


AFISARE (s, a, b, n) :
afiseaz
a s;
for i = 1, n do
afiseaz
a a[i];
for i = 1, n do
afiseaz
a b[i];
Observatia 2.2.2. Algoritmul necesita cate doua comparatii si cate cel mult
patru atribuiri pentru fiecare pereche de indici (i, j) cu i {1, 2, . . . , n} si
j {i + 1, i + 2, . . . , n}. Numarul acestor perechi este (n 1) + (n 2) +
n(n 1)
, deci algoritmul are complexitatea (n2 ).
+2+1 =
2
Algoritmul 2.2.2. Conform Teoremei 2.2.1 obtinem si urmatoarea strategie
Greedy n varianta a II-a pentru rezolvarea problemei:
ordonam crescator elementele primului sir: a1 a2 . . . an ;

28

TEMA 2. METODA GREEDY

ordonam crescator elementele celui de-al doilea sir: b1 b2 . . . bn ;


suma maxima este s =

n
X
i=1

ai bi .

Descrierea n pseudocod a algoritmului are urmatoarea forma.


MAXIM2 (a, b, n, s) :
// a = (a1 , . . . , an ), b = (b1 , . . . , bn )
SORTARE (a, n);
// se sorteaz
a cresc
ator vectorul a
SORTARE (b, n);
// se sorteaz
a cresc
ator vectorul b
s 0;
// s = suma maxim
a
for i = 1, n do
// calcul
am suma maxim
a s
s s + a[i] b[i];
AFISARE(s, a, b, n);
// se afi
seaz
a suma maxim
a s
i
// permut
arile obt
inute
unde functia de afisare este aceeasi ca n Algoritmul 2.2.1.
Observatia 2.2.3. Algoritmul anterior are complexitatea (n log2 n), deoarece
necesita sortarea celor doi vectori de dimensiune n. Rezulta ca Algoritmul
2.2.2 este mai eficient decat Algoritmul 2.2.1.
Rezolvarea problemei de minim
Algoritmul 2.2.3. Conform Teoremei 2.2.1 deducem urmatoarea strategie Greedy
n varianta I pentru rezolvarea problemei de minim:
Pentru obtinerea celor n termeni ai sumei minime, la fiecare pas i = 1, n
luam produsul dintre:
cel mai mic dintre termenii sirului (a1 , a2 , . . . , an ) neales la pasii
anteriori;
cel mai mare dintre termenii sirului (b1 , b2 , . . . , bn ) neales la pasii
anteriori.
Descrierea n pseudocod a algoritmului are urmatoarea forma.

29

TEMA 2. METODA GREEDY

MINIM1 (a, b, n, s) :
// a = (a1 , . . . , an ), b = (b1 , . . . , bn )
s 0;
// s = suma minim
a
for i = 1, n do
// pasul i
k i;
// calcul
am termenul minim ak din (ai , . . . , an )
m a[i];
for j = i + 1, n do
if a[j] < m then
k j;
m a[j];
a[i] a[k];
// interschimb
am termenii ai s
i ak
k i;
// calcul
am termenul maxim bk din (bi , . . . , bn )
m b[i];
for j = i + 1, n do
if b[j] > m then
k j;
m b[j];
b[i] b[k];
s s + a[i] b[i];

// interschimb
am termenii bi s
i bk
// adun
am produsul termenilor calculat
i
// la suma s

AFISARE(s, a, b, n);

// se afi
seaz
a suma minim
a s
i
// permut
arile obt
inute

Functia de afisare este aceeasi ca n Algoritmul 2.2.1.


Algoritmul 2.2.4. Conform Teoremei 2.2.1 obtinem si urmatoarea strategie
Greedy n varianta a II-a pentru rezolvarea problemei de minim:
ordonam crescator elementele primului sir: a1 a2 . . . an ;
ordonam descrescator elementele celui de-al doilea sir: b1 b2 . . .
bn ;
suma minima este s =

n
X
i=1

ai bi .

Descrierea n pseudocod a algoritmului are urmatoarea forma.

TEMA 2. METODA GREEDY


MINIM2 (a, b, n, s) :
SORTARE1 (a, n);
SORTARE2 (b, n);
s 0;
for i = 1, n do
s s + a[i] b[i];
AFISARE(s, a, b, n);

30

// a = (a1 , . . . , an ), b = (b1 , . . . , bn )
// se sorteaz
a cresc
ator vectorul a
// se sorteaz
a descresc
ator vectorul b
// s = suma minim
a
// calcul
am suma minim
a s

// se afi
seaz
a suma minim
a s
i
// permut
arile obt
inute
unde functia de afisare este aceeasi ca n Algoritmul 2.2.1.
Observatia 2.2.4. Analog problemei de maxim, Algoritmul 2.2.3 are complexitatea (n2 ), iar Algoritmul 2.2.4 are complexitatea (n log2 n), fiind astfel
mai eficient decat Algoritmul 2.2.3.

2.2.3

Memorarea optim
a a textelor pe benzi

Se da o banda magnetica suficient de lunga pentru a memora n texte (sau


fisiere)
T1 , T2 , . . . , Tn
de lungimi date (de exemplu, n octeti)
L1 , L2 , . . . , respectiv Ln .
La citirea unui text de pe banda, trebuie citite si textele aflate naintea lui.
Presupunand ca frecventa de citire a celor n texte este aceeasi, se cere
sa se determine o ordine de pozitionare (memorare) optima a acestora pe
banda, adica o pozitionare astfel ncat timpul mediu de citire sa fie minim.
Modelarea problemei
Evident, orice pozitionare a celor n texte pe banda este o permutare a
vectorului (T1 , T2 , . . . , Tn ), adica are forma
(Tp(1) , Tp(2) , . . . , Tp(n) ),
unde p Sn este o permutare de ordin n (pentru orice i {1, . . . , n},
pe pozitia i pe banda se memoreaza textul Tp(i) ).
Evident, timpul de citire doar a unui text Tk este direct proportional cu
lungimea lui, deci putem considera ca acest timp este egal cu lungimea
Lk a textului.

31

TEMA 2. METODA GREEDY


Pentru orice k {1, . . . , n}, citirea textului Tp(k) necesita timpul
tk =

k
X

Lp(i) ,

i=1

deoarece la timpul de citire efectiva a textului Tp(k) trebuie adaugati si


timpii de citire a textelor precedente Tp(1) , Tp(2) , . . . , Tp(k1) .
Frecventa de citire a celor n texte fiind aceeasi, rezulta ca timpul mediu
de citire pentru o pozitionare p Sn este
n

t(p) =

1X
tk
n k=1
n

1 XX
=
Lp(i)
n k=1 i=1
=

1 XX
Lp(i)
n i=1 k=i
n

X
1X
=
Lp(i)
1
n i=1
k=i

1X
(n i + 1) Lp(i) .
=
n i=1

Propozitia 2.2.1. Daca L1 L2 . . . Ln , atunci


min t(p) = t(e),

pSn

adica pozitionarea corespunzatoare permutarii identice este optima.


Demonstratie. Aplicand Teorema 2.2.1 pentru sirurile crescatoare
n
n1
1
<
< < si L1 L2 . . . Ln ,
n
n
n
rezulta ca pentru orice permutare p Sn avem


n 
n 
X
X
ni+1
ni+1
Lp(i)

Li ,

n
n
i=1
i=1

deci

1X
1X
(n i + 1) Lp(i)
(n i + 1) Li ,
n i=1
n i=1

adica t(p) t(e). Rezulta ca min t(p) = t(e).


pSn

TEMA 2. METODA GREEDY

32

Observatia 2.2.5. Mai mult, deoarece sirul

n1
1
n
<
< <
n
n
n

este strict crescator, conform demonstratiei Teoremei 2.2.1 rezulta ca orice


pozitionare optima presupune memorarea textelor pe banda n ordinea crescatoare a lungimilor lor.
Observatia 2.2.6. Conform propozitiei anterioare deducem urmatoarea strategie Greedy pentru rezolvarea problemei:
Varianta I : La fiecare pas i = 1, n se pozitioneaza pe banda pe pozitia
curenta, i, textul de lungime minima dintre cele nepozitionate la pasii anteriori;
Varianta II : Se sorteaza textele n ordinea crescatoare a lungimilor lor si
se pozitioneaza pe banda n aceasta ordine.
Analog problemelor de la sectiunea anterioara, Varianta I are complexitatea (n2 ), iar Varianta II are complexitatea (n log2 n) (fiind astfel mai
eficienta decat Varianta I).

2.3

Problema rucsacului, varianta continu


a

Problema rucsacului (Knapsack) este urmatoarea:


Se considera un rucsac n care se poate ncarca greutatea maxima G,
unde G > 0, si n obiecte O1 , . . . , On , n N . Pentru fiecare obiect Oi ,
i {1, . . . , n}, se cunoaste greutatea sa, gi , unde gi > 0, si castigul obtinut
la transportul sau n ntregime, ci , unde ci > 0.
Se cere sa se determine o modalitate de incarcare a rucsacului cu obiecte
astfel ncat castigul total al obiectelor ncarcate sa fie maxim.
In varianta continu
a (fractionar
a) a problemei, pentru fiecare obiect
Oi poate fi ncarcata orice parte (fractiune) xi [0, 1] din el, castigul obtinut
fiind proportional cu partea ncarcata, adica este egal cu xi ci .
Modelarea problemei
O solutie (solutie posibila ) a problemei este orice vector x = (x1 , . . . , xn )
astfel ncat

xi [0, 1], i {1, . . . , n},


n
P
xi gi G,
i=1

ultima inegalitate exprimand faptul ca greutatea totala ncarcata n


rucsac nu trebuie s depaseasca greutatea maxima.

33

TEMA 2. METODA GREEDY


Castigul (total ) corespunzator solutiei x = (x1 , . . . , xn ) este
f (x) =

n
X

xi ci .

i=1

O solutie optima a problemei este orice solutie x = (x1 , . . . , xn ) astfel


ncat
f (x ) = max{f (x) | x = solutie a problemei}.
Daca suma greutatilor tuturor obiectelor este mai mica decat greutatea
n
P
maxima a rucsacului, adica
gi < G, atunci problema este triviala,
i=1

solutia x = (1, 1, . . . , 1), corespunzatoare ncarcarii integrale a tuturor


celor n obiecte n rucsac, fiind evident singura solutie optima.
Astfel n continuare putem presupune ca
n
X
i=1

gi G.

(2.3.1)

Pentru orice solutie optima x = (x1 , . . . , xn ) avem


n
X

xi gi = G

(2.3.2)

i=1

(adica rucsacul trebuie ncarcat complet). Demonstram aceasta afirn


P
matie prin reducere la absurd. Intr-adevar, daca
xi gi < G, cum
n
P

i=1

i=1

gi > G. rezulta ca exista un indice k {1, . . . , n} a.. xk < 1.

Considerand vectorul x = (x1 , . . . , xn ) definit prin


(
xi , daca i 6= k,

xi =
xi + u, daca i = k,
unde

1
u = min 1 xk ,
gk
avem u > 0, xk 1,

si f (x ) =

n
P

i=1

xi ci

n
P

i=1
n
P

i=1

xi gi =

n
P

i=1

xi ci

n
X
i=1

xi gi +ugk

xi gi

n
P

!)

xi gi +G

i=1

n
P

xi gi = G

i=1

+ uck = f (x ) + uck , deci x este o solutie

a problemei si f (x ) > f (x ), ceea ce contrazice optimalitatea solutiei


x .

TEMA 2. METODA GREEDY

34

Prezentam n continuare un algoritm Greedy pentru rezolvarea problemei.


Algoritmul 2.3.1. Vom utiliza urmatoarea strategie Greedy:
Ordonam obiectele descrescator dupa castigul lor unitar:
c1
c2
cn

.
g1
g2
gn

(2.3.3)

Incarcam obiectele n rucsac, n aceasta ordine, cat timp nu se depaseste


greutatea maxima G. Incarcarea obiectelor se face n ntregime, cat
timp este posibil; n acest fel doar ultimul obiect adaugat poate fi
ncarcat partial.
Descrierea n pseudocod a algoritmului are urmatoarea forma.
RUCSAC (G, n, g, c, x, C) :
// g = (g1 , . . . , gn ), c = (c1 , . . . , cn )
// C = c^
as
tigul total
SORTARE(g, c, n);
// se sorteaz
a obiectele descresc
ator
// dup
a c^
as
tigul lor unitar
R G;
// R = greutatea disponibil
a pentru rucsac
C 0;
i 1;
while R > 0 do
// rucsacul nu este plin
if g[i] R then
// obiectul curent ^
ncape ^
n ^
ntregime, deci
// se adaug
a
^n rucsac
x[i] 1;
C C + c[i];
R R g[i];
// actualiz
am greutatea disponibil
a
i i + 1;
// trecem la obiectul urm
ator
else
// obiectul curent nu ^
ncape ^
n ^
ntregime, deci
// se adaug
a exact acea parte din el care
// umple rucsacul
si ^
nc
arcarea se
^ncheie
R
x[i] g[i] ;
C C + x[i]c[i];
R 0;
for j = i + 1, n do x[j] 0;
AFISARE(C, x, n);

// se afi
seaz
a c^
as
tigul total maxim C
//
si solut
ia optim
a x = (x1 , . . . , xn )

35

TEMA 2. METODA GREEDY

Teorema 2.3.1 (de corectitudine a Algoritmului 2.3.1). In contextul Algoritmului 2.3.1, vectorul x = (x1 , . . . , xn ) calculat de algoritm este o
solutie optim
a a problemei rucsacului.
Demonstratie. Evident, vectorul x = (x1 , . . . , xn ) calculat de algoritm verifica
relatiile

xi [0, 1], i {1, . . . , n},


n
P
xi gi = G,
i=1

deci este o solutie a problemei. Ramane sa demonstram optimalitatea acestei


solutii.
Demonstram prin inductie dupa k {0, 1, . . . , n} ca exista o solutie optima x = (x1 , . . . , xn ) a problemei pentru care
xi = xi , i a.. 1 i k.

(2.3.4)

Pentru k = 0 afirmatia este evidenta, luand x orice solutie optima a


problemei.
Presupunem (2.3.4) adevarata pentru k 1, adica exista o solutie optima
x = (x1 , . . . , xn ) a problemei pentru care
xi = xi , i a.. 1 i k 1
si o demonstram pentru k (k {1, 2, . . . , n}).
Cum
n
k1
k1
X
X
X

xi gi = G,
xi gi + xk gk
xi gi + xk gk =
i=1

i=1

i=1

din descrierea algoritmului (alegerea maximala a lui xk ) rezulta ca


xk xk .
Avem doua cazuri.
Cazul 1) xk = xk . Atunci xi = xi , i {1, . . . , k}, deci (2.3.4) este
adevarata pentru k.
Cazul 2) xk > xk . In acest caz avem k < n, deoarece daca, prin reducere
la absurd, am avea k = n, atunci ar rezulta ca
f (x) =

n
X
i=1

xi ci =

n1
X

xi ci + xn cn >

i=1

ceea ce contrazice optimalitatea solutiei x .

n1
X
i=1

xi ci + xn cn = f (x ),

36

TEMA 2. METODA GREEDY

Definim vectorul x = (x
1 , . . . , xn ) prin
(
xi , daca 1 i k,
x
i =
xi , daca k + 1 i n,

unde [0, 1) este o solutie a ecuatiei


h() = 0, unde h() =

k
X

xi gi +

i=1

i=k+1

O astfel de solutie exista, deoarece


h(0) =
h(1) =

k
X
i=1

xi gi G

k
X

n
X

xi gi +

i=1

n
X
i=1

n
X
i=1

n
X

(2.3.5)

xi gi G.

(2.3.6)

xi gi G = G G = 0,

xi gi

i=k+1

G =

k1
X

xi gi

+ xk gk +

i=1

n
X

i=k+1

xi gi G

xi gi xk gk + xk gk G = G + gk (xk xk ) G

= gk (xk xk ) > 0,

iar h este o functie continua pe intervalul [0, 1].


Conform (2.3.5) si (2.3.6) rezulta ca x
si
i [0, 1], i {1, . . . , n}
n
X
i=1

x
i gi

k
X

xi gi +

i=1

n
X

xi gi = h( ) + G = 0 + G = G,

i=k+1

ie a problemei.
deci vectorul x = (x
1 , . . . , xn ) este o solut
Avem
n
k1
n
X
X
X
xi ci
xi ci
f (x ) f (x ) =
xi ci + xk ck +
i=1

= xk ck +
= xk ck +

n
X

i=k+1
n
X

i=k+1

i=k+1
n
X

xi ci
xi ci

i=1

xi ci

i=k

xk ck

= ck (xk xk ) (1 )

n
X

n
X

xi ci

i=k+1

xi ci

i=k+1

n
X
ck
ci

=
(xk gk xk gk ) (1 )
x gi .
gk
gi i
i=k+1

(2.3.7)

37

TEMA 2. METODA GREEDY


Conform (2.3.3) rezulta ca
ci
ck
, i {k + 1, . . . , n}.
gi
gk

(2.3.8)

Din (2.3.7) si (2.3.8) obtinem ca


"
#
n
X
c
k
(xk gk xk gk ) (1 )
xi gi
f (x ) f (x )
gk
i=k+1
ck
=

gk

xk gk xk gk
"

ck
xk gk
=
gk
=

ck

gk

ck

=
gk

n
X
i=1

xk gk G +
k
X

k1
X

xi gi

i=1

i=1

i=k+1

xi gi

i=k+1

k1
X

xi gi +

n
X

n
X

xi gi +

i=k+1

xi gi

xi gi +

i=1

n
X

n
X

i=k+1

n
X

i=k+1

xi gi

xi gi

xi gi G ,

si conform (2.3.6) rezulta ca


f (x ) f (x )

ck
h( ) = 0,
gk

deci
f (x ) f (x ).

Cum x este solutie optima, rezulta ca si x este solutie optima (si, n plus,
f (x ) = f (x )). Conform (2.3.5) avem
xi = x
i , i {1, . . . , k},
deci relatia (2.3.4) este adevarata pentru k, ceea ce ncheie demonstratia prin
inductie a acestei relatii.
Luand k = n n aceasta relatie rezulta ca exista o solutie optima x =
(x1 , . . . , xn ) pentru care
xi = xi , i {1, . . . , n},
deci x = x si astfel x este o solutie optima a problemei.

38

TEMA 2. METODA GREEDY

Exemplul 2.3.1. Consideram un rucsac n care se poate ncarca o greutatea


mazima G = 40, din n = 10 obiecte ce au greutatile si castigurile date n
urmatorul tabel:
Obiect
Greutate gi
Castig ci

O1
10
27

O2
7
9

O3
10
40

O4
5
20

O5
6
11

O6
10
20

O7
8
50

O8
15
22

O9
3
4

O10
12
33

Ordinea descrescatoare a obiectelor dupa castigul unitar ci /gi este evidentiata


n urmatorul tabel:
Obiect
Castig ci
Greutate gi

O7
50
8

O3
40
10

O4
20
5

O10
33
12

O1
27
10

O6
20
10

O5
11
6

O8
22
15

O9
4
3

O2
9
7

Aplicarea strategiei Greedy (algoritmul de mai sus) conduce la solutia optima


x = (1, 1, 1, 1, 5/10, 0, 0, 0, 0, 0),
adica umplem rucsacul ncarcand, n ordine, obiectele:
O7 , dupa care greutatea disponibila devine R = 40 8 = 32,
O3 , dupa care R = 32 10 = 22,
O4 , dupa care R = 22 5 = 17,
O10 dupa care R = 17 12 = 5,
5/10 din O1 , dupa care R = 5 5 = 0.
Castigul (total) obtinut este
f (x) = 50 + 40 + 20 + 33 +

5
27 = 156,5.
10

Observatia 2.3.1. Algoritmul 2.3.1 are complexitatea O (n log2 n), deoarece


este necesara sortarea obiectelor descrescator dupa castigul unitar iar blocul
while se executa de cel mult n ori (cate o data pentru fiecare obiect) si
necesita de fiecare data o comparatie si 3 operatii aritmetice.
Observatia 2.3.2. In varianta discret
a a problemei rucsacului, fiecare
obiect Oi poate fi ncarcat doar n ntregime. In aceasta varianta, solutia
produs
a de strategia Greedy (de mai sus) nu este neap
arat optim
a!
De eemplu, pentru datele din exemplul anterior, aplicarea strategiei Greedy
conduce la solutia
x = (1, 1, 1, 1, 0, 0, 0, 0, 1, 0),
adica ncarcam n rucsac, n ordine, obiectele:

TEMA 2. METODA GREEDY

39

O7 , dupa care greutatea disponibila devine R = 40 8 = 32,


O3 , dupa care R = 32 10 = 22,
O4 , dupa care R = 22 5 = 17,
O10 dupa care R = 17 12 = 5,
O9 , dupa care R = 5 3 = 2 si nu mai exista niciun obiect care sa mai
ncapa n rucsac, deci ncarcarea se ncheie.
Castigul (total) obtinut este
f (x) = 50 + 40 + 20 + 33 + 4 = 147.
Solutia obtinuta nu este optima, o solutie mai buna fiind
x = (1, 1, 1, 0, 1, 0, 1, 0, 0, 0),
corespunzatoare ncarcarii obiectelor O7 , O3 , O4 , O1 si O5 , avand greutatea
totala 8 + 10 + 5 + 10 + 6 = 39 (deci rucsacul nu este plin) si castigul (total)
f (x ) = 50 + 40 + 20 + 27 + 11 = 148.

2.4

Problema planific
arii spectacolelor

Problema planific
arii spectacolelor este urmatoarea:
Se considera n spectacole S1 , . . . , Sn , n N . Pentru fiecare spectacol Si ,
i {1, . . . , n}, se cunoaste intervalul orar Ii = [ai , bi ] de desfasurare, unde
ai < bi .
O persoana doreste sa vizioneze cat mai multe dintre aceste n spectacole.
Fiecare spectacol trebuie vizionat integral, nu pot fi vizionate simultan mai
multe spectacole, iar timpii necesari deplasarii de la un spectacol la altul sunt
nesemnificativi (egali cu zero).
Se cere sa se selecteze un numar cat mai mare de spectacole ce pot fi
vizionate de o singura persoana, cu respectarea cerintelor de mai sus.
Modelarea problemei
O solutie (solutie posibila ) a problemei este orice submultime P
{I1 , . . . , In } astfel ncat
Ii Ij = , Ii , Ij P, i 6= j
(adica orice submultime de intervale disjuncte doua cte doua).

40

TEMA 2. METODA GREEDY

O solutie optima a problemei este orice solutie P {I1 , . . . , In } astfel


ncat
card (P ) = max{card (P ) | P = solutie a problemei}.
Prezentam n continuare doi algoritmi Greedy pentru rezolvarea problemei.
Algoritmul 2.4.1. Vom utiliza urmatoarea strategie Greedy:
Ordonam spectacolele crescator dupa timpul lor de ncheiere:
b1 b2 bn .

(2.4.1)

Parcurgem spectacolele, n aceasta ordine, si:


selectam primul spectacol;
de fiecare data, spectacolul curent, Si , se selecteaza doar daca
nu se suprapune cu niciunul dintre spectacolele selectate anterior,
adica daca timpul sau de ncepere este mai mare decat timpul de
ncheiere al ultimului spectacol Sj selectat:
ai > bj .
Pentru memorarea solutiei utilizam un vector caracteristic c = (c1 , . . . , cn ),
cu semnificatia
(
1, daca intervalul Ii a fost selectat,
ci =
0, n caz contrar.
Descrierea n pseudocod a algoritmului are urmatoarea forma.
SPECTACOLE1 (a, b, n, c, m) : // a = (a1 , . . . , an ), b = (b1 , . . . , bn )
// c = (c1 , . . . , cn ), m = num
arul de spectacole selectate
SORTARE(a, b, n);
// se sorteaz
a spectacolele cresc
ator
// dup
a timpul lor de
^ncheiere bi
m 0;
// init
ializ
ari
for i = 1, n do c[i] 0;
t a[1] 1;
// t = timpul de ^
ncheiere al ultimului
// spectacol selectat
for i = 1, n do
// parcurgem spectacolele
if a[i] > t then
c[i] 1; // select
am intervalul (spectacolul) curent
m m + 1;
t b[i];
// actualiz
am t
AFISARE(m, c, n);
// se afi
seaz
a num
arul s
i
// submult
imea intervalelor (spectacolelor) selectate

41

TEMA 2. METODA GREEDY

Functia de afisare este


AFISARE (m, c, n) :
afiseaz
a m;
for i = 1, n do
if c[i] = 1 then afiseaz
a [a[i], b[i]];
contextul
Teorema 2.4.1 (de corectitudine a Algoritmului 2.4.1). In
Algoritmului 2.4.1, submultimea intervalelor (spectacolelor) selectate de algoritm este o solutie optima a problemei planificarii spectacolelor.

Demonstratie. Fie P = {I1 , . . . , Im


} submultimea de intervale calculata de
algoritm, unde

I1 = [a1 , b1 ], I2 = [a2 , b2 ], . . . , Im
= [am , bm ]

sunt intervalele selectate, n aceasta ordine, de algoritm.


Evident, m 1 (dupa sortare, primul interval este ntotdeauna selectat).
Din descrierea algoritmului (alegerea intervalului curent Ii ) rezulta ca
ai > bi1 , i {2, . . . , m},
deci
Rezulta ca

a1 < b1 < a2 < b2 < < am < bm .


Ii Ij = , i, j {1, . . . , m}, i 6= j,

deci submultimea P = {I1 , . . . , Im


} a intervalelor selectate de algoritm este
o solutie a problemei. Ramane sa demonstram optimalitatea acestei solutii.
Demonstram prin inductie dupa k {0, 1, . . . , m} ca exista o solutie
optima P = {I1 , . . . , Ip } a problemei, p N , cu

I1 = [a1 , b1 ], I2 = [a2 , b2 ], . . . , Ip = [ap , bp ],

b1 < b2 < < bp ,

(2.4.2)

pentru care
Ii = Ii , i a.. 1 i k.

(2.4.3)

Ii = Ii , i a.. 1 i k 1.

(2.4.4)

Pentru k = 0 afirmatia este evidenta, luand P orice solutie optima a


problemei (si sortand intervalele componente Ii crescator dupa extremitatile
bi ).
Presupunem (2.4.3) adevarata pentru k 1, adica exista o solutie optima

P = {I1 , . . . , Ip } a problemei, ce verifica (2.4.2), pentru care

42

TEMA 2. METODA GREEDY


si o demonstram pentru k (k {1, 2, . . . , m}).
Din optimalitatea solutiei P = {I1 , . . . , Ip } rezulta ca p m, deci
p m k.

Avem doua cazuri.


Cazul 1) Ik = Ik . Atunci Ii = Ii , i {1, . . . , k}, deci (2.4.3) este
adevarata pentru k.
Cazul 2) Ik 6= Ik , adica [ak , bk ] 6= [ak , bk ]. In acest caz, pentru k 2

avem ak > bk1 (deoarece Ik Ik1


= si bk > bk1 ) si bk1 = bk1 (deoarece

Ik1
= Ik1
), deci
ak > bk1 .
Atunci, din descrierea algoritmului, deoarece Ik = [ak , bk ] este primul interval

selectat dupa intervalul Ik1


= [ak1 , bk1 ], rezulta ca
bk bk .

(2.4.5)

Din descrierea algoritmului, aceasta inegalitate este valabila si pentru k = 1,


deoarece I1 = [a1 , b1 ] este primul interval selectat.
Definim submultimea de intervale P = {I1 , . . . , Ip } prin
(
Ii , daca i 6= k,

(2.4.6)
Ii = [a
,
b
]
=
i
i
Ii , daca i = k.
Deoarece P = {I1 , . . . , Ip } este solutie a problemei si verifica (2.4.2), rezulta
ca
a1 < b1 < a2 < b2 < < ak1 < bk1 < ak < bk <
< ak+1 < bk+1 < < ap < bp .

(2.4.7)

Pentru k 2 avem ak > bk1 (din descrierea algoritmului) si bk1 = bk1

(deoarece Ik1
= Ik1
), deci
ak > bk1 .
(2.4.8)
Din (2.4.7), (2.4.8) si (2.4.5) rezulta ca
a1 < b1 < a2 < b2 < < ak1 < bk1 < ak < bk <
< ak+1 < bk+1 < < ap < bp
(inegalitate valabila si pentru k = 1), deci submultimea P = {I1 , . . . , Ip },
definita de (2.4.6), este o solutie a problemei si

b
1 < b2 < < bp .

43

TEMA 2. METODA GREEDY


Cum
card (P ) = p = card (P )
si P este solutie optima, rezulta ca si P este solutie optima.
Conform (2.4.6) si (2.4.4) avem
Ii = Ii , i {1, . . . , k},

deci relatia (2.4.3) este adevarata pentru k, ceea ce ncheie demonstratia prin
inductie a acestei relatii.
Luand k = m n aceasta relatie rezulta ca exista o solutie optima P =
{I1 , . . . , Ip } pentru care
Ii = Ii , i {1, . . . , m}.
Demonstram ca p = m prin reducere la absurd. Intr-adevar, daca p > m

atunci ar exista intervalul Im+1


= [am+1 , bm+1 ] astfel ncat
am+1 > bm = bm
ceea ce ar contrazice faptul ca algoritmul se ncheie cu selectarea intervalului

Im
= [am , bm ].
Astfel p = m, deci

P = {I1 , . . . , Im
} = {I1 , . . . , Ip } = P

si astfel submultimea P este o solutie optima a problemei.


Exemplul 2.4.1. Consideram n = 14 spectacole ce au timpii de ncepere si
de ncheiere dati n urmatorul tabel (n ordinea crescatoare a timpilor de
ncepere ai ):
Spectacol
S1
Timp de ncepere ai 8:00
Timp de ncheiere bi 9:10
Spectacol
S8
Timp de ncepere ai 10:45
Timp de ncheiere bi 12:00

S2
8:10
9:00
S9
11:00
12:30

S3
S4
S5
S6
S7
8:15 8:50 9:10 9:20 9:20
9:00 10:20 10:40 10:30 11:00
S10
S11
S12
S13
S14
12:00 12:10 12:30 13:00 13:40
13:30 14:00 13:50 14:30 15:00

Ordonarea spectacolele crescator dupa timpul lor de ncheiere bi este


evidentiata n urmatorul tabel:

44

TEMA 2. METODA GREEDY


Spectacol
S2
Timp de ncepere ai 8:10
Timp de ncheiere bi 9:00
Spectacol
S8
Timp de ncepere ai 10:45
Timp de ncheiere bi 12:00

S3
8:15
9:00
S9
11:00
12:30

S1
S4
S6
S5
S7
8:00 8:50 9:20 9:10 9:20
9:10 10:20 10:30 10:40 11:00
S10
S12
S11
S13
S14
12:00 12:30 12:10 13:00 13:40
13:30 13:50 14:00 14:30 15:00

Aplicarea strategiei Greedy din algoritmul de mai sus conduce la solutia


optima data de selectarea (vizionarea), n ordine, a spectacolelor:
S2 (primul, n ordinea impusa),
S6 (primul situat dupa S2 si care are timpul de ncepere mai mare decat
timpul de ncheiere al lui S2 ),
S8 (primul situat dupa S6 si care are timpul de ncepere mai mare decat
timpul de ncheiere al lui S6 ),
S12 (primul situat dupa S8 si care are timpul de ncepere mai mare
decat timpul de ncheiere al lui S8 ), dupa care nu mai urmeaza niciun
spectacol care sa nceapa dupa ncheierea lui S12 , deci selectarea se
termina.
Numarul maxim de spectacole ce pot fi vizionate este deci egal cu 4.
Observatia 2.4.1. Algoritmul 2.4.1 are complexitatea O (n log2 n), deoarece
este necesara sortarea spectacolelor crescator dupa timpul lor de ncheiere,
iar blocul for prin care se parcurg spectacolele se executa de n ori (cate
o data pentru fiecare spectacol) si necesita de fiecare data o comparatie, cel
mult o adunare si cel mult 3 operatii de atribuire.
Algoritmul 2.4.2. O alta rezolvare a problemei spectacolelor se obtine prin
utilizarea urmatoarei strategie Greedy, similara cu cea de mai sus.
Ordonam spectacolele descrescator dupa timpul lor de ncepere:
a1 a2 an .
Parcurgem spectacolele, n aceasta ordine, si:
selectam primul spectacol;
de fiecare data, spectacolul curent, Si , se selecteaza doar daca
nu se suprapune cu niciunul dintre spectacolele selectate anterior,
adica daca timpul sau de ncheiere este mai mic decat timpul de
ncepere al ultimului spectacol Sj selectat:
bi < aj .

TEMA 2. METODA GREEDY

45

Pentru memorarea solutiei se utilizeaza din nou un vector caracteristic


c = (c1 , . . . , cn ), cu aceeasi semnificatie ca n algoritmul de mai sus.
Descrierea n pseudocod a noului algoritm are urmatoarea forma.
SPECTACOLE2 (a, b, n, c, m) : // a = (a1 , . . . , an ), b = (b1 , . . . , bn )
// c = (c1 , . . . , cn ), m = num
arul de spectacole selectate
SORTARE(a, b, n);
// se sorteaz
a spectacolele cresc
ator
// dup
a timpul lor de
^ncepere ai
m 0;
// init
ializ
ari
for i = 1, n do c[i] 0;
t b[n] + 1;
// t = timpul de ^
ncepere al ultimului
// spectacol selectat
for i = n, 1, 1 do
// parcurgem spectacolele
^n ordinea
// descresc
atoare a timpilor de
^ncepere
if b[i] < t then
c[i] 1; // select
am intervalul (spectacolul) curent
m m + 1;
t a[i];
// actualiz
am t
AFISARE(m, c, n);
// se afi
seaz
a num
arul s
i
// submult
imea intervalelor (spectacolelor) selectate
Functia de afisare este aceeasi ca n Algoritmul 2.4.1.
Observatia 2.4.2. Demonstratia corectitudinii si evaluarea complexitatii Algoritmului 2.4.2 sunt analoage cu cele ale Algoritmul 2.4.1.
Exemplul 2.4.2. Pentru spectacolele din Exemplul 2.4.1, ordonate crescator
dupa timpii lor de ncepere ai n primul tabel, aplicarea strategiei Greedy
din Algoritmul 2.4.2 conduce la solutia optima data de urmatoarea selectare
(vizionare n ordine inversa) a spectacolelor:
S14 (ultimul, n ordinea crescatoare a timpilor de ncepere),
S10 (ultimul situat nainte de S14 si care are timpul de ncheiere mai
mic decat timpul de ncepere al lui S14 ),
S7 (ultimul situat nainte de S10 si care are timpul de ncheiere mai mic
decat timpul de ncepere al lui S10 ),
S3 (ultimul situat nainte de S7 si care are timpul de ncheiere mai mic
decat timpul de ncepere al lui S7 ), nainte de care nu mai avem niciun
spectacol care sa se ncheie nainte de nceperea lui S3 , deci selectarea
se termina.
Numarul maxim de spectacole ce pot fi vizionate este egal, din nou, cu 4.

Tema 3
Metoda Backtracking

46

Tema 4
Metoda Divide et Impera

47

Tema 5
Metoda program
arii dinamice

48

Tema 6
Metoda Branch and Bound

49

Tema 7
Algoritmi euristici

50

S-ar putea să vă placă și