Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
AU
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
47
5 Metoda program
arii dinamice
48
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
}
|
(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) =
f (n)
= 1.
n g(n)
lim
Figura 1.1.1:
Figura 1.1.2:
Figura 1.1.3:
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 )
11
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
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;
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:
13
1
Figura 1.2.2:
5
Figura 1.2.3:
14
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++)
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
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).
17
18
19
4
Figura 1.2.4:
Figura 1.2.5:
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
21
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
bB\{b0 }
24
2.2
2.2.1
// adev
arat
// fals
i=1
i=1
n
X
i=1
ai bp(i) .
Fie
M = max s(p).
pSn
(2.2.2)
(2.2.3)
25
s(p ) s(p) =
n
X
i=1
ai bp (i)
n
X
i=1
ai bp(i)
(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)
i=1
a1 a2 . . . an si bn bn1 . . . b1
26
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) .
a) maxima;
b) minima.
n
X
i=1
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
// 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
28
n
X
i=1
ai bi .
29
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
n
X
i=1
ai bi .
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
31
k
X
Lp(i) ,
i=1
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
pSn
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
32
n1
1
n
<
< <
n
n
n
2.3
33
n
X
xi ci .
i=1
gi G.
(2.3.1)
xi gi = G
(2.3.2)
i=1
i=1
i=1
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
34
.
g1
g2
gn
(2.3.3)
// se afi
seaz
a c^
as
tigul total maxim C
//
si solut
ia optim
a x = (x1 , . . . , xn )
35
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
(2.3.4)
xi gi = G,
xi gi + xk gk
xi gi + xk gk =
i=1
i=1
i=1
n
X
i=1
xi ci =
n1
X
xi ci + xn cn >
i=1
n1
X
i=1
xi ci + xn cn = f (x ),
36
Definim vectorul x = (x
1 , . . . , xn ) prin
(
xi , daca 1 i k,
x
i =
xi , daca k + 1 i n,
k
X
xi gi +
i=1
i=k+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,
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
(2.3.8)
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 ,
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
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
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
5
27 = 156,5.
10
39
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
(2.4.1)
41
I1 = [a1 , b1 ], I2 = [a2 , b2 ], . . . , Im
= [am , bm ]
(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)
42
Ik1
= Ik1
), deci
ak > bk1 .
Atunci, din descrierea algoritmului, deoarece Ik = [ak , bk ] este primul interval
(2.4.5)
(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)
(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
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
Im
= [am , bm ].
Astfel p = m, deci
P = {I1 , . . . , Im
} = {I1 , . . . , Ip } = P
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
44
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
45
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