Sei sulla pagina 1di 73

CZU 004.41 (075.

3)
G 80
Aprobat de Colegiul Ministerului nvmntului al Republicii Moldova (Decizia tir. 6.4/5 din 5
februarie 2002).
Redactor: Vasile Bahnaru Corectori: Mariana Belenciuc, Elena Pistrui Redactor tehnic: Nina
Duduciuc Machetare computerizat: Anatol Andrichi Copert: Vitalie Pogola
Manualul include noiunile de baz din teoria algoritmilor, metodele de estimare a necesarului de
memorie i a timpului cerut de algoritmi. Snt prezentate tehnicile de programare utilizate frecvent n
informatica modern: recursivitatea, tehnica Greedy, metoda relurii, programarea dinamic, metoda
desparte i stpnete, aplicaiile metodei ramific i mrginete. Programele PASCAL incluse n
manual pot fi copiate de pe pagina Web www.cnti.moldnet.md sau www.minedu.moldnet.md.

ntreprinderea Editorial-Poligrafic tiina, str. Academiei, nr. 3;


MD-2028, Chiinu, Republica Moldova; tel.: (3732) 73-96-16, fax: (3732) 73-96-27;
e-mail: prini@stiinta.asm.md
Difuzare: Societatea de Distribuie a Crii PRO-NOI
Republica Moldova: str. Alba-Iulia, nr. 23/1; MD-2051, Chiinu;
tel.: 51-68-17, 51-57-49; e-mail: pronoi@moldtelecom.md;
www.pronoi.md
Romnia: str. Ing. Pndele ruanu, nr. 13; Sector 1; Bucureti;
tel.: (021) 222-69-35; tel./fax: (021) 222-69-38
Toate drepturile asupra acestei ediii aparin ntreprinderii Editorial-Poligrafice tiina.
Descrierea CIP a Camerei Naionale a Crii
Gremalschi, Anatol
Informatica. Tehnici de programare: Manual pentru clasa a Xl-a / Anatol Gremalschi; Min. Educaiei al
Rep. Moldova - Ch.: tiina, 2003 (Editura Universul). - 100 p.

ISBN 9975-67-309-0 004.41 (075.3)

Anatol Gremalschi, 2003


ISBN 9975-67-309-0

.E.P. tiina, 2003


0|Pagin

Introducere
Manualul este elaborat n conformitate cu Curriculumul disciplinar de informatica i are drept scop
nsuirea de ctre elevi a cunotinelor necesare pentru formarea culturii informaionale i dezvoltarea
gndirii algoritmice. Lucrarea include aptesprezece teme n care se studiaz cele mai rspndite tehnici
de programare: trierea, reluarea, tehnica Greedy, metoda desparte i stp-nete, programarea dinamic,
metoda ramific i mrginete, algoritmii euristici. In manual snt expuse unele metode de estimare a
necesarului de memorie i a timpului cerut de algoritmi, ct i unele recomandri ce vizeaz utilizarea
recursiei i iterativitii. Modul de expunere a materialului este similar celui din manualele de informatic
pentru clasele precedente. Mai nti, se prezint noiunile de baz ale tehnrmate de modul de organizare a
datelor, descrierea algoritmilor, elaborarea i depanarea programelor PASCAL. O atenie deosebit se acord
metodelor de implementare a tehnicilor de programare, interdependenei dintre performanele calculatorului i complexitatea problemelor ce pot fi rezolvate cu ajutorul mijloacelor respective.
Obiectivele de referin ale Curriculumului disciplinar de informatic snt realizate prin selectarea
riguroas i includerea n manual a unor cunotine strict necesare din urmtoarele domenii:
- complexitatea algoritmilor; 2. metodele de elaborare a algoritmilor; 3. algoritmii euristici.
Implementarea tehnicilor de programare este ilustrat cu ajutorul mai multor probleme frecvent
ntlnite n viaa cotidian i studiate n cadrul disciplinelor colare din ciclul liceal. Totodat, n manual
au fost incluse i unele probleme rezolvarea crora este practic imposibil fr aplicarea calculatorului.
Expunerea teoretic a fiecrei teme este urmat de exerciii i ntrebri de autoevaluare care vor ajuta
elevii s-i consolideze cunotinele i s-i dezvolte gndirea algoritmic.
Fiind strns legate cu cunotinele din alte domenii, temele din manual snt axate pe metodele de
rezolvare a problemelor ce necesit un volum foarte mare de calcul, evideniindu-se rolul esenial al
conceptelor matematice n procesul de apariie i dezvoltare a informaticii. Exemplele, exerciiile i
sarcinile individuale din manual vor contribui la perceperea adecvat a rolului i locului calculatorului, a
influenei lui asupra dezvoltrii matematicii, fizicii, chimiei, tiinelor socioumane. Pentru majoritatea
temelor din manual au fost elaborate programe destinate instruirii asistate de calculator, fapt ce permite
individualizarea procesului de predare-nv-are, organizarea leciilor practice i dezvoltarea capacitilor
creative ale elevilor.
n ansamblu, materialul inclus n manualul de informatic pentru clasa a Xl-a va contribui la
obinerea urmtoarelor competene:
- analiza structural a problemei;
- divizarea problemelor complexe n probleme mai simple i reducerea lor la cele deja rezolvate;
- estimarea complexitii algoritmilor destinai soluionrii problemelor propuse;
- utilizarea metodelor formale pentru elaborarea algoritmilor i scrierea programelor respective.
Evident, aceste caliti snt strict necesare nu numai viitorilor informaticieni, dar i fiecrui om cult
care, la sigur, va tri i va lucra ntr-un mediu bazat pe cele mai moderne tehnologii informaionale.

1|Pagin

Capitolul 1
ANALIZA ALGORITMILOR
1.1. Complexitatea algoritmilor
Valoarea practic a programelor PASCAL depinde n mod decisiv de complexitatea algoritmilor ce
stau la baza lor. Amintim c algoritmul reprezint o succesiune finit de operaii (instruciuni, comenzi)
cunoscute, care fiind executate intr-o ordine bine stabilit, furnizeaz soluia unei probleme.
E cunoscut faptul c unul i acelai algoritm poate fi descris prin diverse metode: scheme logice,
formule matematice, texte scrise ntr-un limbaj de comunicare ntre oameni, cu ajutorul limbajelor de
programare. Evident, i n acest manual algoritmii pe care i vom studia vor fi descrii cu ajutorul
mijloacelor oferite de limbajul PASCAL: instruciuni, funcii, proceduri i programe ce pot fi derulate
pe calculator.
Complexitatea algoritmului se caracterizeaz prin necesarul de memorie i durata de execuie.
Metodele de estimare a acestor indicatori se studiaz ntr-un compartiment special al informaticii,
denumit analiza algoritmilor. In cadrul acestui compartiment se utilizeaz urmtoarele notaii:
n - un numr natural ce caracterizeaz mrimea datelor de intrare ale unui algoritm. In majoritatea
cazurilor n reprezint numrul de elemente ale unei mulimi, gradul unei ecuaii, numrul de
componente ale unui tablou .a.;
V(n) - volumul de memorie intern necesar pentru pstrarea datelor cu care opereaz algoritmul;
T(n) - timpul necesar executrii algoritmului. De regul, n acest timp nu se include durata
operaiilor de introducere a datelor iniiale i de extragere a rezultatelor.
Evident, volumul de memorie V(n) i timpul de execuie T(n) depind, n primul rnd, de
caracteristica n a datelor de intrare, fapt accentuat i prin folosirea notaiilor ce reprezint funcii de
argumentul n.
Aplicarea practic a unui algoritm este posibil numai atunci cnd necesarul de memorie i timpul
cerut nu ncalc restriciile impuse de mediul de programare i capacitatea de prelucrare a calculatorului
utilizat.
De exemplu, presupunem c pentru rezolvarea unei probleme exist doi algoritmi diferii, notai prin A1
i A2. Necesarul de memorie i timpul cerut de algoritmul A1 este:
V1(n) = 100n2 + 4;
T2(n) = n3 *10-3 ,
iar cel cerut de algoritmul A2.
V2(n) = 10n + 12;
T2(n) = 2 n - 10 - 6 .
n aceste formule volumul de memorie se calculeaz n octei, iar timpul n secunde. Necesarul de
memorie i timpul cerut de algoritmii A 1 , A 2 pentru diferite valori ale lui n este prezentat n tabelul 1.

2|Pagin

Tabelul 1 Complexitatea algoritmilor A1 i A2


n
V1(n)

10
9,77 Kocteti

20
39,06 Kocteti

30
87,89 Kocteti

40
156,25 Kocteti

50
244,14 Kocteti

V2(n)

112 octei

212 octei

312 octei

412 octei

512 octei

T1(n)

1 secund

8 secunde

9 secunde

16 secunde

25 secunde

T2(n)

0,001 secunde

1,05 secunde

18 secunde

13 zile

36 ani

Din tabelul 1 se observ c algoritmul A2 devine practic inutilizabil pentru datele de intrare
caracteristic crora n > 30. Pentru astfel de date timpul de execuie a algoritmului A1 este mult mai mic,
ns necesarul de memorie V1(n) poate depi limita impus de mediul de programare (64 Kocteti pentru
variabilele statice din programele Turbo PASCAL 7.0).
Determinarea necesarului de memorie V(n) i a timpului de execuie T(n) prezint un interes
deosebit la etapa de elaborare a algoritmilor i a programelor respective. Evident, anume pe parcursul
acestei etape pot fi eliminai din start acei algoritmi, care necesit memorii prea mari sau care au un timp
de execuie inacceptabil.
Menionm c existena unor calculatoare cu memorii din ce n ce mai performante fac ca atenia
informaticienilor s fie ndreptat n special asupra necesarului de timp sau, cu alte cuvinte, asupra
complexitii temporale a algoritmilor.

ntrebri i exerciii
- Explicai termenul complexitatea algoritmului. Numii indicatorii ce caracterizeaz complexitatea
algoritmilor.
- Cum credei, care factori influeneaz complexitatea unui algoritm?
- De ce depinde necesarul de memorie i timpul cerut de un algoritm? Cnd este posibil aplicarea practic a
unui algoritm?
- Algoritmii A1 iA2 (vezi tabelul 1) vor derula n mediul de programare Turbo PASCAL 7.0. Cum credei,
care algoritm trebuie utilizat n cazul datelor de intrare cu caracteristica: a) n = =10; b) n = 20; c) n = 30?
Pentru care valori ale lui n algoritmul A1 poate fi utilizat n mediul de programare Turbo PASCAL 7.0?
- Complexitatea unui algoritm, notat prin A3, se caracterizeaz prin V3(n) = 600n3+ 18; T3(n) = 3 n - 10-2.
Cum credei, pentru care valori ale lui n algoritmul A3 poate derula n mediul de programare Turbo
PASCAL 7.0?
-

Determinai mrimea datelor de intrare a celor mai reprezentativi algoritmi elaborai de Dvs. n procesul

studierii limbajului de programare PASCAL.


1.2. Estimarea necesarului de memorie
Evaluarea necesarului de memorie V(n) poate fi fcut calculnd numrul variabilelor ne
structurate - integer, real, boolean, char, enumerare, subdomeniu, referin-utilizate n algoritmul supus
analizei. Numrul de octei alocai unei variabile depinde de implementarea limbajului. n mediul de
programare Turbo PASCAL 7.0 memoria se aloc conform tabelului 2.
3|Pagin

Tabelul 2. Alocarea memoriei interne n Turbo PASCAL 7.0


Tipul variabilei
Numrul de octei
integer
2
real
6
boolean
1
char
1
enumerare
1
subdomeniu
conform tipului de baz
referin
4
pointer
4
n cazul tipurilor structurate de date volumul de memorie necesar unei variabile se calculeaz
nsumnd numrul de octei alocai pentru fiecare component.
De exemplu, necesarul de memorie pentru variabilele A, B, p i s din declaraiile
var

este:

A
B
p
s

: array[l..n, l..n] of real;


: array[l..n] of integer;
: boolean;
: string[10];

V(n) = 6n2 + 2n + 11 (octei).


n general, necesarul de memorie al unui program PASCAL depinde nu numai de tipul variabilelor

utilizate, dar i de modul de gestionare a memoriei interne a calculatorului, n procesul derulrii unui
program PASCAL, spaiul de memorie intern este divizat n trei seciuni (fig. 1):
- segmentul date, destinat alocrii variabilelor globale. Aceste variabile se declar n seciunea
var a programului PASCAL;
- stiva, destinat alocrii parametrilor actuali, variabilelor locale, valorilor returnate de funcii i a
adreselor de revenire pe durata execuiei subprogramelor PASCAL. Apelul unui subprogram implic
depunerea datelor respective n stiv, iar ieirea din subprogram - eliminarea lor. Accentum c n cazul
parametrului variabil n stiv se depune numai adresa variabilei din programul apelant, iar n cazul
parametrului valoare n stiv va fi depus o copie a datelor din lista parametrilor actuali.
- heap-ul, utilizat pentru alocarea variabilelor dinamice. Aceste variabile snt create i eventual
distruse cu ajutorul procedurilor new i dispose.

Fig. 1. Gestionarea memoriei interne


4|Pagin

Prin urmare, estimarea necesarului de memorie presupune evaluarea urmtoarelor caracteristici ale
unui program (fig. 1):
Vd(n) - volumul de memorie ocupat de variabilele globale n Segmentul date;
Vs(n) - volumul de memorie ocupat de parametrii actuali i de variabilele locale n stiv;
Vh(n) - volumul de memorie ocupat de variabilele dinamice n heap.
De obicei, n mediul de programare Turbo PASCAL 7.0 se cere ca Vd(n) 64 Koctei, V/n) 16
Koctei i Vh(n) 256 Koctei. Dimensiunile stivei i ale heap-ului pot fi modificate cu ajutorul
directivelor de compilare sau a comenzilor mediului de programare.
Exemplu:
Program P145;
{ Gestionarea memoriei interne }
const n = 100;
type Matrice = array[l..n, l..n] of real;
Vector = array[l..n] of real;
var A : Matrice;
i : integer;
p, q : ^Matrice
procedure Prelucrare(var B:Matrice);
var C : Vector;
begin
{...prelucrarea elementelor matricei B...}
end; { Prelucrare }
begin
{introducerea mtricei A }
Prelucrare(A);
new(p); new(q);
{...prelucrarea variabilelor dinamice p^ i q^...}
dispose(p);
dispose(q);
{...afiarea rezultatelor. . . }
writeln('Sfrit');
readln;
end.
Variabilele globale A, i, p i q din programul P145 vor fi depuse n segmentul date (fig.
2). Necesarul de memorie pentru aceste variabile:
Vn(n) = 6n2 + 2 + 2 * 4 = 6n2 +10.
Execuia instruciunii apel de procedur Pr(A) implic depunerea n stiv a adresei matricei A, a
adresei de revenire n programul principal i a variabilei locale C. Necesarul de memorie pentru aceste
date:
Vs(n) = 6n + 8.
Dup ieirea din procedur, datele respective vor fi eliminate din stiv. Instruciunile new(p) i
new(q) creeaz n heap variabilele dinamice p^ i q^ de tipul Matrice. Necesarul de memorie
pentru aceste variabile:
Vh(n) = 6n2 + 6n2 = 12n2.
Dup execuia instruciunilor dispose(p) i dispose(q) variabilele dinamice din heap snt
distruse, iar spaiul respectiv de memorie devine liber.

5|Pagin

Fig. 2. Gestionarea memoriei n programul P145


ntrebri i exerciii
- Determinai cu ajutorul sistemului de asisten a mediului de programare cu care lucrai Dvs.
necesarul de memorie pentru variabilele nestructurate.
- Cum se evalueaz volumul de memorie intern necesar pentru nmagazinarea datelor unui
algoritm?
- Explicai cum se gestioneaz memoria intern n cazul unui program PASCAL.
- Determinai cu ajutorul sistemului de asisten dimensiunile segmentului date, ale stivei i ale
heap-ului. Cum pot fi modificate dimensiunile stivei i ale heap-ului?
- Calculai necesarul de memorie pentru variabilele din urmtoarele declaraii:
a) var
A : array[l..n, l..n] of integer;
B : string;
C : array [l..n, l..n, l..n] of boolean;
b) type Vector = array[l..n] of real;
Matrice = array[l..n] of Vector;
var A, B, C : Matrice;
D : Vector;
c) type Elev = record
Nume: string;
Prenume : string;
NotaMedie : real;
end;
ListaElevi = array[l..n] of Elev;
var A, B, C : ListaElevi;
d) type Angajat = record
NumePrenume : string;
ZileLucrate : 1..31;
PlataPeZi : real;
PlataPeLuna : real;
end;
ListaDePlata = array[l..n] of Angajat;
var LI, L2 : ListaDePlata;

6|Pagin

e) type Elev = record


Nume : string;
Prenume : string;
NotaMedie : real;
end;
FisierElevi = file of Elev;
var FE : FisierElevi;
E : Elev;
str : string;
i, n : integer;
- Evaluai necesarul de memorie pentru programul ce urmeaz. Compilai acest program pentru
valorile 50, 60, 70, 80 i 100 ale constantei n. Explicai mesajele afiate la ecran.
Program P146;
{ Dimensiunile segmentului date }
const n = 50;
type Matrice = array[l..n, l..n] of real;
var A, B : Matrice;
begin
{ introducerea datelor. . . }
{ prelucrarea matricelor A i B.. .}
writeln('Sfrit');
readln;
end.
- Se consider urmtorul program:
Program P147;
{ Dimensiunile stivei }
var n : integer;
function S(n:integer):real;
begin
if n=0
then S:=0
else S:=S(n-l)+n;
end; { S }
begin
write( 'n=');
readln(n);
writeln('s=',
readln;
end.

S(n));

n acest program suma


S(n) = 0+1+2 + ... + n
este calculat cu ajutorul funciei recursive:
=

0,
= 0;
1 + ,
> 0.

Estimai necesarul de memorie al programului P147. Determinai valoarea maximal a lui n


pentru care programul P147 deruleaz fr erori.
- Determinai necesarul de memorie al programului ce urmeaz. Pentru care valori ale lui n
programul va derula fr erori?

7|Pagin

Program P148;
{ Dimensiunile heap-ului }
type Vector = array[1..100] of real;
var p : ^Vector;
i, n : integer;
begin
write('n=');readln(n); for i:=l to n do new(p);
writeln('Sfrit');readln;
end.
1.3. Msurarea timpului de execuie
n cazul programelor deja elaborate timpul T(n) cerut de un algoritm poate fi aflat prin msurri
directe. Vom folosi n acest scop unitatea de program U7:
Unit U7;
{ Msurarea timpului }
interface
function TimpulCurent : real;
implementation
uses Dos;
var ore : word;
minute : word;
secunde : word;
sutimi : word;
function TimpulCurent;
begin
GetTime(ore,minute,secunde,sutimi);
TimpulCurent:=3600.0*ore+60.0*minute+1.0*secunde+0.01*sutimi;
end; { TimpulCurent }
end.
Unitatea de program U7 ofer programatorului funcia TimpulCurent, care returneaz o
valoare de tip real - timpul n secunde. Indicaiile ceasului de sistem n ore, minute, secunde i sutimi de
secund se citesc cu ajutorul procedurii GetTime din unitatea de program DOS a mediului de
programare Turbo PASCAL 7.0.
Pentru exemplificare prezentm programul P149 n care se msoar timpul de execuie a
procedurii Sortare:
Program P149;
{ Timpul de execuie a procedurii Sortare }
uses U7;
type Vector = array[1..10000] of real;
var A : Vector;
i, n : integer;
TI, T2 : real;
{ timpul in secunde }
procedure Sortare(var A:Vector; n:integer);
{ Sortarea elementelor vectorului A }
var i, j : integer;
r : real;
begin
for i:=l to n do
for j:=1 to n-1 do
if A[j]>A[j+l] then
begin
r:=A[j];
.
8|Pagin

A[j]:=A[j+l];
A[j+1]:=r;
end;
end; { Sortare }
begin
write('Dai numrul
de elemente n=');
readln(n);
{ atribuim lui A valoarea (n, n-1, ..., 3, 2, 1)
for i:=l to n do A[i]:=n-i+l;
Ti:=TimpulCurent;
Sortare(A, n);
T2:=TimpulCurent;
writeln{'Durata de execuie', (T2-T1):7:2, 'secunde');
readln;
end.
Procedura Sortare ordoneaz elementele vectorului A prin metoda bulelor. n aceast metod
vectorul A este parcurs de n ori, la fiecare parcurgere efectundu-se n-l comparri ale elementelor vecine
A[j] i A[j+1]. Daca A[j]>A[j+1], elementele vecine i schimb locul.
Pentru a evita introducerea de la tastatur a unui numr mare de date, n programul P149
vectorului A i se atribuie valoarea iniial:
A = (n,n-1,n-2,...,3,2, 1).
De exemplu, pentru w=4, vectorul iniial va fi:
A=(4, 3, 2, 1).

n procesul sortrii avem:


i=l, A = (3,2, 1,4);
i = 2, A = (2, 1,3, 4);
i = 3, A=0,2,3,4);
i = 4, A = 0,2,3,4).

Timpul de execuie a procedurii Sortare n cazul unui calculator Pen Hum cu frecvena ceasului de
sistem 500 MHz este prezentat n tabelul 3, iar graficul respectiv - n figura 3.

n
T(n), s

1000
0,27

2000
1,10

3000
2,47

4000
4,50

Tabelul 3. Timpul de execuie a procedurii Sortare


5000
6000
7000
8000
9000
10000
7,03
10,16
13,84
18,02
22,85
28,18

Fig. 3. Timpul de execuie a procedurii Sortare


9|Pagin

ntrebri i exerciii
1. Cum credei, ce legtur exist ntre timpul necesar execuiei unui program PASCAL, frecvena
ceasului de sistem i capacitatea de prelucrare a calculatorului?
2. Msurai timpul de execuie a procedurii Sortare (vezi programul P149) n cazul calculatorului
cu care lucrai Dvs. Construii un grafic similar celui din figura 3.
3. Reprezentai grafic pe un singur desen timpul de execuie a procedurilor ce urmeaz.
procedure N2(n:integer);
var i, j, k: integer;
r: real;
begin
for i:=l to n do
for j:=1 to n do
for k:=l to 300 do
r:=1.0;
end; {N2}
procedure N3(n:integer);
var i, j, k : integer;
r:real;
begin
for i:=l to n do
for j:=1 to n do
for k:=l to n do
r:=1.0;
end; {N3}
procedure N3(n:integer);
var i, j, k, m : integer;
r : real;
begin
for i:=l to n do
for j:=1 to n do
for k:=l to n do
for m:=l to n do
r:=1.0;
end; {N4}
Pentru exemplificarea, n figura 4 sunt preyentate graficele respective n cazul unui calculator
Pentium, frecvena ceasului de sistem 500 MHz.

Fig. 4. Timpul de execuie a procedurilor N2, N3 i N4


10 | P a g i n

4. Care este precizia de msurare a timpului cu ajuto rul funciei TimpulCurent? Argumentai
rspunsul Dvs.
1.4. Estimarea timpului cerut de algoritm
n procesul implementrii practice a oricrui algoritm apare necesitatea estimrii timpului de
execuie T(n) pn la testarea i depanarea definitiv a programului ce-1 realizeaz. Cu regret, prin
metode teoretice este foarte greu de determinat o expresie exact pentru T(n). Din aceste motive se caut
o limit superioar a timpului cerut de algoritm, analizndu-se doar cazurile cele mai defavorabile.
Presupunem, n scopuri didactice, c execuia oricrui operator PASCAL (+, -, or, *, /, div,
and, <, <=, not etc.) necesit cel mult A uniti de timp. Acelai timp A este necesar pentru indexarea
componentelor unui tablou [ ], pentru atribuirea := i instruciunea goto. Valoarea concret a mrimii
A depinde de mediul de programare, capacitatea de prelucrare a calculatorului utilizat i este de ordinul
10-9... 10-7 secunde. n continuare vom estima timpul T(n) n forma:
T(n) = Q(n) * ,
unde Q(n) este numrul de operaii elementare - adunarea, scderea, nmulirea, compararea etc. necesare pentru soluionarea unei probleme.
Admitem c ntr-o expresie E apar m operatori PASCAL i k apeluri ale funciei F. Evident,
numrul QE de operaii elementare necesare pentru calcularea expresiei E se determin ca
QE = m + kQF,
unde QF este numrul de operaii elementare necesare pentru calcularea funciei F.
Exemple:
Expresia E
a*b+c
(a<b) or (c>d)
sin(x)+cos(y)
a+M[i]
sin(x+y)+sin(x-y)

Numrul de oparaii elementare QE


2
3
1+Qsin + Qcos
2
3+2Qsin

Numrul de operaii elementare Q1, necesare pentru execuia unei instruciuni I a limbajului
PASCAL se estimeaz conform formulelor din tabelul 4.
Tabelul 4. Numrul de operaii elementare necesare pentru execuia unei instruciuni PASCAL
Nr.
crt.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

Instruciunea PASCAL
Atribuirea v : = E
Apelul procedurii P
Selecie
if E then I1, else I2
Selecie multipl
case E of I1; I2; ; Ik end
Ciclu cu contor
for v:=E1 to/downto E2 do I
Ciclu cu test initial
while E do I
Ciclu cu test final
repeat I until E
Instruciunea compus
begin I1; I2;...; Ik end
Instruciunea
with v do I
Saltul goto

Numrul de operaii elementare


QE+1
QE+1
QE + max{ Q1, Q2}+l
QE + max.{Q1Q2,...,Qk}+k+l
QEl + QE!+mQI+ m+l
(m+l)QE + mQ, + l
m QI + mQE + 1
Q1, + Q2+- + Qk+1
QE+1
1

Formulele din tabelul 4 pot fi deduse urmnd modul de execuie a fiecrei instruciuni PASCAL.
11 | P a g i n

n acest tabel v reprezint o variabil sau un nume de funcie, E-o expresie, iar I- o instruciune.
Numrul de execuii pentru instruciunile I din cadrul unui ciclu for, while sau repeat este notat prin m.
Menionm c ciclurile unui program PASCAL pot fi organizate i cu ajutorul instruciunilor if i goto,
ns o astfel de utilizare a acestor instruciuni contravine regulilor programrii structurate.
Pentru exemplificare vom estima numrul de operaii elementare Q(n) necesare ordonrii
elementelor unui vector prin metoda bulelor:
procedure Sortare(var A:Vector; n:integer);
var i, j : integer;
r : real;
{1} begin
{2} for i:=1 to n do
{3}
for j:=l to n-1 do
{4}
if A[j]>A[j+l] then
{5}
begin
{6}
r:=A[j];
{7}
A[jl:=A[j+l];
{8}
Afj+l]:=r;
end;
end; {Sortare}
Instruciunile I1, I2, ... , I8 ale procedurii Sortare vor fi referite cu ajutorul comentariilor {1},
{2},..., {8} din partea stng a liniilor de program. Prin Qj vom nota numrul de operaii elementare
necesare pentru executarea instruciunii Ij:
Q6 = 2;
Q7 = 4;
Q8 = 3;
Q5 = Q6 + Q7 + Q8 + 1 = 10;
Q4 = 4 + Q5 + 1 = 15;
Q3 = 0 + 1 + (n-1)Q4 + (n-1) + 1 = 16n - 14;
Q2 = 0 + 0 + nQ3 +n+ 1 = 16n2-13n+1;
Q1 = Q2 + 1 = 16n2 13n + 2;
Prin urmare, numrul de operaii elementare:
Q(n) = 16n2-13n + 2,
iar timpul cerut de procedura Sortare
T(n)=( 16n2-13n + 2) .
Din exemplul studiat mai sus se observ c ordinea parcurgerii instruciunilor este impus de
structura programelor PASCAL. Evident, mai nti se analizeaz instruciunile simple, iar apoi cele
structurate. In cazul instruciunilor imbricate, mai nti se analizeaz instruciunile din interior, apoi cele
care le cuprind.
Expresiile analitice T(n) obinute n rezultatul analizei programelor PASCAL pot fi folosite pentru
determinarea experimental a timpului necesar efecturii unei operaii elementare. De exemplu,
pentru procedura Sortare (vezi tabelul 3) n = 10000 i T(n) = 28,18 s. Din ecuaia
(16n2 13n + 2) = 28,18
obinem 1,8 * 10-8 secunde. Evident, aceast valoare este valabil numai pentru mediul de
programare Turbo PASCAL 7.0 i calculatorul Pentium cu frecvena ceasului de sistem 500 MHz,
utilizate n procesul de msurare a timpului de execuie a procedurii Sortare. De exemplu, n cazul
unui calculator Pentium cu frecvena ceasului de sistem 150 MHz se obine valoarea 6,0 * 10-8
secunde.
ntrebri i exerciii
1. Determinai cu ajutorul programului P149 valoarea A pentru mediul de programare i
calculatorul cu care lucrai Dvs.
2. Determinai numrul de operaii elementare Q1, necesare pentru execuia urmtoarelor
instruciuni PASCAL:
12 | P a g i n

a) x:=2*a-6*(y+z);
b) p:=not(a=b) and(c>d);
c) p:=(a in R)and(b in P);
d) if a>b then x:=0 else x:=a+b;
e) case i of 1: x:=0;
2: x:=a+b;
3: x:=a+b+c;
end;
f) for i:=l to n do A[i]:=2*A[i];
g) for i:=l to n do A[i]:=B[i+1]-C[i-2];
h) i:=0; while i<n do begin i:=i+l end;
i) i:=n; repeat i:=i-l until i=0;
j) begin i:=0; s:=0; r:=0 end;
k) with A do begin x:=0; y:=0 end.
3. Estimai numrul operaiilor elementare Q(n), din procedurile ce urmeaz:
procedure N2(n:integer);
var i, j, k : integer;
r : real;
{1} begin
{2}
for i:=l to n do
{3}
for j:=1 to n do
{4}
for k:=l to 300 do
{5}
r:=1.0;
end; {N2}
procedure N3(n:integer);
var i, j, k : integer;
r : real;
{1} begin
{2}
for i:=l to n do
{3}
for j:=l to n do
{4}
for k:=l to n do
{5}
r:=1.0;
end; {N3}
procedure N4 (n:integer);
var i, j, k, m : integer;
r : real;
{1} begin
{2}
for i:=l to n do
{3}
for j:=1 to n do
{4}
for k:=l to n do
{5}
for m:=l to n do
{6}
r:=1.0;
end; {N4}
4. n cazul procedurii Sortare pentru un calculator Pentium cu frecvena ceasului de sistem f1
= 500 MHz s-a obinut 1 1,8 * 10-8 s. Pentru acelai tip de calculator, ns cu, frecvena
ceasului de sistem f2 = 150 MHz, s-a obinut 2 6,0 * 10-8 s. Se observ c
500 10

6,0 10
=
3,3 =
150 10

1,8 10

!
!

= 3,3.

Cum credei, prin ce se explic acest fapt?


5. n procesul compilrii, instruciunile limbajului PASCAL snt translate n una sau mai multe
instruciuni din limbajul cod-main. Numrul concret de instruciuni depinde de mediul de
programare i tipul calculatorului utilizat. Elaborai planul unui experiment care ne-ar permite
s estimm numrul de instruciuni cod-main n care este translat fiecare instruciune
13 | P a g i n

PASCAL.
6. E cunoscut faptul c timpul de execuie a instruciunilor din limbajul cod-main depinde de
tipul lor. De exemplu, o instruciune care adun dou numere ntregi este mai rapid dect
instruciunea care adun dou numere reale. In consecin, valorile A, determinate prin
msurarea timpului de execuie a unui program PASCAL, depind de tipul datelor utilizate.
Verificai experimental aceast afirmaie n cazul calculatorului cu care lucrai Dvs.
7. Capacitatea de prelucrare a unui calculator se msoar n Mips - Megainstruciuni pe secund.
De exemplu, calculatoarele personale au capacitatea de prelucrare 500-800 Mips. Pentru a
msura aceast caracteristic, productorii de calculatoare utilizeaz instruciunile limbajului
cod-main. Evident, pentru un programator PASCAL ar prezenta interes i capacitatea de
prelucrare exprimat n instruciuni PASCAL pe secund. Elaborai planul unui experiment
care ar permite estimarea acestei caracteristici pentru calculatorul cu care lucrai Dvs.
1.5. Complexitatea temporal a algoritmilor
n informatic complexitatea temporal a algoritmilor se caracterizeaz prin timpul de execuie
T(n) sau numrul de operaii elementare Q(n). ntruct calculatoarele moderne au o vitez de calcul
foarte mare - 108 ... 1010 instruciuni pe secund, problema timpului de execuie se pune numai pentru
valorile mari ale lui n. n consecin, n formulele ce exprim numrul de operaii elementare Q(n)
prezint interes numai termenul dominant, adic acel care tinde cit mai repede la infinit. Importana
termenului dominant fa de ceilali este pus n eviden n tabelul 5.
Tabelul 5 Valorile termenilor dominani
2

n4

2n

16

log2n

16

64

256

16

64

512

4096

256

16

256

4096

65536

65536

32

1024

32768

1048576

4294967296

De exemplu, numrul de operaii elementare ale procedurii Sortare se exprim prin formula
Q(n)= l6n2-l3n + 2.
Termenul dominant din aceast formul este 16n2. Evident, pentru valorile mari ale lui n numrul
de operaii elementare
Q(n) = I6n2
iar timpul de execuie
T(n) = 16n2.
n funcie de complexitatea temporal, algoritmii se clasific n:
- algoritmi polinomiali;
- algoritmi exponeniali;
- algoritmi nederminist polinomiali.
Un algoritm se numete polinomial dac termenul dominant are forma Cnk, adic
Q(n)=Cnk; T(n) Cnk ,
unde n este caracteristica datelor de intrare, C o constant pozitiv, iar kun numr natural.
Complexitatea temporal a algoritmilor polinomiali este redat prin notaia Q(nk), care se citete
"algoritm cu timpul de execuie de ordinul nk " sau, mai pe scurt, "algoritm de ordinul nk ". Evident,
exist algoritmi polinomiali de ordinul n, n2, n3 .a.m.d.
De exemplu, algoritmul de sortare a elementelor unui vector prin metoda bulelor este un algoritm
polinomial de ordinul n2. Acest lucru se observ i din graficul timpului de execuie T(n) a procedurii
Sortare, prezentat n figura 3.
Un algoritm se numete exponenial dac termenul dominant are forma Ckn, adic
Q(n) Ckn; T(n) Cnk ,
unde k>1. Complexitatea temporal a algoritmilor exponeniali este redat prin notaia Q(kn).
14 | P a g i n

Menionm faptul c tot exponeniali se consider i algoritmii de complexitatea nlogn, cu toate c


aceast funcie nu este exponenial n sensul strict matematic al acestui termen.
Din comparaia vitezei de cretere a funciilor exponenial i polinomial (vezi tabelul 5) rezult
c algoritmii exponeniali devin inutilizabili chiar pentru valori nu prea mari ale lui n. Pentru
exemplificare amintim tabelul 1 n care este prezentat timpul de execuie T1(n) a unui algoritm
polinomial de ordinul Q(n3) i timpul de execuie T2(n) a unui algoritm exponenial de ordinul Q(2n).
n funcie de complexitatea temporal se consider c o problem este uor rezolvabil dac
pentru soluionarea ei exist un algoritm polinomial. O problem pentru care nu exist un algoritm
polinomial se numete dificil. Accentum faptul c aceast clasificare se refer doar la analiza
asimptotic a algoritmilor, adic la comportarea lor pentru valori mari ale lui n. Pentru valorile mici ale
lui n situaia poate fi diferit.
De exemplu, presupunem c pentru soluionarea unei probleme exist doi algoritmi, unul
polinomial cu timpul de execuie T1(n) i altul exponenial cu timpul de execuie T2(n):
T1(n) = 1000n2;
T2(n) = 2k.
Prin calcule directe se poate verifica c pentru n = 1,2,3,...,18 timpul T2(n) < T1(n). Prin urmare, n
situaia n 18 vom prefera algoritmul exponenial.
n practic, elaborarea programelor de calculator presupune parcurgerea urmtoarelor etape:
- formulare exact a problemei;
- determinarea complexitii temporale a problemei propuse - problem uor rezolvabil sau
problem dificil;
- elaborarea algoritmului respectiv i implementarea lui pe un sistem de calcul.
Evident, n cazul unor probleme uor rezolvabile, programatorul va depune toate eforturile pentru
a inventa algoritmi polinomiali, adic algoritmi de ordinul nk, astfel nct parametrul k s ia valori ct mai
mici. In cazul problemelor dificile se va da prioritate algoritmilor care minimizeaz timpul de execuie
cel puin pentru datele de intrare frecvent utilizate n aplicaiile practice. Metodele de clasificare a
problemelor n probleme uor rezolvabile i probleme dificile se studiaz n cursurile avansate de
informatic.
ntrebri ii exerciii
1. Indicai termenii dominani:
a) 12n + 5;
b) 6n2+ 100n+ 18;
c) 15n3 + 1000n2 - 25n + 6000;
d) 2000n3 + 2n + 13;
e) nlog2n + n5+300n2+6;
f) 3n+ 2n+14n3 + 21;
g) n5 + 10n4 + 200n3 + 300n2 + 1000n.
2. Cum se clasific algoritmii n funcie de complexitatea temporal?
3. Determinai tipul algoritmilor, cunoscnd complexitatea temporal:
a) Q(n) = 200n + 15;
b) Q(n) = 2n + 25n2 + 1000;
c) Q(n) = n3 + 3n + 6000n2 + 106;
d) Q(n) = 3n + 2" + n + 4000;
e) Q(n) = nlog2n + n3+ n2+ 1500;
f) Q(n) = 100nn + 15n3 + 8n + 900.
4. Cum credei, prin ce se explic importana termenului dominant n analiza complexitii
temporale a algoritmilor?
5. Se consider procedurile N2, N3 i N4 din paragraful precedent. n urma estimrii numrului de
operaii elementare s-a obinut:
QN2(n) = 602n2 + 2n + 2;
Q N3(n) = 2n3 + 2n 2 + 2n + 2;
Q N4(n) = 2n4 + 2n3 + 2n1 + 2n + 2.
15 | P a g i n

Determinai ordinul de complexitate temporal a algoritmilor descrii cu ajutorul acestor


proceduri. Comparai viteza de cretere a timpilor de execuie TN2(n), TN3(n) i TN4(n), folosind n
acest scop graficele din figura 4.
6. Se consider un algoritm format din k cicluri imbricate:
for i1:=1 to n do
for i2:=l to n do
...
for ik:=1 to n do P
Numrul de operaii elementare QP efectuate n procedura P este o mrime constant. Estimai
complexitatea temporal a algoritmului.
7. Schiai un algoritm pentru rezolvarea urmtoarei probleme:
Se consider mulimea A format din n numere ntregi. Determinai dac exist cel puin o
submulime B, B A, suma elementelor creia este egal cu m. De exemplu, pentru A={-3,1,5,
9} i m=7, o astfel de submulime exist i anume B={-3, 1,9}. Estimai complexitatea
temporal a algoritmului elaborat.

16 | P a g i n

Capitolul 2
TEHNICI DE ELABORARE A ALGORITMILOR
2.1. Iterativitate sau recursivitate
Pe parcursul dezvoltrii informaticii s-a stabilit c multe probleme de o real importan practic
pot fi rezolvate cu ajutorul unor metode standard, denumite tehnici de programare: recursia, trierea,
metoda relurii, metodele euristice .a.
Una din cele mai rspndite tehnici de programare este recursia. Amintim c recursia se definete
ca o situaie n care un subprogram se autoapeleaz fie direct, fie prin intermediul altui subprogram.
Tehnicile n studiu se numesc respectiv recursia direct i recursia indirect, acestea fiind studiate n
cadrul temei "Funcii i proceduri".
n general, elaborarea unui program recursiv este posibil numai atunci cnd se respect
urmtoarea regul de consisten: soluia problemei trebuie s fie direct calculabil ori calculabil cu
ajutorul unor valori direct calculable. Cu alte cuvinte, definirea corect a unui algoritm recursiv
presupune c n procesul derulrii calculelor trebuie s existe:
- cazuri elementare, care se rezolv direct;
- cazuri care nu se rezolv direct, ns procesul de calcul n mod obligatoriu progreseaz spre un
caz elementar.
De exemplu, n definiia recursiv a funciei factorial fact: $ $,
1,
= 0;
&
=

& 1 ,
> 0,
deosebim:
- Cazul elementar n=0. In acest caz valoarea fact(0) este direct calculabil i anume fact(0)= l.
- Cazurile neelementare n > 0. n astfel de cazuri valorile fact(n) nu snt direct calculable, ns
procesul de calcul progreseaz ctre cazul elementar fact(0).
De exemplu, pentru n = 3 obinem:
fact(3) = 3 fact(2) = 3 2 fact(1) = 3 2 1 fact(0) = 3 2 1 1=6.
Prin urmare, definiia recursiv a funciei fact(n) este o definiie consistent. Amintim, c funcia.
fact(n) poate fi exprimat n PASCAL, urmnd direct definiia, n forma:
function Fact(n:Natural):Natural;
begin
if n=0 then Fact:=l
else Fact:=n*Fact(n-1)
end;

17 | P a g i n

Fig. 5. Gestionarea stivei n cazul apelului Fact (3) :


AR - adresa de revenire; n - valoarea curent a parametrului actual;
*** - spaiu pentru memorarea valorii/returnate de funcia Fact
Modul de gestionare a stivei n cazul apelului Fact(3) este prezentat n figura 5. Intr-un mod
similar, n definiia recursiv a funciei incons: $ $,
1,
= 0;
' (
=

' ( +1 ,
> 0
deosebim cazul elementar n=0 i cazurile neelementare n>0. ns, spre deosebire de funcia fact(n),
pentru n > 0 valorile incons(n) nu pot fi calculate, ntruct procesul de calcul progreseaz ctre
incons().
De exemplu, pentru n=3 obinem:
incons(3) = 3 incons(4) = 3 4 incons(5) = 3 4 5 incons(6) = .
Prin urmare, definiia recursiv a funciei incons(n) este o definiie inconsistent i teoretic
procesul de calcul va dura la nesfrit. In practic, calculele vor fi ntrerupte de sistemul de operare n
momentul depirii capacitii de memorare a stivei sau n cazul depirii capacitii dispozitivului aritmetic.
Accentum faptul c mediile actuale de programare nu asigur verificarea consistenei algoritmilor recursivi,
acest lucru revenindu-i programatorului.

Dup cum s-a vzut n capitolele precedente, orice algoritm recursiv poate fi transcris ntr-un
algoritm iterativ i invers. Alegerea tehnicii de programare - iterativitate sau recursi-vitate - ine, de
asemenea, de competena programatorului. Evident, aceast alegere trebuie fcut lund n considerare
avantajele i neajunsurile fiecrei metode, care variaz de la caz la caz. Pentru exemplificare, n tabelul
6 snt prezentate rezultatele unui studiu comparativ al ambelor tehnici de programare n cazul prelucrrii
automate a textelor.
Tabelul 6. Studiul comparativ al iterativitii i recursivitii (prelucrarea automat a textelor)
Nr.
crt.
1.
2.
3.
4.
5.

Caracteristici

Iterativitate

Recursivitate

mic

mare

Necesarul de memorie
Timpul de execuie
Structura programului
Volumul de munc necesar pentru
scrierea programului

complicat

simpl

mare

mic

Testarea i depanarea programelor

simpl

complicat

acelai

Propunem cititorului n calitate de exerciiu efectuarea unui studiu comparativ al iterativitii i


recursivitii n cazul algoritmilor destinai crerii i structurilor dinamice de date din manualul
"Informatica. Limbajul PASCAL".
n general, algoritmii recursivi snt recomandai n special pentru problemele ale cror rezultate
snt definite prin relaii de recuren: analiza sintactic a textelor, prelucrarea structurilor dinamice de
date, procesarea imaginilor .a. Un exemplu tipic de astfel de probleme este analiza gramatical a
programelor PASCAL, sintaxa crora, dup cum se tie, este definit prin relaii de recuren.
ntrebri i exerciii
1. Explicai termenul tehnicii de programare.
2. Care este diferena dintre recursia direct i recursia indirect?. Dai exemple.
3. Ce condiii trebuie respectate pentru ca definiia unui algoritm recursiv s fie corect?
4. Care este diferena dintre definiiile recursive consistente i definiiile recursive inconsistente?
5. Se consider urmtoarele definiii recursive de funcii. Care din aceste definiii snt consistente?
Argumentai rspunsul.
: $ $,

* : $ $,

=
=

+
+

1,

1,

= 0;
1 ,
> 0;
= 0;
,
> 0;

18 | P a g i n

: $ $,

: $ $,

,: $ $,

. : $ $,

=
,

1,

+,

= 0;
1 ,
0;

1,

2,

= 0;
1 ,
> 0;

= 0;
1 ,
> 0;

1,
0' 10 +

< 10;
1 10 ,

10;

6. Lansai n execuie programul ce urmeaz. Explicai mesajele afiate la ecran.


Program P150;
{Depirea capacitii de memorare a stivei }
type Natural = O..Maxint;
function Incons(n:Natural):Natural;
{ Definiie recursiv inconsistent }
begin
writeln('Apel recursiv n=',n) ;
if n=0 then Incons:=1
else Incons:=n*Incons (n+1);
end; { Incons }
begin
writeln(Incons(3));
readln;
end.

Reprezentai pe un desen similar celui din figura 5 modul de gestionare a stivei n cazul apelului
Incons(3).
7. Indicai cazurile elementare i cele neelementare pentru urmtorii algoritmi recursivi:
a) funciile F i G din programul P115;
b) funcia Arb i procedura AfisArb din programul P130;
c) procedurile Preordine, Inordine i Postordine din programul P131;
d) procedurile Cutare i Inserare din programul P132;
e) procedura InAdincime din programul P133.
8. Suma primelor n numere naturale S(n) poate fi calculat cu ajutorul funciei iterative
= 0 +1 +2 + +

sau al funciei recursive


=

0,

=4
678

= 0
1 ,
> 0

Utiliznd ca model tabelul 6, efectuai un studiu comparativ al algoritmilor destinai calculrii


sumei S(n).
9. Se consider urmtoarele formule metalingvistice:
<Cifr> ::= 0|1|2|3|4|5|6|7|8|9
<Numr> ::= <Cifr>{<Cifr>}
<Semn> ::= +|-|*|/
<Expresie> ::= <Numr>|{<Expresie>}|<Expresie><Semn><Expresie>
Scriei o funcie recursiv care returneaz valoarea true dac irul de caractere S este conform
definiiei unitii lexicale <Expresie> i false n caz contrar.
19 | P a g i n

10. Efectuai un studiu comparativ al algoritmilor iterativi i algoritmilor recursivi destinai crerii i
prelucrrii urmtoarelor structuri dinamice de date:
a) liste unidirecionale;
b) liste bidirecionale;
c) stiva;
d) cozi;
e) arbori binari;
f) arbori binari de cutare;
g) arbori de ordinul m.
11. Scriei o funcie iterativ care returneaz valoarea true dac irul de caractere Seste conform
definiiei unitii lexicale <Expresie> din exerciiul 9 i false n caz contrar. Utiliznd ca
model tabelul 6, efectuai un studiu comparativ al algoritmului iterativ i algoritmului recursiv.
12. Elaborai un subprogram recursiv care calculeaz suma cifrelor urmi numr natural n. Examinai
cazurile n MaxInt i n 10250.
13. Imaginile n alb-negru (fig. (5) pot fi codificate cu ajutorul unei matrice binare B = ||bij||n*m, 1 n,
m 30. Elementul bij indic culoarea microzonei respective: neagr (bij =1) sau alb (bij =0).
1 2 3 j m
1
2
3

1 2 3 j m
1
2
3

n
b

Fig. 6. Colorarea unei suprafee nchise: a - imaginea iniial; b - imaginea final


Elaborai o procedur recursiv pentru colorarea unei suprafee nchise, specificate prin coordonatele (i,j) ale oricrei microzone A din interiorul ei.
14. Elaborai o procedur care determin cte obiecte conine o imagine n alb-negru. Imaginea este
mprit n microzone i codificat cu ajutorul matricei binare B = ||bij||n*m. Elementul bij indic
culoarea microzonei cu coordonatele (i, j). De exemplu, imaginile din figura 6 conin cte patru
obiecte distincte.
15. Efectuai un studiu comparativ al algoritmilor iterativi i algoritmilor recursivi destinai soluionrii problemelor din exerciiile 13 i 14.
2.2. Metoda trierii
Metoda trierii presupune c soluia unei probleme poate fi gsit analiznd consecutiv elementele
si ale unei mulimi finite
S={s1,s2, , sk}
denumit mulimea soluiilor posibile. In cele mai simple cazuri elementele si, si S pot fi reprezentate
prin valori aparinnd unor tipuri ordinale de date: integer, boolean, char, enumerare sau
subdomeniu. n problemele mai complicate sntem nevoii s reprezentm aceste elemente prin tablouri,
articole sau mulimi. Menionm c n majoritatea problemelor soluiile posibile s1, s2 ..., sk nu snt
indicate explicit n enunul problemei i elaborarea algoritmilor pentru calcularea lor cade n sarcina
programatorului.
Schema general a unui algoritm bazat pe metoda trierii poate fi redat cu ajutorul unui ciclu:
for i: = 1 to k do
if SolutiePosibila (si) then PrelucrareaSolutiei (si)
unde SolutiePosibila este o funcie booleana care returneaz valoarea true dac elementul si satisface
condiiile problemei i false n caz contrar, iar PrelucrareaSolutiei este o procedur care efectueaz
prelucrarea elementului selectat. De obicei, n aceast procedur soluia si este afiat la ecran.
n continuare vom analiza dou exemple care pun n eviden avantajele i neajunsurile
algoritmilor bazai pe metoda trierii.
20 | P a g i n

Exemplul 1. Se consider numerele naturale din mulimea {0, 1, 2, ..., n}. Elaborai un program
care determin pentru cte numere K din aceast mulime suma cifrelor fiecrui numr este egal cu m.
n particular, pentru n = 100 i m = 2, n mulimea {0, 1,2,..., 100} exist 3 numere care satisfac
condiiile problemei: 2, 11 i 20. Prin urmare, K=3.
Rezolvare. Evident, mulimea soluiilor posibile S= {0, 1,2, ...,n}. n programul ce urmeaz suma
cifrelor oricrui numr natural i, i S se calculeaz cu ajutorul funciei SumaCifrelor. Separarea
cifrelor zecimale din scrierea numrului natural i se efectueaz de la dreapta la stnga prin mprirea
numrului i i a citurilor respective la baza 10.
Program P151;
{Suma cifrelor unui numar natural}
type Natural=0..MaxInt;
var i, K, m, n : Natural;
function SumaCifrelor(i:Natural):Natural;
var suma : Natural;
begin
suma:=0;
repeat
suma:=suma+(i mod 10);
i:=i div 10;
until i=0;
SumaCifrelor:=suma;
end; { SumaCifrelor }
function SolutiePosibila(i:Natural):boolean;
begin
if SumaCifrelor(i)=m then SolutiePosibila:=true
else SolutiePosibila:=false;
end; { SumaCifrelor }
procedure PrelucrareaSolutiei(irNatural);
begin
writeln('i=', i); K:=K+1; end; { PrelucrareaSolutiei }
begin
write{'Dai n='); readln(n);
write('Dai m='); readln(m);
K:=0;
for i:=0 to n do
if SolutiePosibila(i) then PrelucrareaSolutiei(i);
writeln('K=', K); readln;
end.
Din analiza programului P151 rezult c aceast complexitate temporar a algoritmului respectiv
este O(n).
Exemplul2. Se consider mulimea P = { P1, P2, ..., Pn} format din n puncte (2 n 30) pe un
plan euclidian. Fiecare punct Pj este definit prin coordonatele sale xj yj. Elaborai un program care
afieaz la ecran coordonatele punctelor Pa, Pb distana dintre care este maxim.
Rezolvare. Mulimea soluiilor posibile S = P*P. Elementele (Pj, Pm) ale produsului cartezian P*P
pot fi generate cu ajutorul a dou cicluri imbricate:
for j :=1 to n do
for m:=l to n do
if SolutiePosibila (Pj, Pm)
then PrelucrareaSolutiei(Pj, Pm)
Distana dintre punctele Pj, Pm se calculeaz cu ajutorul formulei:
:;

= < =: =;

>: >;

21 | P a g i n

Program P152;
{Puncte pe un plan euclidian }
const nmax=30;
type Punct = record
x, y : real;
end;
Indice = l..nmax;
var P : array[Indice] of Punct;
j, m, n : Indice;
dmax : real; { distanta maxima }
PA, PB : Punct;
function Distanta(A, B : Punct) : real;
begin
Distanta:=sqrt(sqr(A.x-B.x)+sqr(A.y-B.y));
end; } Distanta }
function SolutiePosibila(j,m:Indice):boolean;
begin
if j<>m then SolutiePosibila:=true
else SolutiePosibila:=false;
end; { SolutiePosibila }
procedure PrelucrareaSolutiei(A, B : Punct);
begin
if Distanta(A, B)>dmax then
begin
PA:=A; PB:=B; dmax:=Distanta(A, B);
end;
end; { PrelucrareaSolutiei }
begin
write ('Dati n='); readln(n);
writeln('Dai coordonatele x, y ale punctelor');
for j:=1 to n do
begin
write (P[,j:']: '); readln (P[j].x,P[j].y);
end; dmax:=0;
for j:=1 to n do
for m:=l to n do
if SolutiePosibila(j, m) then
PrelucrareaSolutiei (P[j], P[m]);
writeln('Soluia:PA=(',PA.x:5:2,',',PA.y:5:2,')');
writeln('PB=(', PB.x:5:2,',',PB.y:5:2,')');
readln;
end.
Complexitatea temporal a algoritmului descris cu ajutorul programului P152 este O(n2).
Din exemplele prezentate mai sus se observ c n algoritmii bazai pe metoda trierii se calculeaz,
implicit sau explicit, mulimea soluiilor posibile S. n problemele relativ simple (exemplul 1) elementele
din mulimea soluiilor posibile pot fi enumerate direct. In problemele mai complicate (exemplul 2)
generarea soluiilor posibile necesit elaborarea unor algoritmi speciali. n general, aceti algoritmi
realizeaz operaiile legate de prelucrarea unor mulimi:
reuniunea;
intersecia;
diferena;
generarea tuturor submulimilor;
generarea elementelor unui produs cartezian;
generarea permutrilor, aranjamentelor sau combinrilor de obiecte . a.
22 | P a g i n

Avantajul principal al algoritmilor bazai pe metoda trierii const n faptul c programele


respective sunt relativ simple, iar depanarea lor nu necesit teste sofisticate. Complexitatea temporal a
acestor algoritmi este determinat de numrul de elemente k din mulimea soluiilor posibile S. In
majoritatea problemelor de o real importan practic metoda trierii conduce la algoritmii exponeniali.
ntruct algoritmii exponeniali snt inacceptabili n cazul datelor de intrare foarte mari, metoda trierii
este aplicat numai n scopuri didactice sau pentru elaborarea unor programe timpul de execuie al
crora nu este critic.
ntrebri i exerciii
1. Explicai structura general a algoritmilor bazai pe metoda trierii.
2. Cum poate fi realizat trierea soluiilor posibile cu ajutorul ciclurilor while i repeat?
3. Estimai timpul de execuie a programelor P151 i P152. Modificai programul P152 n aa
fel, nct timpul de execuie s se micoreze aproximativ de dou ori.
4. Dai exemple de programe timpul de execuie al crora nu este critic.
5. Care snt avantajele i dezavantajele algoritmilor bazai pe metoda trierii?
6. Se consider mulimea P = {Pt, P2, ..., Pn} format din n puncte (3 n 30) pe un plan
euclidian. Fiecare punct Pt este definit prin coordonatele sale xj, yj. Elaborai un program ce
determin trei puncte din mulimea P pentru care aria triunghiului respectiv este maxim. Estimai timpul de execuie a programului elaborat.
7. Scriei o funcie PASCAL care, atribuindu-i ca parametru un numr natural n, returneaz valoarea true dac n este prim i false n caz contrar. Estimai complexitatea temporal a
funciei respective.
8. n notaia (a)x litera x reprezint baza sistemului de numeraie, iar litera a - un numr scris n
sistemul respectiv. Elaborai un program care calculeaz, dac exist, cel puin o rdcin a
ecuaiei
(a)x = b,
unde a i b snt numere naturale, iar x este necunoscuta. Fiecare cifr a numrului natural a aparine
mulimii {0, 1,2, ..., 9}, iar numrul b este scris n sistemul zecimal. De exemplu, rdcina ecuaiei
(160)x = 122
este x=8, iar ecuaia
(5)x=10
nu are soluii. Estimai complexitatea temporal a programului elaborat.
9. ntr-o puculi se afl N monede de diferite valori cu greutatea total G grame. Greutatea
fiecrei monede de o anumit valoare este dat n tabelul ce urmeaz.
Valoarea monedei, lei
1
5
10
25
50

Greutatea monedei, grame


1
2
3
4
5

Elaborai un program care determin suma minim S care ar putea s fie n puculi.
10. Elaborai un program care determin cte puncte cu coordonate ntregi se conin ntr-o sfer de
raza R cu centrul n originea sistemului de coordonate. Se consider ca R este un numr
natural, 1R30. Distana d dintre un punct cu coordonatele (x, y, z) i originea sistemului de
coordonate se determin dup formula = ?= + > + = .
2.3. Tehnica Greedy
Aceast metod presupune c problemele pe care trebuie s le rezolvm au urmtoarea structur:
se d o mulime A={a{, a2,..., an} format din n elemente;
se cere s determinm o submulime B, BA, care ndeplinete anumite condiii pentru a fi
acceptat ca soluie.
n principiu, problemele de acest tip pot fi rezolvate prin metoda trierii, genernd consecutiv cele
2n submulimi Ai ale mulimii A. Dezavantajul metodei trierii const n faptul c timpul cerut de
algoritmii respectivi este foarte mare.
23 | P a g i n

Pentru a evita trierea tuturor submulimilor Ai, AiA, n metoda Greedy se utilizeaz un criteriu (o
regul) care asigur alegerea direct 0- elementelor necesare din mulimea A. De obicei, criteriile sau
regulile de selecie nu snt indicate explicit n enunul problemei i formularea lor cade n sarcina
programatorului. Evident, n absena unor astfel de criterii metoda Greedy nu poate fi aplicat.
Schema general a unui algoritm bazat pe metoda Greedy poate fi redat cu ajutorul unui ciclu:
while ExistaElemente do begin
AlegeUnElement(x);
IncludeElementul(x);
end.
Funcia ExistaElemente returneaz valoarea true dac n mulimea A exist elemente care
satisfac criteriul (regula) de selecie. Procedura AlegeUnElement extrage din mulimea, 4 un astfel
de element x, iar procedura IncludeElementul nscrie elementul selectat n submulimea B. Iniial
B este o mulime vid.
Dup cum se vede, n metoda Greedy soluia problemei se caut prin testarea consecutiv a
elementelor din mulimea A i prin includerea unora din ele n submulimea B. ntr-un limbaj plastic,
submulimea B ncearc s "nghit" elementele "gustoase" din mulimea A, de unde provine i
denumirea metodei {greedy - lacom, hrpre).
Exemplu. Se consider mulimea A={a1, a2, ..., ai, ..., an} elementele creia snt numere reale, iar
cel puin unul din ele satisface condiia ai>0. Elaborai un program care determin o submulime B,
BA, astfel nct suma elementelor din B s fie maxim. De exemplu, pentru A={21,5; -3,4; 0; -12,3;
83,6} avem B={21,5; 83,6}.
Rezolvare. Se observ c dac o submulime B, BA, conine un element b 0, atunci suma
elementelor submulimii B\{b} este mai mare sau egal cu cea a elementelor din B. Prin urmare, regula
de selecie este foarte simpl: la fiecare pas n submulimea B se include un element pozitiv arbitrar din
mulimea A.
n programul ce urmeaz mulimile A i B snt reprezentate prin vectorii (tablourile unidimensionale) A i B, iar numrul de elemente ale fiecrei mulimi - prin variabilele ntregi, respectiv n i
m. Iniial B este o mulime vid, respectiv m=0.
Program P153;
{Tehnica Greedy}
const nmax=1000;
var A : array [l..nmax] of real;
n : 1..nmax;
B : array [1..nmax] of real;
m : 0..nmax;
x : real;
i : 1..nmax;
function ExistaElemente : boolean;
var i : integer;
begin
ExistaElemente:=false;
for i:=l to n do
if A[i]>0 then ExistaElemente:=true;
end; { ExistaElemente }
procedure AlegeUnElement(var x : real);
var i : integer;
begin
i: =1 ;
while A[i]<=0 do i:=i+l; x:=A[i]; A[i]:=0;
end; { AlegeUnElement }
procedure IncludeElementul(x : real);
begin
m:=m+l; B[m]:=x;
end; { IncludeElementul }
24 | P a g i n

begin
write('Dai n='); readln(n);
writeln('Dai elementele mulimii A:');
for i:=l to n do read(A[i]);
writeln;
m:=0;
while ExistaElemente do
begin
AlegeUnElement(x);
IncludeElementul(x);
end;
writeln('Elementele mulimii B:');
for i:=l to m do writeln (B[i]);
readln; end.
Menionm c procedura AlegeUnElement zerografaz componenta vectorului A ce coninea
elementul x, extras din mulimea respectiv.
Complexitatea temporal a algoritmilor bazai pe metoda Greedy poate fi evaluat ur-mnd
schema general de calcul prezentat mai sus. De obicei, timpul cerut de procedurile
ExistaElemente, AlegeUnElement i IncludeElementul este de ordinul n. n componena
ciclului while aceste proceduri se execut cel mult de n ori. Prin urmare, algoritmii bazai pe metoda
Greedy snt algoritmi polinominali. Pentru comparare, amintim c algoritmii bazai pe trierea tuturor
submulimilor Ai, AiA snt algoritmi de ordinul 0(2n), deci exponeniali. Cu regret, metoda Greedy
poate fi aplicat numai atunci cnd din enunul problemei poate fi dedus regula care asigur selecia
direct a elementelor necesare din mulimea A.
ntrebri i exerciii
1. Explicai structura general a algoritmilor bazai pe metoda Greedy.
2. Care snt avantajele i dezavantajele algoritmilor bazai pe tehnica Greedy!
3. Estimai timpul de execuie al programului P153.
4. Schiai un algoritm care determin submulimea B din exemplul de mai sus prin metoda trierii.
Estimai complexitatea temporal a algoritmului elaborat.
5. Memorarea fiierelor pe benzi magnetice. Se consider n fiiere f1, f2, ..., fn care trebuie memorate
pe o band magnetic. Elaborai un program care determin ordinea de amplasare a fiierelor pe
band astfel nct timpul mediu de acces s fie minim. Se presupune c frecvena de citire a
fiierelor este aceeai, iar pentru citirea fiierului f1 (i=1, 2, ..., n) snt necesare ti secunde.
6. Problema continu a rucsacului. O persoan are un rucsac cu care pot fi transportate unul sau mai
multe obiecte, greutatea sumar a crora nu depete valoarea Gmax. Pentru fiecare obiect i (i=1,
2,..., n) se cunoate greutatea gi. i ctigul ci. care se obine n urma transportului su la destinaie.
Elaborai un program care determin ce obiecte trebuie s transporte persoana n aa fel, nct
ctigul s fie maxim. n caz de necesitate, unele obiecte pot fi separate n fragmente mai mici.
7. Hrubele de la Cricova. Dup o vizit la renumitele hrube* de la Cricova un informatician a
construit un robot care funcioneaz ntr-un cmp divizat n ptrele (fig. 7). Robotul poate executa
doar instruciunile SUS, JOS, DREAPTA, STING, conform crora se deplaseaz n unul din
ptrelele vecine. Dac n acest ptrat este un obstacol, de exemplu, un perete sau un butoi, are loc
un accident i robotul iese din funciune.
1

Intrare

1
2
3
4
5

Robotul

Ieire

6
7

Fig. 7. Cmpul de aciune al robotului


25 | P a g i n

Elaborai un program care, cunoscnd planul hrubelor, deplaseaz robotul prin ncperile
subterane, de la intrarea n hrube la ieire. Colecia de vinuri fiind foarte bogat, nu se cere vizitarea
obligatorie a tuturor ncperilor subterane.
Datele de intrare. Planul hrubelor este desenat pe o foaie de hrtie liniat n ptrele. Ptrelele
haurate reprezint obstacolele, iar cele nehaurate - spaiile libere. Ptrelele de pe perimetrul planului,
cu excepia celor de intrare sau ieire, snt haurate prin definiie. n form numeric planul hrubelor este
redat prin tabloul Acum linii i n coloane. Elementele A[i,j] ale acestui tablou au urmtoarea
semnificaie: 0 - spaiu liber; 1 - obstacol; 2 - intrarea n hrube; 3 - ieirea din hrube. Iniial, robotul se
afl n ptrelul pentru care A[i,j]=2. Fiierul HRUBE.IN1 conine pe prima linie numerele m, n
separate prin spaiu. Pe urmtoarele m linii se conin cte n numere A[i,j] separate prin spaiu.
Datele de ieire. Fiierul HRUBE.OUT va conine pe fiecare linie cte una din instruciunile SUS,
JOS, DREAPTA, STING scrise n ordinea executrii lor de ctre robot.
Restricii. 5 m, n 100. Timpul de execuie nu va depi 3 secunde.
Exemplu:
HRUBE.IN
HRUBE.OUT
7 9
SUS
1 1 1 1 1 1 1 1 1
DREAPTA
1 0 0 1 0 0 0 0 1
DREAPTA
1 0 1 0 0 1 0 1 1
DREAPTA
1 0 0 0 1 0 0 0 1
DREAPTA
1 0 1 0 1 0 1 0 1
SUS
1 0 0 0 0 0 1 0 1
SUS
1 2 1 1 1 1 1 3 1
DREAPTA
DREAPTA
JOS
JOS
JOS
Indicaii. La fiecare pas selectai din mulimea {SUS, JOS, DREAPTA, STING} cte o
instruciune n aa fel, nct robotul s se deplaseze numai de-a lungul unui perete.
2.4. Metoda relurii
Metoda relurii presupune c soluia problemei pe care trebuie s o rezolvm poate fi reprezentat
printr-un vector
X=(x1, x2, ..., xk, ... , xn).
Fiecare component xk a vectorului Xpoate lua valori dintr-o anumit mulime Ak, k = 1,2,..., n. Se
consider c cele mk elemente ale fiecrei mulimi Ak snt ordonate conform unui criteriu bine stabilit,
de exemplu, n ordinea apariiei lor n memoria calculatorului.
n principiu, astfel de probleme pot fi soluionate prin metoda trierii, tratnd vectorul Xca un
element al produsului cartezian S = A]xA2x ... xA. Dezavantajul metodei trierii const n faptul c
timpul cerut de algoritmul respectiv este foarte mare. De exemplu, pentru mulimile A1, A2,..., An
formate numai din cte dou elemente, timpul necesar este O(2n), deci exponenial.
Pentru evitarea trierii tuturor elementelor produsului cartezian A1xA2x ... xAn, n metoda relurii
componentele vectorului X primesc valori pe rnd, n sensul c lui xk i se atribuie o valoare numai dac
au fost deja atribuite valori lui x1, x2, ..., xk-1 . Mai mult, odat o valoare pentru xk stabilit, nu se trece
direct la atribuirea de valori lui xk+1, ci se verific nite condiii de continuare referitoare la x1,x2, .., xk.
Aceste condiii stabilesc situaiile n care are sens s trecem la calculul lui xk+i. Dac aceste condiii nu
snt satisfcute, va trebui s facem o alt alegere pentru xk sau, dac elementele din mulimea Ak s-au
epuizat, s micorm pe k cu o unitate ncercnd s facem o nou alegere pentru xk-1.
Menionm faptul c anume micorarea lui k d nume metodei studiate, cuvntul "reluare"
semnificnd revenirea la alte variante de alegere a variabilelor xu x2, ..., xk-1. Evident, aceeai
semnificaie o are i denumirea englez a metodei n studiu - backtracking (back -napoi, track - urm).
Pentru exemplificare, n figura 8 este prezentat ordinea n care snt examinate elementele
mulimilor A1 = {a11, al2}, A2 = {a21, a22} i A3 = {a31, a32, a33}. n scopuri didactice se consider c
1

Hrub - ncpere sau galerie subteran care servete la depozitarea produselor alimentare. n hrubele de la Cricova pe parcursul a mai
multor decenii au fost depozitate cele mai bune vinuri din Republica Moldova.

26 | P a g i n

mulimile A1 i A2 au cte dou elemente (m1=2, m2=2), iar mulimea A3 trei elemente (m3 =3).
Elementele akj ale mulimilor respective snt simbolizate prin cerculee. Rezultatele verificrii condiiilor
de continuare snt reprezentate prin valorile binare 0 (false) i 1 (true).
k:=1

a11

A1

a12
k:=k+1

a21

a22
k:=k-1

k:=k+1

k:=k+1
a31

0
0

a32

a32

A3

Fig. 8. Cutarea soluiei prin metoda relurii


Din figura 8 se observ c primul element a11 din mulimea A1, nu satisface condiiile de
continuare i, n consecin, se trece la elementul al doilea a12 din aceeai mulime. Mai departe n
vectorul X se include primul element a21 din mulimea A2, element care satisface condiiile de
continuare, i se trece la examinarea elementelor din mulimea A3.
Intruct nici unul din elementele a31, a32, a33 nu satisface condiiile de continuare, se revine la
mulimea A2 din care se alege elementul al doilea, i anume, a22. Dup aceasta se testeaz din nou
elementele mulimii A3, elementul a32 satisfcnd condiiile de continuare.
Schema general a unui algoritm recursiv bazat pe metoda relurii este redat cu ajutorul
procedurii ce urmeaz:
procedure Reluare(k:integer);
begin
if k<=n then
begin
X[k]:=PrimulElement(k);
if Continuare(k) then Reluare(k+1);
while ExistaSuccesor(k) do
begin
X[k] :=Succesor(k);
if Continuare(k) then Reluare(k+1)
end; { while }
end { then }
else PrelucrareaSolutiei;
end; {Reluare}
Procedura Reluare comunic cu programul apelant i subprogramele apelate prin variabilele
globale ce reprezint vectorul X i mulimile A1,A2,...,An. Subprogramele apelate execut urmtoarele
operaii:
PrimulElement(k) - returneaz primul element din mulimea Ak;
Continuare(k) - returneaz valoarea true dac elementele nscrise n primele k componente
ale vectorului Xsatisfac condiiile de continuare i false n caz contrar;
ExistaSuccesor(k) - returneaz valoarea true dac elementul memorat n componenta xk
are un succesor n mulimea Ak i false n caz contrar;
Succesor(k) - returneaz succesorul elementului memorat n componenta xk;
PrelucrareaSolutiei - de obicei, n aceast procedur soluia reinut n vectorul X este
afiat la ecran.
Pentru o nelegere mai clar a procesului recursiv, vom urmri execuia procedurii Reluare n
cazul mulimilor A1, A2, i A3 din figura 8.
27 | P a g i n

La execuia apelului Reluare (1) n componenta x1 a vectorului X se nscrie primul element al


mulimii A1:
X=(a11)
ntruct n cazul acestui vector apelul Continuare (1) returneaz valoarea false, se trece la
execuia instruciunii while. Apelul ExistaSuccesor (1) returneaz valoarea true i, prin urmare,
n componenta x1 a vectorului X se nscrie succesorul elementului a11:
X=(a12)
De data aceasta apelul Continuare(1) returneaz valoarea true i, prin urmare, se trece la
execuia recursiv a apelului Reluare(2). Evident, n componenta x2 a vectorului X va fi nscris
primul element din mulimea A2:
X=(a12, a21).
Pentru acest vector funcia Continuare returneaz valoarea true, fapt ce declaneaz execuia
recursiv a apelului Reluare(3).
n cazul apelului Reluare(3) componenta x3 a vectorului X ia recursiv valorile a3l, a32 i a33:
X=(a12, a21, a31);
X=(a12, a21, a32);
X=(a12, a21, a33);
ns nici unul din aceti vectori nu satisface condiiile de continuare. Dup examinarea ultimului
element din mulimea A3, funcia ExistaSuccesor returneaz valoarea false i, n consecin, se
revine n contextul apelului Reluare(2). n acest context n componenta x2 a vectorului X se nscrie
succesorul elementului a21:
X=(a12, a22)
ntruct i pentru acest vector funcia Continuare returneaz valoarea true, din nou se execut
apelul recursiv Reluare(3). ns, spre deosebire de apelul precedent, n acest caz vectorul
X=(a12, a22, a32)
satisface condiiile de continuare, fapt ce declaneaz execuia apelului recursiv Reluare(4). n acest
apel k>n i, prin urmare, procedura PrelucrareaSolutiei va afia coordonatele vectorului X la
ecran.
Exemplu. Se consider mulimile A1, A2, ..., An, fiecare mulime fiind format din mk numere
naturale. Selectai din fiecare mulime cte un numr n aa mod, nct suma lor s fie egal cu q.
Rezolvare. Vom reprezenta mulimile A1, A2, ..., An, prin liniile tabloului bidimensional (matricei)
A = ||akj||. Numrul de elemente mk al fiecrei mulimi Ak va fi reinut n componenta respectiv a
tabloului unidimensional (vectorului) M = ||mk||.
Din enunul problemei rezult c toate condiiile de continuare snt respectate numai atunci cnd
suma elementelor referite de primele k componente ale vectorului X nu depete valoarea q pentru k<n
i este egal cu q pentru k=n. Pentru a simplifica scrierea programului, vom memora n vectorul Xnumai
indicii j ai elementelor aij selectate din mulimile A1, A2, ...,An.
Program P154;
{Program bazat pe metoda relurii }
const mmax=50; { numrul maximal de mulimi}
nmax=50; { numrul maximal de elemente}
type Natural = 0.MaxInt;
Multime = array [l..nmax] of Natural;
var A:array[1..nmax] of Multime;
n:1..nmax;
{ numrul de mulimi }
M:array[1..nmax] of l..mmax; { cardinalul mulimii S[k]}
X:array[1..nmax] of l..mmax; {indicii elementelor selectate}
q:Natural;
k, j: integer;

28 | P a g i n

Indicator:boolean;
function PrimulElement(k:integer):Natural;
begin
PrimulElement:=1;
end; {PrimulElement }
function Continuare(k : integer) : boolean;
var j:integer;
suma:Natural;
begin
suma:=0;
for j:=l to k do suma:=suma+A[j, X[j]];
if ((k<n) and (suma<q)) or ((k=n) and (suma=q))
then Continuare:=true
else Continuare:=false;
end; { Continuare }
function ExistaSuccesor (k : integer) : boolean;
begin
ExistaSuccesor:=(X [k]<M [k] );
end; { ExistaSuccesor }
function Succesor(k : integer):integer;
begin
Succesor:=X[k]+1;
end; { Succesor }
procedure PrelucrareaSolutiei;
var k : integer;
begin
write('Soluia: ');
for k:=l to n do write(A[k, X[k]], ' ');
writeln;
Indicator :=true;
end; { PrelucrareaSolutiei }
procedure Reluare(k : integer)'
{ Metoda relurii - varianta recursiva }
begin
if k<=n then
begin
X[k]:=PrimulElement(k);
if Continuare(k) then Reluare(k+1);
while ExistaSuccesor(k) do
begin
X[k]:=Succesor(k);
if Continuare(k) then Reluare(k+1);
end { while }
end { then }
else PrelucrareaSolutiei;
end; { Reluare }
begin
write ('Dai numrul de mulimi n='>'' readln(n);
for k:=l to n do
begin
write ('Dai cardinalul A[', k, ']='); readln(M[k]);
write ('Dai elementele multimii A[', k, ']:');
for j:=l to M[k] do read (A[k,j]);
writeln;
end;
Write('Dai q='); readln(q);
29 | P a g i n

Indicator:=false;
Reluare(1);
if Indicator=false then writeln('Nu exista solutii');
readln;
end;
Din analiza procedurii Reluare i a ordinii de parcurgere a elementelor din mulimile A1, A2, ..., An
(fig. 8) rezult c n cazul cel mai nefavorabil vor fi generai toi vectorii Xai produsului cartezian
A1*A2*...* An. Prin urmare, complexitatea temporal a algoritmilor bazai pe metoda relurii este, ca i
n cazul trierii, O(m2), unde m=max(m1, m2, ..., mn).
Timpul real de execuie, cerut de un algoritm, depinde n mare msur de natura problemei, mai
exact, de esena condiiilor de continuare i ordinea n care apar elementele akJ n mulimile A1, A2, ...,
An. O bun alegere a condiiilor de continuare are ca efect o important reducere a numrului de calcule.
n particular, n cazul cel mai favorabil, din fiecare mulime A1, A2, ..., An va fi testat numai cte un
singur element i, evident, timpul de execuie va fi proporional cu n.
Cu regret, n prezent nu exist o regul universal care ar permite formularea unor condiii "bune"
de continuare pentru orice problem ntlnit n practic. Identificarea acestor condiii i, n consecin,
reducerea timpului de calcul depinde de iscusina programatorului. Menionm c n majoritatea
problemelor mulimile A1, A2,..., An nu snt cunoscute apriori, iar componentele vectorului X pot aparine
i ele unor tipuri structurate de date - tablouri, mulimi sau articole.
ntrebri i exerciii
1. Explicai structura general a algoritmilor bazai pe metoda relurii.
2. Indicai cazurile elementare i cele neelementare n procedura recursiv Reluare.
3. Elaborai o variant iterativ a procedurii Reluare.
4. Elaborai un studiu comparativ al algoritmilor iterativi i algoritmilor recursivi bazai pe
metoda relurii.
5. Reprezentai pe un desen similar celui din figura 8 ordinea n care snt examinate elementele
mulimilor A1, A2,..., An din programul P154:
a) A1={1}, A2={2}, A3={3}, q=4;
b) A1={1}, A2 ={2, 3}, A3={4, 5}, q=10;
c) A1={1, 2, 3}, A2={4, 5}, A3={6}, q=14;
d) A1={l,2}, A2={3,4}, A3={5,6}, A,= {7, 8}, q=20.
6. Precizai condiiile de continuare pentru programele n care se dorete generarea tuturor elementelor produsului cartezian A1 * A2*..,*An. Pentru a verifica rspunsul, scriei i depanai
programul respectiv.
7. Indicai pe desenul din figura 8 ordinea de parcurgere a elementelor din mulimile A1,A2, A3 n
cazurile cele mai favorabile i cele mai nefavorabile.
8. Se consider mulimea B={b1, b2,..., bn} format n primele n litere ale alfabetului latin. Elaborai un program bazat pe metoda relurii care genereaz toate submulimile Bi= Bi B, formate
exact din q litere.
Indicaie. Fiecare submulime Bi poate fi reprezentat prin vectorul caracteristic X= ||xk||n, unde
1,
*@ A6 ;
=@ =
0,
C ' &D D.
Este clar c submulimea Bi satisface condiiile problemei dac x1+x2+...+xn=q.
9. Colorarea hrilor. Pe o hart snt reprezentate n ri, n 30. n memoria calculatorului harta
este redat prin matricea A=||aij||nxm unde
1,
D F. , G (H & 1. .
6: =
0,
C ' &D D.
Determinai numrul minim de culori m necesare pentru a colora harta. Evident, se cere ca oricare
dou ri vecine s fie colorate diferit.
10. Labirintul. Se consider planul unui labirint desenat pe o foaie de hrtie liniat n ptrele
(fig. 9). Ptrelele haurate reprezint obstacolele, iar cele nehaurate - camerele i coridoarele
labirintului.
30 | P a g i n

1
2
3

Fig. 9. Planul unui labirint


n memoria calculatorului planul labirintului este redat prin matricea A=||aij||nxm, 1 n,m 30, unde
1,
I &D &HF , G .(&. HD &
6: =
0,
C ' &D D.
Cltorul se poate deplasa dintr-un ptrel nehaurat n alt ptrel nehaurat numai atunci cnd
ele au o latur comun. Elaborai un program care gsete, dac exist, un drum din ptrelul B n
ptrelul C.
11. Se consider n (n30) sculee, numerotate prin 1, 2, 3,..., n. Sculeul i conine mt monede de
aceeai valoare Vi. Elaborai un program care afieaz la ecran modul de plat a unei sume p cu
monedele din sculee.
12. Elaborai un program care afieaz la ecran toate modurile de a descompune un numr natural
n sum de k numere naturale distincte. De exemplu, pentru n = 9 i k = 3 soluiile snt: 1+2+6,
2+3+4, 1+3+5.
13. Efectuai un studiu comparativ al algoritmilor bazai pe metoda trierii i algoritmilor bazai pe
metoda relurii n cazul problemelor din exerciiile 8 i 12.
2.5. Metoda desparte i stpnete
Metoda desparte i stpnete (n latin divide et impera) este o metod general de elaborare a
algoritmilor care presupune:
1) mprirea repetat a unei probleme de dimensiuni mari n dou sau mai multe subpro-bleme de
acelai tip, dar de dimensiuni mai mici;
2) rezolvarea subproblemelor n mod direct, dac dimensiunea lor permite aceasta, sau mprirea
lor n alte subprobleme de dimensiuni i mai mici;
3) combinarea soluiilor subproblemelor rezolvate pentru a obine soluia problemei iniiale.
n limbaj matematic, admitem c la un anumit pas al algoritmului se d o mulime ordonat
A=(ai, ai+1 ..., aj)
i c trebuie efectuat o prelucrare oarecare asupra elementelor sale. Pentru a mpri problema curent
n dou subprobleme de aproximativ aceleai dimensiuni, stabilim
m = ( j - i) div 2
i mprim mulimea A n dou submulimi, care vor fi prelucrate separat:
A1=(ai, ai+1 ..., ai+m);A2= (ai+m+1, ai+m+1, ai+m+2 ..., aj);
n continuare, mulimile A] i A2 se mpart din nou n cte dou submulimi, respectiv A1-1, A1-2, i
A2-1, A2-2, Acest proces va continua pn cnd soluiile ce corespund submulimilor curente vor putea fi
calculate n mod direct.
Pentru exemplificare, n figura 10 este prezentat modul de mprire a mulimii A=(a1, a2, ..., a7) n
cazul divizrii problemelor curente n cte dou subprobleme de acelai tip.
A=(a1, a2, a3, a4, a5, a6, a7)
A=(a1, a2, a3, a4)

A1-1=(a1, a2)

A1-2=(a3, a4)

A2=(a5, a6, a7)

A2-1=(a5, a6)

A2-2=(a7

Fig. 10. Descompunerea mulimii A n submulimi


31 | P a g i n

Schema general a unui algoritm bazat pe metoda desparte i stpnete poate fi redat cu
ajutorul unei proceduri recursive:
procedure DesparteSiStapineste (i, j:integer; var x:tip);
var m : integer;
xl, x2: tip;
begin
if SolutieDirecta(i,j) then Prelucrare(i,j,x)
else
begin
m: = (j - i) div 2;
DesparteSiStapineste(i' i+m' xl);
DesparteSiStapineste(i+m+1'j,x2>);
Combina(xl,x2,x);
end;
end;
Parametrii i i j din antetul procedurii definesc submulimea curent (ai ai+j, ..., aj) supus
prelucrrii. Funcia SolutieDirecta returneaz valoarea true dac subProblema curent admite o
rezolvare direct i false n caz contrar. Procedura Prelucrare returneaz prin parametrul x soluia
subproblemei curente, calculat n mod direct. Dac calculul direct este imposibil, se execut dou
apeluri recursive - unul pentru submulimea (ai, a,+1, ..., am) i altul pentru submulimea (ai+m+1, al+m+2,
..., aj). Procedura Combina prelucreaz soluiile xl i x2 ale subProblemelor respective i returneaz
soluia x a problemei curente.
Exemplul 1. Se consider mulimea A={a1, a2, ..., an) format din n numere reale. Elaborai un
program care determin numrul maximal din aceast mulime.
Rezolvare. n programul ce urmeaz mulime A este reprezentat printr-un tablou unidimensional
cu n componente. Se consider c scMia unei subprobleme poate fi calculat direct numai atunci cnd
mulimea (ai ..., aj) este format din unul sau dou numere. Evident, n astfel de cazuri x = ai sau x =
max(ai aj).
Program P155;
{Gsirea elementuli maximal Prin metoda desparte i stpnete}
const nmax=100;
var A:array[1...nmax] of real;
i, n : 1...nmax;
x : real;
function SolutieDirecta (i, j:integer): boolean;
begin
SolutieDirecta:=false ;
if (j-i<2) then SolutieDirecta:=true;
end; { SolutieDirecta }
procedure Prelucrare(i, j : integer; var x : real);
begin
x:=A[i];
if A[i]<A[j] then x:=A[j];
end; { Prelucrare }
procedure Combina(xl, x2:real' var x:real);
begin
x:=xl;
if xl<x2 then x:=x2;
end; { Combina }
procedure DesparteSiStapineste(i, j:integer; var x:real);
var m:integer;
xl, x2 : real;
begin
if SolutieDirecta(i, j) then Prelucrare (i, j, x)
32 | P a g i n

else
begin
m:=(j-i) div 2;
DesparteSiStapineste(i, i+m, xl);
DesparteSiStapineste(i+m+1, j, x2);
Combina(xl, x2, x);
end;
end; { DesparteSiStapineste }
begin
write('Dai n='); readln(n);
writeln('Dai ', n, ' numere reale');
for i:=l to n do read(A[i]); writeln;
DesparteSiStapineste (1, n, x); writeln('Numrul maximal x=', x);
readln;
readln;
end.
n programul P155 la fiecare apel al procedurii DesparteSiStapineste problema curent
este rezolvat direct sau mprit n dou subprobleme de dimensiuni aproximativ egale. Evident,
metoda desparte i stpnete admite mprirea problemelor curente ntr-un numr arbitrar de
subprobleme, nu neaprat n dou. n exemplul ce urmeaz problema curent - tierea unei plci de arie
maxim - este mprit n patru subprobleme de acelai tip, dar de dimensiuni mai mici.
Exemplul 2. Se consider o plac dreptunghiular de dimensiunile L*H. Placa are n guri
punctiforme, fiecare gaur fiind definit prin coordonatele (xi, yi,). Elaborai un program care decupeaz
din plac o bucat de arie maxim, dreptunghiular i fr guri. Snt admise doar tieturi de la o
margine la alta pe direcii paralele cu laturile plcii - verticale sau orizontale (fig. 11).
Rezolvare. Vom defini placa curent prin vectorul P=(a, b, c, d), unde a i b snt coordonatele
colului stnga-jos, iar c i d - coordonatele colului dreapta-sus. Evident, placa iniial se definete prin
(0, 0, L, H). Metoda desparte i stpnete poate fi realizat dup cum urmeaz:
- iniial stabilim aria maxim Smax=0;
- dac placa curent nu are guri, problema poate fi soluionat direct, comparnd aria curent cu
valoarea Smax;
y
H

y1

a)

1
n
0

xi

L
y

y
H
d
y1
b

P1

H
d
y1

P2

P3

b)

P4
b

c)

xi

xi

Fig. 11. Tierea unei plci de arie maxim: a - placa iniial; b - tierea pe vertical; c - tierea pe orizontal
33 | P a g i n

- n caz contrar alegem o gaur arbitrar (xi, yi) prin care tiem placa curent n plci mai mici,
indicate n figura 11:
P1=(a, b, xi, d), P2=( xi, b, c, d) sau P3=(a, yi, c, d), P4=(a, b, c, yi);
- n continuare examinm n acelai mod fiecare din plcile obinute n rezultatul tierii,
memornd consecutiv n variabila Smax aria plcii decupate.
Program P156;
const nmax=100;
var L, H:real;n:1...nmax; X,Y:array[1..nmax] of real;
Smax, amax, bmax, cmax, dmax:real; i:integer;
function SolutieDirecta (a, b, c, d:real;
var i:integer):boolean;
label 1;
var j:integer;
begin
SolutieDirecta:=true;
for j:=1 to n do
if (X[j]>a) and (X[j]<c) and (Y[j]>b) and (Y[j]<d) then
begin
SolutieDirecta:=false; i : = j;
goto 1;end;
l:end; { SolutieDirecta }
procedure PrelucrareaSolutiei (a, b, c, d: real);
var S : real;
begin
S:=(c-a)*(d-b);
if S>=Smax then
begin
Smax:=S; amax:=a; bmax:=b; cmax:=c; dmax:=d;end;
end; { PrelucrareaSolutiei }
procedure DesparteSiStapineste(a, b, c, d:real);
var i:integer;
begin
writeln('Examinam placa {', a:5:1,' ', b:5:l, ' ',
c:5:l, ' ', d:5:l, ')');readln;
if SolutieDirecta (a, b, c, d, i)
then PrelucrareaSolutiei(a, b, c, d)
else begin
DesparteSiStapineste(a, b, Xfi], d);
DesparteSiStapineste(X[i], b, c, d);
DesparteSiStapineste (a, Y[i], c, d);
DesparteSiStapineste (a, b, c, Y[i]);
end;
end; { DesparteSiStapineste }
begin
writeln('Dati dimensiunile L,H'); readln(L, H);
write('Dati n='); readln(n);
writeln('Dati coordonatele X[i],Y[i]');
for i:=l to n do read(X[i], Y[i]);
writeln; Smax:=0;
DesparteSiStapineste(0, 0, L, H);
writeln('Placa de arie maxima (', amax:5:1, ' ', bmax:5:1, ' ',
cmax:5:1, ' ', dmax:5:1, ')');
writeln('Smax=' , Smax:5:2);
readln;
end.
34 | P a g i n

Funcia SolutieDirecta din programul P156 returneaz valoarea true dac placa (a, b, c d)
nu are guri i false n caz contrar. n cazul valorii false, funcia returneaz suplimentar numrul de
ordine i al uneia din gurile plcii. Aceast gaur este depistat verificnd relaiile a < x1< c i b <y1< d.
Procedura PrelucrareaSolutiei compar aria plcii curente S=(c-a)(d-b) cu valoarea Smax.
Dac S Smax, procedura memoreaz placa curent n vectorul (amax, bmax, cmax dmax).
Complexitatea temporal a algoritmilor bazai pe metoda desparte i stpnete depinde de
numrul de subprobleme k n care este divizat problema curent i de complexitatea algoritmilor
destinai rezolvrii directe a subproblemelor respective. S-a demonstrat c n majoritatea cazurilor
timpul cerut de un algoritm bazat pe metoda desparte i stpnete este de ordinul n log2n sau n2 log2n,
deci polinomial.
Programele elaborate n baza metodei desparte i stpnete snt simple, iar timpul de execuie este
relativ mic. Cu regret, aceast metod nu este universal, ntruct ea poate fi aplicat numai atunci cnd
prelucrarea cerut admite divizarea problemei curente n subprobleme de dimensiuni mai mici. De
obicei, aceast proprietate nu este indicat explicit n enunul problemei i gsirea ei, dac exist, cade
n sarcina programatorului.
ntrebri i exerciii
1. Explicai schema de calcul a algoritmilor bazai pe metoda desparte i stpnete.
2. Care snt avantajele i neajunsurile metodei desparte i stpnete?
3. Utiliznd metoda desparte i stpnete, elaborai un program care determin suma elementelor
mulimii A= {a1, a2,.... an} format din n numere reale.
4. Indicai pe un desen similar celui din figura 11 ordinea examinrii plcilor curente pe parcursul
executrii programului P156:
- dimensiunea plcii iniiale: 3x4;
- numrul de guri ale plcii iniiale: 3;
- coordonatele gurilor: (1, 1); (1, 2); (2, 2).
5. Estimai necesarul de memorie i complexitatea temporal a programelor P155 i P156.
6. Schiai un algoritm care rezolv problema tierii unei plci de arie maxim prin metoda trierii.
Estimai complexitatea temporal i necesarul de memorie al algoritmului elaborat. Efectuai un
studiu comparativ al algoritmilor bazai pe metoda trierii i algoritmilor bazai pe metoda
desparte i stpnete.
7. Cutarea binar. Se consider mulimea A= {a1, a2,.... an} elementele creia snt numere
ntregi sortate n ordine cresctoare. Elaborai un program care determin dac mulimea A
conine numrul dat p. Estimai complexitatea temporal a programului elaborat.
8. Utiliznd metoda desparte i stpnete, elaborai un program care determin cel mai mare
divizor comun al numerelor naturale a1, a2, ..., an.
9. Sortarea prin interclasare. Elaborai un program care sorteaz elementele irului (a1, a2,..., an)
n ordine cresctoare dup cum urmeaz:
- divizm irul curent n dou subiruri de aproximativ aceeai lungime;
- dac subirul conine numai dou elemente, aranjm elementele respective n ordine
cresctoare;
- avnd dou subiruri sortate, le interclasm pentru a obine irul curent sortat.
Se consider c elementele irului care trebuie sortat snt numere ntregi. De exemplu, n urma
interclasrii subirurilor sortate (-3, 4, 18) i (-2, -l, 15) obinem irul (-3, -2, -1,4, 15, 18).
10. Problema turnurilor din Hanoi.2 Se consider trei tije notate prin 1, 2 i 3 i n discuri perforate de dimensiuni diferite (fig. 12). Iniial toate discurile snt pe tija 1, aranjate n ordinea
descresctoare a diametrelor, considernd sensul de la baz la vrf. Elaborai un program care
mut toate discurile pe tija 2 folosind tija 3 ca tij de manevr i respectnd urmtoarele reguli:
- la fiecare pas se mut un singur disc;
- orice disc poate fi aezat doar peste un disc cu diametrul mai mare.

Denumirea problemei provine de la o veche legend hindus conform creia dup mutarea celor 64 de discuri va veni
sfritul lumii.

35 | P a g i n

Fig. 12. Problema turnurilor din Hanoi

Indicaii. Mutarea unui disc de pe tija i pe tijay poate fi reprezentat ca o pereche (i,j) cu i,j {1, 2, 3},
ij. Prin H(m, i,j) vom nota irul mutrilor necesare pentru a muta primele m discuri (evident, cele
situate cel mai sus) de pe tija i pe tija j. De exemplu,
H(1, 1,2)=(1,2);
H(2, 1, 2)=(1, 3), (1,2), (3,2);
H(3, 1,2)=(1,2), (1,3), (2,3), (1,2), (3,1), (3,2), (1,2).
n general,
, G , I. &DH 0 = 1;
K 0, , G =
K 0 1, , L , , G , K 0 1, L, G , I. &DH 0 > 1

unde k=6-i-j. Prin urmare, problema celor n discuri se reduce la rezolvarea a dou subprobleme de
acelai tip pentru (n - 1) discuri.
2.6. Programarea dinamic
Programarea dinamic reprezint o metod de rezolvare a problemelor soluia crora poate fi
privit ca rezultatul unui ir de decizii (d1,d2,..., dp,..., dq). Fiecare decizie dp trebuie s furnizeze o
soluie local care optimizeaz un criteriu global de calitate, de exemplu, costul unei cltorii,
lungimea drumului parcurs, greutatea transportat, spaiul ocupat de un fiier pe disc etc. Pentru
aplicarea acestei metode, este necesar ca problema de rezolvat s satisfac principiul optimalitii:
dac (d1, d2,..., dp, dp+u ..., dq) este un ir optim de decizii, atunci irurile (d1, d2, ..., dp) i (dp, ..., dq)
trebuie s fie optimale.
De exemplu, dac drumul cel mai scurt ntre Chiinu i Bli trece prin Orhei, atunci ambele
poriuni din acest drum - Chiinu-Orhei i Orhei-Bli - de asemenea vor fi cele mai scurte. Prin
urmare, problemele n care se cere determinarea celui mai scurt drum satisfac principiul optimalitii.
n PASCAL metoda programrii dinamice poate fi realizat utiliznd tablouri componentele crora
se calculeaz cu ajutorul unor relaii de recuren. n general, relaiile de recuren snt de urmtoarele
dou tipuri:
1) Fiecare decizie dp depinde de deciziile dp+l, ..., dq. Spunem n acest caz c se aplic metoda
nainte. Deciziile vor fi luate n ordinea dq, dq-1, ..., d1.
2) Fiecare decizie dp depinde de deciziile d1, ..., dp-1. n acest caz spunem c se aplic metoda
napoi. Deciziile vor fi luate n ordinea d1,d2,..., dq .
Evident, pentru fiecare problem propus, programatorul va verifica mai nti respectarea
principiului optimalitii i n cazul unui rspuns pozitiv va deduce relaiile respective de recuren. n
caz contrar, problema nu poate fi rezolvat prin metoda programrii dinamice.
Exemplu. Planul unui teren aurifer de form dreptunghiular cu dimensiunile nxm este format din
zone ptrate cu latura 1 (fig. 13). n zona din colul nord-vest se afl un robot. Din zona cu coordonatele
(i,j), 1 in, 1 j m, robotul poate extrage cel mult aij grame de aur. Din considerente tehnologice pe
teren exist restricii de deplasare: la fiecare pas robotul se poate mica din zona curent numai n una
din zonele vecine - cea din est sau cea din sud. Elaborai un program care determin cantitatea maxim
de aur Cmax care poate fi extras de robot.

36 | P a g i n

1
2

Robotul

aij

Fig. 13. Zonele unui teren aurifer


Rezolvare. n calculator informaia despre un teren aurifer poate fi reprezentat cu ajutorul
tabloului bidimensional A = ||aij||nxm, unde aij reprezint cantitatea de aur ce poate fi extras din zona cu
coordonatele (i, j). Pentru exemplificare, n continuare vom examina un teren aurifer descris cu ajutorul
tabloului ce urmeaz:
1

A=

Pentru a sistematiza calculele, introducem n studiu tabloul bidimensional C = ||cij||nxm, unde


componenta cij reprezint cantitatea maxim de aur pe care o poate extrage robotul deplasndu-se din
zona iniial (1,1) n zona cu coordonatele (i,j). Evident, Cmax= cmn.
Conform condiiilor problemei, n oricare zon ii, j) se poate intra numai prin una din zonele
vecine: prin cea din vest cu coordonatele (i,j - 1) sau prin cea din nord cu coordonatele (i- 1, j). Prin
urmare, cantitatea maxim de aur pe care o poate extrage robotul ajungnd n zona (i,j) este dat de
formula recurent
cij =aij + max (cij, ci-1,j)
Ordinea de calcul a componentelor cij ale tabloului C este impus de modul de deplasare a
robotului, i anume:
pasul 1: c11;
pasul 2: c21, c21;
pasul 3: c31, c22, c13;
...
pasul n+m-1:cnm
Se observ c la pasul k vor fi calculate numai acele elemente ctj ale tabloului C pentru care se
respect egalitatea i + j - 1 = k. Ordinea n care snt calculate elementele cv n cazul tabloului A de mai
sus este prezentat n figura 14.
Pentru a evita verificrile legate de calcularea indicilor i i j, n programul ce urmeaz elementele
cij din prima linie i din prima coloan snt calculate separat de celelalte componente ale tabloului C.
Program P157;
var A , C : array [1..50, 1..50] of real;m, n, i, j, k : integer;
function Max(a, b : real) : real;
begin
if a>b then Max:=a else Max:=b; end; { Max }
begin
write('Dati valorile n, m: '); readln(n, m);
writeln('Dai componentele tabloului A');
for i:=1 to n do
for j:=l to m do read(A[i,j]);
writeln;
C[l,l]:=A[1,1];
37 | P a g i n

for i:=2 to n do C[i,1]:=A[i,1]+C[i-1,1];


for j:=2 to m do C [1,j]:=A[1,j]+C[1,j-1];
for k:=2 to n+m-1 do
for i:=2 to n do for j:=2 to m do
if (i+j-l)=k then
C[i,j]:=A[i,j]+Max(C[i,j-l], C[i-l,j]);
writeln('Cmax=',C[n,m]);
readln;
end;
k = 1
1

3
4

k = 2
5

10

k = 5

k = 3
5

k = 6

10 15

14 18

3
4

k = 4
4

10

14

10 12

17

k = 7

10 15

10 12 21
17 19

k = 8

10 15

14 18 24

10 12 21 28 33

17 19 24 32 38

10 15

14 18 24

14 18 24

10 12 21 28 33

10 12 21 28 33

17 19 24 32

17 19 24 32 38

Fig. 14. Calcularea elementelor tabloului C


Complexitatea temporal a algoritmilor bazai pe metoda programrii dinamice depinde de natura
relaiilor de recuren i n majoritatea cazurilor este polinomial. De exemplu, programul P157 are
complexitatea O(n3).
ntrebri i exerciii
1. Explicai esena principiului optimalitii.
2. n ce ordine pot fi luate deciziile n procesul soluionrii unei probleme prin metoda programrii
dinamice?
3. Explicai ordinea de luare a deciziilor n problema deplasrii robotului pe un teren aurifer.
4. Demonstrai c problema deplasrii robotului pe un teren aurifer satisface principiul optimalitii.
5. Estimai necesarul de memorie i timpul de execuie a programului P157.
6. Cum credei, care snt avantajele i neajunsurile algoritmilor bazai pe metoda programrii
dinamice?
7. Problema discret a rucsacului. O persoan are un rucsac cu care pot fi transportate unul sau
mai multe obiecte greutatea sumar a crora nu depete valoarea Gmax. Pentru fiecare obiect i
(i=1, 2,..., n) se cunoate greutatea gi i ctigul ci, care se obine n urma transportului su la
destinaie. Elaborai un program care determin ce obiecte trebuie s transporte persoana n aa
fel, nct ctigul s fie maxim. Obiectele respective nu pot fi tiate n fragmente mai mici.
8. Drumul de cost minim. Se consider o reea format din n orae. Intre unele orae exist curse
directe de autobuz. Costul unui bilet la o curs direct din oraul i n oraul j este de cij lei.
Evident, costul unei curse directe ntotdeauna este mai mic dect costul unei cltorii cu transbordri: cij < cik + ckj. Elaborai un program care determin costul minim al unei cltorii din
oraul i n oraul j.
9. Arhivarea fiierelor. E cunoscut faptul c pe suporturile de memorie extern orice fiier este
memorat ca o secven de cifre binare. Pentru a economisi spaiul de memorare, programele de
arhivare descompun fiierul iniial ntr-o succesiune de cuvinte binare ce aparin unui dicionar i
nscriu pe disc numai numerele de ordine ale cuvintelor respective. De exemplu, n cazul unui
dicionar format din 5 cuvinte binare:
38 | P a g i n

1) 0;
2) 1;
3) 000;
4) 110;
5) 1101101,
fiierul iniial 10001101101110 va fi memorat pe disc n forma 2354. Elaborai un program care
descompune orice secven binar ntr-un numr minim de cuvinte aparinnd dicionarului propus.
10. Triangularea polinoamelor. Procesarea imaginilor cu ajutorul calculatoarelor presupune descompunerea poligoanelor n figuri geometrice mai simple, i anume, n triunghiuri. Admitem c
poligonul convex P,P2,...Pn este definit prin coordonatele (xi, yi) ale vrfurilor Ph i= 1,2,..., n.
Elaborai un program care descompune poligonul PIP2--P n triunghiuri trasnd n acest scop un
set de coarde PjPm, j m, j, m {1, 2, ..., n}, care nu se intersecteaz. Se cere ca lungimea total a
coardelor respective s fie minim.
2.7. Metoda ramific i mrginete
n metoda ramific i mrginete (n englez branch and bound) cutarea soluiei unei probleme
se efectueaz prin parcurgerea unui arbore de ordinul m, denumit arborele soluiilor. Nodurile acestui
arbore reprezint mulimea strilor posibile S= {s1 s2,..., sn} n care se poate afla un sistem, de exemplu,
configuraiile pieselor pe o tabl de ah, poziia unui automobil pe harta drumurilor naionale, poziiile
capului de scriere-citire al unei uniti de disc magnetic etc. Legturile si-sj de tipul tat-fiu indic faptul
c din starea si sistemul poate trece direct n starea sj n urma unor transformri sau operaii relativ
simple (fig. 15). Pentru exemplificare amintim deplasarea pieselor fcut alternativ de adversari n
cursul unei partide de ah, trecerea automobilului dintr-o localitate n alta, executarea unei comenzi de
scriere-citire etc. Evident, n astfel de cazuri soluia problemei poate fi reprezentat ca un drum ce leag
nodul-rdcin cu unul din nodurile terminale i care optimizeaz un criteriu de calitate, de exemplu,
numrul de mutri ntr-o partid de ah, distana parcurs de automobil, timpul de scriere-citire a unui
fiier .a.m.d.
Starea
iniial

S2

S1

S3

S4

...

S5

Stare
final

S10

S11

S6

S7

S8

S9

...

...

...

...

Stare
final

S12

...

Fig. 15. Arborele soluiilor


Formal, astfel de probleme pot fi rezolvate prin metoda trierii, efectund n acest scop urmtoarele
operaii:
- parcurgem arborele soluiilor n adncime sau n lime i gsim strile finale ale sistemului;
- construim mulimea tuturor drumurilor posibile ce leag starea iniial de strile finale;
- din mulimea drumurilor posibile l alegem pe cel ce optimizeaz criteriul de calitate.

39 | P a g i n

ntruct parcurgerea complet a arborelui necesit foarte mult timp, pentru a micora numrul de
noduri vizitate, n metoda ramific i mrginete ordinea de parcurgere este impus de valorile unei
funcii f: S R, denumit funcie de cost. Aceast funcie este definit pe mulimea de noduri ale
arborelui soluiilor, valoarea f(si) caracteriznd "cheltuielile" necesare pentru a trece din starea curent si,
n una din strile finale ale subarborelui de rdcin si.
Vizitarea nodurilor unui arbore n ordinea impus de valorile funciei de cost se numete
parcurgere de cost minim. Aceast parcurgere se realizeaz memornd nodurile active ntr-o list din
care la fiecare pas se extrage nodul de cost minim. Pentru comparare amintim c la parcurgerea arborilor
n limea sau n adncimea nodurilor active se memorizeaz ntr-o coad sau, respectiv, ntr-o stiv.
Fiind definit o funcie de cost, metoda ramific i mrginete presupune efectuarea urmtoarelor
operaii:
1. Etapa iniial: se creeaz lista nodurilor active. La nceput aceast list conine un singur
element - rdcina arborelui soluiilor.
2. Etapa ramific: din lista nodurilor active se extrage nodul de cost minim i se genereaz toi
descendenii acestuia.
3. Etapa mrginete: pentru fiecare descendent se calculeaz valoarea funciei de cost.
Descendenii costul crora este inacceptabil (de obicei, subarborii respectivi nu conin stri finale) snt
exclui din studiu. Descendenii rmai se includ n lista nodurilor active.
Punctele 2 i 3 se repet pn cnd se ajunge la una din strile finale sau lista nodurilor active
devine vid. Evident, n ultimul caz soluia problemei nu a fost gsit.
Pentru exemplificare, n tabelul 7 este reprezentat ordinea n care snt vizitate nodurile arborelui
din figura 15. Valorile funciei de cost snt indicate direct pe desen lng nodurile respective. Se
consider c descendenii costul crora depete valoarea 9 snt inacceptabili.
Tabelul 7. Parcurgerea de cost minim
Descendenii
Nr.
Lista nodurilor
Nodul de cost
Etapa
nodului de cost
crt.
active
minim
minim
iniial
1.
{s1}

ramific
2.
s1
s2, s3, s4
mrginete
3.
{s3, s4}

4.
ramific
{ s3 }
s4
s8, s9
mrginete
5.
{s8, s3}

ramific
6.
{s8}
s3
s5, s6, s7
mrginete
7.
{s8, s5, s6, s7}

ramific
8.
{s8,s6, s7}
s5
s10, s11
mrginete
9.
{s8,s6, s7, s10, s11}

stop
10.
{s8,s6, s7, s11}
s10

n cazul arborelui din figura 15 parcurgerea de cost minim se termin cnd n lista nodurilor active
apare starea final s10. Intruct orice drum ce leag o stare final de starea iniial poate fi construit
urmnd legturile de tipul fiu-tat, soluia problemei pentru exemplul n studiu este (s1, s3, s5, s10).
Schema de calcul a metodei ramific i mrginete poate fi redat cu ajutorul urmtoarei secvene
de instruciuni PASCAL:
InitializareaListei;
repeat
Ramifica;
Margineste;
until Gasit or ListaEsteVida;
Complexitatea algoritmilor bazai pe metoda ramific i mrginete depinde de faptul cum este
definit funcia de cost f: SR. n cazul unor definiii nereuite vor fi vizitate toate nodurile arborelui
soluiilor, iar complexitatea temporal a algoritmului respectiv va fi egal cu cea a algoritmilor bazai pe
metoda trierii. Din contra, o alegere reuit a funciei de cost permite excluderea din studiu a
subarborilor care nu conin strile finale dorite. n cursurile avansate de informatic se demonstreaz c
o definiie "bun" a funciei de cost poate fi reprezentat n forma:
40 | P a g i n

f(si) = niv(si) + h(si),


unde niv(s,) este nivelul nodului st, iar funcia h(st) estimeaz complexitatea transformrilor
(operaiilor) necesare pentru a ajunge din starea curent si n una din strile finale ale subarbo-relui de
rdcin si.
De exemplu, n cazul unei partide de ah funcia h(si) poate s exprime numrul de piese grele ale
adversarului, n cazul unui automobil - distana pn la punctul de destinaie, iar n cazul unei uniti de
disc magnetic - timpul necesar pentru a citi sau a nscrie informaia dorit.
Accentum faptul c aplicarea practic a metodei ramific i mrginete este posibil numai
atunci cnd valorile f(si) ale funciei de cost pot fi calculate fr a construi subarborele de rdcin si. Cu
regret, n prezent nu snt cunoscute reguli universale care ar asigura definirea univoc a funciei de cost
pentru orice tip de problem. Prin urmare, complexitatea algoritmilor bazai pe metoda ramific i
mrginete depinde n mare msur de experiena i iscusina programatorului.
1.
2.
3.
4.
5.
6.

7.

ntrebri i exerciii
Pentru care tip de probleme poate fi aplicat metoda ramific i mrginete?
Cum se construiete arborele soluiilor? Ce informaie conine fiecare nod al arborelui?
Cum se reprezint soluia unei probleme n metoda ramific i mrginete?
Care este destinaia funciei de cost ? Cum poate fi definit aceast funcie?
Explicai schema de calcul a metodei ramific i mrginete.
Scriei o procedur PASCAL care realizeaz parcurgerea de cost minim. Se consider c fiecare
nod al arborelui conine un cmp n care este indicat valoarea funciei de cost. Estimai necesarul
de memorie i complexitatea temporal a procedurii elaborate.
Indicai ordinea n care snt vizitate nodurile arborelui din figura 75 n urmtoarele cazuri:
a) parcurgerea n lime;
b) parcurgerea n adncime;
c) parcurgerea de cost minim.

8. Snt oare vizitate toate nodurile unui arbore n cazul parcurgerii de cost minim? Argumentai
rspunsul Dvs.
9. Schiai un algoritm care caut soluia optim parcurgnd arborele soluiilor n lime (n
adncime). Estimai necesarul de memorie i complexitatea temporal a algoritmului elaborat.
10. Dai exemple de probleme ce pot fi soluionate prin metoda ramific i mrginete.
11. ncercai s desenai nodurile de pe nivelele 0, 1 i 2 ale unui arbore ce reprezint jocul Dvs.
preferat, de exemplu, lupta maritim, ah, dame etc.
12. Cum credei, care snt avantajele i neajunsurile algoritmilor bazai pe metoda ramific i
mrginete?
2.8. Aplicaiile metodei ramific i mrginete
Metoda ramific i mrginete poate fi aplicat numai problemelor din enunul crora rezult
regulile sau operaiile necesare pentru generarea direct a arborelui soluiilor. De obicei, n astfel de
probleme se simuleaz comportamentul unor parteneri ce au scopuri sau tendine contrare: aplicaii
militare, scenarii de dezvoltare economic n condiii de concuren, jocuri de ah sau de dame etc.
Menionm c existena unor reguli de generare direct a descendenilor face inutil construirea
complet a arborelui soluiilor, micorndu-se astfel volumul de memorie intern cerut de algoritm.
Implementarea practic a metodei ramific i mrginete presupune rezolvarea urmtoarelor
probleme:
- determinarea mulimii de stri care, n funcie de natura problemei de rezolvat, poate fi finit sau
infinit;
- stabilirea transformrilor (operaiilor) elementare n urma crora sistemul trece din-tr-o stare n
alta;
- definirea funciei de cost;
- definirea structurilor de date necesare pentru a reprezenta strile sistemului, arborele soluiilor
i lista nodurilor active;
- elaborarea subprogramelor necesare pentru generarea descendenilor, calcularea funciei de cost,
selectarea nodurilor de cost minim .a.m.d.

41 | P a g i n

Pentru exemplificare vom analiza modul de implementare a metodei ramific i mrginete n


cazul jocului Perspico, cunoscut i sub denumirea jocul 15. In acest joc snt 15 plcue ptrate
numerotate de la 1 la 15 (fig. 16).

Fig. 16. Jocul Perspico; a starea iniial; b starea final;


Plcuele snt ncadrate ntr-o ram ptrat de dimensiunile 4x4, o poziie din interiorul ramei fiind
liber. Orice plcu vecin cu poziia liber poate fi mutat la locul respectiv. Se cere a trece, folosind
mutrile permise, din starea iniial n starea final.
Starea curent a jocului Perspico poate fi exprimat printr-o distribuie a celor 15 plcue n cele
16 poziii libere. Numerotnd placa liber prin 0, putem scrie:
type Stare = array [1..4, 1..4] of 0..15;
Menionm c numrul de stri posibile este dat de numrul aranjamentelor 16 din 16 i constituie:

M = N = 16! 2,09 10 Q
pe cnd capacitatea memoriei interne a calculatoarelor personale este de ordinul 108 octei.
Trecerea dintr-o stare n alta poate fi efectuat prin "deplasarea" plcuei lips spre stnga, sus,
dreapta, jos (bineneles cnd acest lucru este posibil). n PASCAL aceast "deplasare" se exprim prin
modificarea componentelor respective ale variabilelor de tip Stare.
Cunoscnd strile sistemului i regulile de trecere dintr-o stare n alta, putem construi arborele
soluiilor, o parte din care este prezentat n figura 17.
ntruct plcua liber poate fi deplasat pe trasee ciclice, arborele soluiilor este infinit. Pentru a
evita revenirea la strile deja examinate, vom include n arbore numai strile curente noi. De asemenea,
lund n considerare faptul c memoria intern a calculatoarelor personale nu permite stocarea tuturor
strilor posibile, n continuare vom examina numai primele 10-15 nivele ale arborelui soluiilor.
Evident, n prezena acestei restricii nu se mai garanteaz gsirea, chiar dac exist, a irului de mutri
permise care transform starea iniial n stare final.
Funcia de cost: S R poate fi definit n forma:
f(si) = niv(si) + h(si)
unde componenta h(si) caracterizeaz numrul de mutri necesare pentru a trece din starea curent s, n
stare final. Intruct acest numr nu poate fi calculat fr a construi mai nti subarborele de rdcin si,
vom folosi o aproximare dat fiind lipsa numrului necesar de mutri:
h(si) = numrul de plcue care nu se afl la locul lor
De exemplu, pentru arborele din figura 17 avem:
f(s1) = niv(s1) + h(s1) = 0+4=4;
f(s2) = niv(s2) + h(s2) = 1+5=6;
f(s3) = niv(s3) + h(s3) = 1+3=4;
f(s4) = niv(s4) + h(s4) = 2+2=4;
f(s7) = niv(s7) + h(s7) = 3+0=3;
Arborele soluiilor i lista nodurilor active pot fi reprezentate n memoria calculatorului cu ajutorul
urmtoarelor structuri de date:
42 | P a g i n

type AdresaNod = ^Nod;


Nod = record
S : Stare;
Nivel, Cost : integer;
Drum : boolen;
D : array [1..4] of AdresaNod;

Tata : AdresaNod; end;


AdresaCelula = ^Celula;
Celula = record
ReferintaNod : AdresaNod;
Urm : AdresaCelula;
end;
var Radacina : AdresaNod;
BazaListei : AdresaCelula;
S1

Starea
iniial

sus

jos

S2

stnga

S3

dreapta
S5

S4
4

...

...

jos

...

...

S6

dreapta
S7
3
Starea
final

Fig. 17. Arborele soluiilor n jocul Perspico


43 | P a g i n

Fiecare nod al arborelui soluiilor conine cmpurile informaionale S,Nivel,Cost, Drum i


cmpurile de legtur D,Tata. Cmpul Drum se folosete pentru a marca nodurile ce aparin drumului
care leag nodul-rdcin de nodul ce conine starea final. Cmpul Tata se utilizeaz pentru a memora
adresa nodului tat.
Fiecare celul a listei nodurilor active conine cmpul informaional ReferintaNod n care se
indic adresa nodului inclus n list. Cmpul de legtur Urm conine adresa celulei urmtoare din list.
Prin urmare, lista nodurilor active conine nu nodurile propriu-zise, ci doar adresele lor.
Subprogramele necesare pentru implementarea metodei ramific i mrginete n cazul jocului
Perspico snt incluse n programul P158.
Program P158;
const NivelMaxim=15;
type Stare=array[l..4, 1..4] of 0..15;
AdresaNod=ANod;
Nod=record
S : Stare;
Nivel, Cost : integer;
Drum : boolean;
D:array [1..4] of AdresaNod; {adresele descendentilor}
Tata:AdresaNod;
end;
AdresaCelula=ACelula;
Celula=record
ReferintaNod : AdresaNod;
Urm : AdresaCelula;
end;
var Radacina : AdresaNod;
BazaListei : AdresaCelula;
Starealnitiala, StareaFinala : Stare;
Gsit : boolean; { true cind este gasit un drum }
Finput, Foutput : text; { datele de intrare si iesire }
Str : array[1..4] of Stare; { strile descendente }
m : 0..4;
{ numarul curent de stari }
i, j : integer;
procedure CalculareaCostului(Adresa : AdresaNod);
var i, j, C : integer;
begin
C:=0;
for i:=l to 4 do
for j:=1 to 4 do
if AdresaA.S [i,j ] o StareaFinala[i,j] then C:=C+1;
Adresa^.Cost:=Adresa^.Nivel+C;
end; { CalculareaCostulu}
procedure Initializare;
{ Creeaza nodul rdcina si lista nodurilor active }
{ Inscrie in lista nodurilor active nodul rdcina }
var i : integer;
begin
Gasit:=false;
new(Radacina);
Radacina^.S:=StareaInitiala;
Radacina^.Nivel:=0;
CalculareaCostului(Radacina);
Radacina^.Drum:=false;
for i:=l to 4 do Radacina^.D[i]:=nil;
Radacina^.Tata:=nil;
44 | P a g i n

new(BazaListei) ;
BazaListei^.ReferintaNod:=Radacina;
BazaListei^.Urm:=nil;
end; { Iniializare }
procedure Ramifica(Adresa : AdresaNod);
{ nscrie in Str toate strile care pot fi obinute }
{ din starea curenta prin efectuarea unei mutri permise}
label 1;
var St : Stare;
i, j, k : integer;
begin
{ cutarea plcutei 0 }
for i:=l to 4 do
for j:=1 to 4 do
if Adresa^.S[i,j]=0 then goto 1;
1: m:=0;
{ Deplasarea plcutei de sus }
if iol then
begin
St:=Adresa^.S;
St[i,j]:=St[i-l, j;
St[i-1, j]:=0;
m:=m+l;
Str[m]:=St;
end; { Deplasarea plcutei de jos }
if i<>4 then
begin
St=:Adresa^.S;
St[i,j]:=St[i+l, j];
St [i + 1, j]:=0;
m: =m+1;
Str[m]:=St;
end; { Deplasarea plcutei din sting }
if j<>4 then
begin
St:=Adresa^.S;
St[i,j]:=St[i, j-1];
St[i, j-1]:=0;
m:=m+1;
Str[m]:=St;
end; { Deplasarea plcutei din dreapta }
if j<>4 then
begin
St:=Adresa^.S;
St[i,j]:=St[i, j+1];
St[i, j+l]:=0;
m:=m+1 ;
Str[m]:=St;
end;
end; { Desparte }
procedure IncludelnLista(Adresa:AdresaNod);
{ Include adresa nodului in lista nodurilor active }
var R : AdresaCelula;
begin
new(R);
R^.ReferintaNod:=Adresa;
45 | P a g i n

R^.Urm:=BazaListei ;
BazaListei:=R;
end; { IncludelnLista }
procedure ExtrageDinLista(var Adresa : AdresaNod);
{ Extrage adresa nodului de cost minim din lista }
label 1;
var P, R : AdresaCelula;
C : integer; { costul curent }
begin
if BazaListei=nil then goto 1;
{ cutarea nodului de cost minim }
C:=MaxInt;
R:=BazaListei;
while R<>nil do
begin
if R^.ReferintaNod^.Cost < C then
begin
C:=R^.ReferintaNod^.Cost;
Adresa:=R^.ReferintaNod;
P:=R;
end; { then }
R:=R^.Urm;
end; { while }
{ excluderea nodului de cost minim din lista }
if P=BazaListei then BazaListei:=P^.Urm
else
begin
R:=BazaListei;
while P<>R^.Urm do R:=R^.Urm;
R^.Urm:=P^.Urm;
end;
dispose(P);
l:end; { ExtrageDinLista }
function StariEgale(SI, S2 : Stare) : boolean;
{ Returneaza TRUE daca starile SI si S2 coincid }
var i, j : integer;
Coincid : boolean;
begin
Coincid:=true;
for i:=1 to 4 do
for j:=1 to 4 do
if S1[i,j]<>S2[i,j] then Coincid:=false;
StariEgale:=Coincid;
end; { StariEgale }
function StareDejaExaminata(St : Stare) : boolean;
{Returneaza TRUE daca starea curenta este deja inclusa in arbore}
var EstelnArbore : boolean;
procedure InAdincime(R : AdresaNod);
{ Parcurgerea arborelui in adincime }
label 1;
var i : integer;
begin
if R<>nil then
begin
if StariEgale(St, R^.S) then
begin
46 | P a g i n

EstelnArbore:=true;
goto 1;
end;
for i:=l to 4 do InAdincime(R^.D[i]);
end;
l:end; { InAdincime }
begin
EstelnArbore:=false;
InAdincime(Radacina);
StareDejaExaminata:=EsteInArbore;
end; { StareDejaExaminata }
procedure Margineste(Adresa : AdresaNod);
{ Selectarea descendenilor si includerea lor in lista}
label 1;
var i, k : integer;
R : AdresaNod;
begin k:=0;
if (Adresa^.Nivel+1) > NivelMaxim then goto 1;
for i := 1 to m do
if not StareDejaExaminata(Str[i]) then
begin
k:=k+l;
new(R);
R^.S:=Str[i];
R^.Nivel:=Adresa^.Nivel+1;
CalculareaCostului(R);
for j:=l to 4 do R^.D[j]:=nil;
Adresa^.Dfi]:=R;
R^.Tata:=Adresa;
R^.Drum:=false;
if StariEgale(R^.S, StareaFinala) then
begin
R^.Drum:=true;
Gsit:=true;
end;
IncludelnLista(R);
end;
writeln(Foutput);
writeln(Foutput, 'In lista au fost inclusi ', k,
'descendenti');
writeln(Foutput);
l:end; { Mrginete }
procedure AfisareaNodului(R : AdresaNod);
var i, j : integer;
begin
writeln(Foutput, 'Drum-',
R^.Drum, ' Nivel=', R^.Nivel,
'Cost=', R^.Cost);
for i:=l to 4 do
begin
for j:=l to 4 do write(Foutput, R^.S[i, j] : 3);
writeln(Foutput);
end;
for i:=1 to 4 do
if R^.D[i]<>nil then write (Foutput, '*** ')
else write(Foutput, 'nil
');
writeln(Foutput); writeln(Foutput);
47 | P a g i n

end; { AfisareaNodului }
procedure RamificaSiMargineste;
var NodulCurent : AdresaNod;
begin
Initializare;
repeat
ExtrageDinLista(NodulCurent);
writeln(Foutput, '

NODUL

EXTRAS

DIN

LISTA');

writeln(Foutput, '
======================');
AfisareaNodului(NodulCurent);
Ramifica(NodulCurent);
Margineste(NodulCurent);
until Gasit or (BazaListei=nil);
end; { RamificaSiMargineste }
procedure AfisareaDrumului; labei 1;
var R : AdresaCelula;
P, Q : AdresaNod;
begin
if not Gasit then
begin
writeln(Foutput, 'DRUMUL NU A FOST GASIT');
goto 1;
end;
writeln(Foutput, 'DRUMUL GASIT:');
writeln(Foutput, '=============');
{ cutarea in lista a nodului terminal}
R:=BazaListei;
while (R<>nil) and (not R^.ReferintaNod^.Drum) do R:=R^.Urm;
{ marcarea nodurilor care formeaz drumul }
P:=R^.ReferintaNod;
while P^<>nil do
begin
P^.Drum:=true;
P:=P^.Tata;
end; { afiarea drumului }
P:=Radacina;
while P<>nil do
begin
AfisareaNodului(P);
Q:=nil;
for i:=l to 4 do
if (P^.D[i]<>nil) and P^.D[i]^. Drum
then Q:=P^.D[i];
P:=Q;
end; writeln(Foutput, 'Sfirsitul drumului');
l:end; { AfisareaDrumului }
begin
{ Citirea strii iniiale }
assign(Finput, 'FINPUT.TXT');
reset(Finput);
for i:=l to 4 do
for j:=l to 4 do read(Finput, Starealnitiala[i, j]);
{Citirea strii finale }
for i:=l to 4 do
for j:=l to 4 do read(Finput, StareaFinala[i, j]);
close(Finput);
48 | P a g i n

{ Deschiderea fiierului de ieire }


assign(Foutput, 'FOUTPUT.TXT');
rewrite(Foutput);
RamificaSiMargineste;
AfisareaDrumului;
close(Foutput);
writeln('Gasit=',
Gasit);
readln; end.
n programul P158 starea iniial i starea final snt citite din fiierul FINPUT.TXT, iar nodurile
extrase la fiecare pas din list i drumul gsit snt nscrise n fiierul FOUTPUT.TXT. Coninutul acestor
fiiere poate fi vizualizat sau modificat cu ajutorul unor editoare simple de text.
1.

2.
3.
4.

ntrebri i exerciii
Indicai ordinea n care vor fi vizitate nodurile arborelui din figura 17 n cazul parcurgerii
drumului de cost minim. Folosind ca model tabelul 7, completai un tabel cu datele referitoare la
acest arbore.
Explicai destinaia fiecrui subprogram din programul P158.
Lansai n execuie programul P158 pentru datele iniiale din figura 16. Comentai rezultatele
nscrise n fiierul de ieire.
Lansai n execuie programul P158 pentru urmtoarele stri iniiale ale jocului Perspico:
a)

1
5
9
13

2
6
11
10

0
3
7
14

4
8
12
15

b) 1
5
9
13

2
6
0
14

3
7
10
15

4
8
11
12

c)

1
5
9
13

3
2
10
14

4
6
7
15

8
0
11
12

d) 0
6
5
13

1
7
9
14

2
8
10
15

3
4
11
12

2
0
6
14

3
7
10
15

4
8
11
12

Comentai rezultatele nscrise de program n fiierul FOUTPUT.TXT.


5. E cunoscut faptul c pentru strile iniiale ce urmeaz:
a)

1
9
13
0

2
5
6
14

3
7
10
15

4
8
11
12

b) 1
5
9
13

programul P158 gsete soluiile respective. ns dup introducerea modificrii


const NivelMaxim = 5;
soluia pentru cazul (a) nu mai este gsit. Cum credei, prin ce se explic acest fapt?
6. Se consider varianta simplificat a jocului Perspico, denumit jocul 9 (fig. 18). Ce modificri
trebuie introduse n programul P15 8 pentru a calcula irul de mutri permise destinate trecerii din
starea iniial n starea final?

a)

b)

Fig. 18. Varianta simplificat


a jocului Perspico: a starea
iniial; b starea final.

49 | P a g i n

7. Modificai programul P158 utiliznd urmtoarea funcie de cost:


F(si) = niv(si) + g(si),
unde g(si) este suma distanelor dintre fiecare plcu i locul ei n starea final, exprimat prin
numrul respectiv de mutri. De exemplu, pentru starea iniial din figura 16 avem:
g(si) = 0 + 0 + 0 + 0 + 0 + 0 + 3 + 0 + 0 + 0+1+0 + 0 + 0+1 + 1=5.
Verificai cum deruleaz programul modificat n cazul strilor iniiale din exerciiile 4 i 5.
Elaborai planul unui experiment care ne-ar permite s stabilim care din funciile h(si), g(si) micoreaz
timpul de calcul.
8. Comparai complexitatea programului P158 cu complexitatea unui program bazat pe metoda
trierii.
9. Se consider o tabl de ah pe care se afl o singur pies - un cal de culoare alb. Elaborai un
program care determin dac piesa respectiv poate trece, utiliznd mutrile permise, din poziia
(, ) n poziia (, ). Amintim c , {A, B,..., H}, iar , {1, 2,..., 8}.
10. Problema comis-voiajorului3. Se consider n orae ntre care exist curse aeriene directe. n
oraul i se afl un comis-voiajor care trebuie s viziteze celelalte n-1 orae i s revin n
localitatea din care s-a pornit. Elaborai un program care, cunoscnd distanele dij ntre orae,
determin ordinea n care ele vor fi vizitate. Se cere ca distana parcurs de comis-voiajor s fie ct
mai mic, iar fiecare ora s fie vizitat numai o singur dat.
11. Scriei un program PASCAL care soluioneaz problema comis-voiajorului prin metoda trierii.
Comparai complexitatea programului elaborat cu complexitatea programului bazat pe metoda
ramific i mrginete.
Indicaii: Drumul parcurs de comis-voiajor poate fi reprezentat ca o mulime ordonat (1, i, j, ..., k,
1) de orae n care i,j,..., k {2, 3, ..., n). Pentru a genera toate drumurile posibile, se calculeaz
permutrile mulimii {2, 3,..., n}.
12. Efectuai un studiu comparativ al algoritmilor bazai pe metoda ramific i mrginete i cea a
algoritmilor bazai pe metoda trierii.
2.9. Algoritmi exaci i algoritmi euristici
Algoritmii utilizai pentru rezolvarea problemelor cu ajutorul calculatorului se mpart n dou
categorii distincte: algoritmi exaci i algoritmi euristici.
Un algoritm este exact numai atunci cnd el gsete soluiile optime ale problemelor pentru
rezolvarea crora a fost conceput. Desigur, acest fapt trebuie confirmat printr-o demonstraie matematic
riguroas.
Un algoritm este euristic atunci cnd el gsete soluii bune, dar nu neaprat optime. n astfel de
cazuri demonstraia matematic respectiv nu exist sau nu este cunoscut. De obicei, algoritmii
euristici includ prelucrri care, chiar dac nu pot fi justificate matematic, snt alese n virtutea
experienei sau intuiiei programatorului.
Evident, algoritmii bazai pe metoda trierii snt exaci, ntruct n procesul examinrii consecutive
a soluiilor posibile va fi gsit neaprat i soluia optim. Confirmarea exactitii acestor algoritmi se
reduce la demonstrarea faptului c n procesul derulrii pe calculator vor fi generate i analizate toate
elementele din mulimea soluiilor posibile. n cazul algoritmilor bazai pe celelalte tehnici de
programare - tehnica Greedy, metoda relurii, metoda ramific i mrginete .a.m.d. - un algoritm va fi
exact sau euristic n funcie de natura condiiilor care ne permit s evitm trierea tuturor soluiilor
posibile. Dac aceste condiii sunt alese nereuit, soluiile optime pot fi pierdute i, n consecin,
algoritmul respectiv nu va mai fi exact. Pentru exemplificare vom analiza problema ce urmeaz.
Problema drumului minim. Se consider n orae legate printr-o reea de drumuri (fig. 19).
Cunoscnd distanele dij dintre oraele vecine, determinai cel mai scurt drum din oraul a n oraul b.

Persoan care se ocup cu mijlocirea vnzrilor de mrfuri, deplasndu-se n diferite locuri in cutarea unor beneficiari.

50 | P a g i n

2
1
2

Fig. 19. Reeaua de drumuri

Datele iniiale ale problemei n studiu pot fi descrise cu ajutorul matricei (tabelului bidimensional)
D = || dij ||nxn cu n linii i n coloane, denumit matricea distanelor. n aceast matrice componenta dij
este egal cu distana ntre oraele i,j atunci cnd ele snt vecine i 0 n caz contrar. Prin definiie, dii= 0,
i = 1, 2,..., n.
De exemplu, pentru oraele din figura 19 avem:
1 2 3 4 5 6
1 0 1 2 6 0 0
2 1 0 0 0 0 0
D = 3 2 0 0 2 3 0
4 6 0 2 0 5 0
5 0 0 3 5 0 2
6 0 0 0 0 2 0
Drumul minim ce leag oraele a=1,b= 6 are lungimea 7 i include localitile 1, 3, 5, 6.
n general, drumul minim poate fi gsit prin metoda trierii, genernd consecutiv toate permutrile
mulimilor ordonate
R = , TUVUW
, G, , L, * ,
X YZ[\

unde q ia valori de la 0 la n - 2. Este clar c algoritmii bazai pe generarea tuturor permutrilor


ntotdeauna determin drumul minim, ns complexitatea temporal O(n!) a acestor algoritmi este
inacceptabil.
Pentru a reduce volumul de calcule, vom ncerca s determinm drumul minim prin metoda
relurii. In aceast metod construirea drumului ncepe cu oraul iniial x1 = a i continu cu primul
dintre vecinii si nevizitai, fie acesta x2, trecndu-se la primul dintre vecinii lui x2 nevizitai nc .a.m.d.
Pentru a construi drumuri ct mai scurte, vom aplica urmtoarea regul intuitiv: la fiecare pas vom
examina, n primul rnd, vecinii nevizitai care se afl ct mai aproape de oraul curent.
Drumul n construcie poate fi reprezentat n forma unui vector
X = (a,x2,...,xk-1,xk, ...,b)
n care componenta xk trebuie s fie unul din vecinii oraului xk-1. Pentru a sistematiza calculele, vom
memora vecinii nc nevizitai ai oraului i n mulimea Ai, i=1,2, ..., n. Evident, conform regulei
intuitive formulate mai sus, oraele din fiecare mulime A1 trebuie sortate n ordinea creterii distanelor
dij, j A1.
De exemplu, pentru figura 19 iniial vom avea:
A1 = (2, 3, 4);
A2 = (l);
A3 = (l,4,5);
A4 = (3, 5, 6);
A5 = (6, 3, 4);
A6 = (5).

51 | P a g i n

Condiiile de continuare n metoda relurii rezult direct din enunul problemei: oraul xk poate fi
adugat la poriunea de drum deja construit (a, x2, ..., xk-1) numai atunci cnd:
1) xk este un vecin nevizitat al oraului xk-1, deci xk Ak-1;
2) oraul xk anterior nu a fost inclus n drumul n curs de construcie, deci xk a, xk x2, ..., xk xk-1
De exemplu, pentru figura 19 vectorul X va lua consecutiv urmtoarele valori:
X = (1);
X = (l,2);
X = (l);
X = (l,3);
X = (l,3,4);
X = (l,3,4,5);
X = (1,3, 4, 5, 6).
Drumul (1, 3, 4, 5, 6) construit prin metoda relurii are lungimea 11 i, evident, nu este un drum
minim. Totui acest drum este mai bun ca drumul (1, 4, 5, 6) care are lungimea 13.
n programul ce urmeaz elementele mulimilor A1, A2,..., An snt plasate la nceputul liniilor
A[1], A[2], ..., A[n] ale tabloului bidimensional A, restul poziiilor avnd valoarea zero.
Program P159;
{ Problema drumului minim - metoda relurii }
const nmax=50;
var n : integer; { numrul de orae }
D : array[1..nmax, L.nmax] of real;{ matricea distanelor}
a, b : 1..nmax;
X : array [1..nmax] of integer; {drumul construit}
V : array[1..nmax, 1..nmax] of integer; {vecinii}
Finput : text;
procedure InitializareVecini;
{ nscrie n V[k] vecinii oraului k }
var k, i, j, p, q, r : integer;
begin
for k:=l to n do
begin
{iniial mulimea V[k] este vid}
for i:=l to n do V[k,i]:=0;
{calculm elementele mulimii V[k]}
i:=0;
for j:=1 to n do
if D[k,j]<>0 then
begin i:=i+l; V[k,i]:=j;
end; { then }
{ sortarea elementelor mulimii V[k] prin metoda bulelor }
for j:=1 to i do
for p:=l to i-1 do
if D[k, V[k,p]]>D[k, V[k, p+1]] then
begin
q:=V[k,p];
V[k,p]:=v[k, p+1];
V[k, p+1]:=q;
end; { then }
end; { for }
end; { InitializareVecini }
procedure Iniializare;
var i, j : integer;
begin
assign (Finput, 'DRUM.IN');
reset(Finput);
readln(Finput, n);
52 | P a g i n

readln(Finput, a, b);
writeln('n=', n,' a=', a, 'b=', b);
for i:=1 to n do
for j:=l to n do read(Finput, D[i,j]);
close(Finput);
InitializareVecini;
end; { Iniializare }
function MultimeVida(k : integer) : boolean;
begin
MultimeVida:=(V[X[k-l], 1]=0);
end; { MultimeVida }
function PrimulElement(k : integer) : integer;
var i : integer;
begin
PrimulElement:=V[X[k-1], 1];
for i:=l to n-1 do V[X[k-1],i]:=V[X[k-1], i+1];
end; { PrimulElement }
function ExistaSuccesor(k : integer) : boolean;
begin
ExistaSuccesor:=(V[X[k-l], 1]<>0);
end; { ExistaSuccesor }
function Succesor(k : Integer) : integer;
var i : integer;
begin
Succesor:=V[X[k-l], 1];
for i:=l to n-1 do V[X[k-l], i]:=V[X[k-1], i + l];
end; { Succesor }
function Continuare(k : integer) : boolean;
var i : integer;
Indicator : boolean;
begin
Continuare:=true;
for i:=l to k-1 do
if X[i]=X[k] then Continuare:=false;
end; { Continuare }
procedure PrelucrareaSolutiei(k : integer);
var i : integer;
s : real;
begin
writeln('Drumul gasit:');
for i:=l to k-1 do write(X[i] : 3);
writeln; s:=0;
for i:=l to k-1 do s:=s+D[X[i], X[i+1]];
writeln('Lungimea drumului', s:10:2);
readln;
halt;
end; { PrelucrareaSolutiei }
procedure Reluare(k : integer);
label 1;
var i : integer;
begin
if MultimeVida(k) then goto 1;
if X[k-l]<>b then
begin
X[k]:=PrimulElement(k);
if Continuare(k) then Reluare(k+1);
53 | P a g i n

while ExistaSuccesor(k) do
begin
X[k]:=Succesor(k);if Continuare(k) then Reluare(k+1);
end;,{ while }end {then} else PrelucrareaSolutiei(k);
l:end; { Reluare }
begin
Iniializare;
X[1]:=a;
Reluare (2);end.
Din analiza programului P159 se observ c algoritmul bazat pe metoda relurii are
complexitatea O(mn), deci este exponenial. n aceast formul m reprezint numrul maxim de vecini
pe care i poate avea fiecare ora. Menionm c numrul concret de operaii efectuate de programul
P159 depinde n mare msur de configuraia reelei de drumuri i distanele respective. Evident,
"plata" pentru reducerea numrului de operaii n algoritmul euristic, bazat pe metoda relurii n
comparaie cu algoritmul exact bazat pe metoda trierii, const n pierderea soluiilor optime.
n scopul soluionrii eficiente a problemelor de o real importan practic, n informatic se
depun eforturi considerabile pentru elaborarea unor algoritmi exaci care ar avea o complexitate
polinomial. n cazul problemei drumului minim, un astfel de algoritm poate fi elaborat utiliznd metoda
programrii dinamice.
Amintim c metoda programrii dinamice poate fi aplicat doar problemelor care satisfac
principiul optimalittii, principiul care se respect n cazul drumurilor minime. Pentru a formula relaiile
respective de recuren, introducem n studiu matricea costurilor C =|| cij ||nxm elementele creia indic
lungimea drumului minim ntre oraele i,j. Componentele cij se calculeaz dup cum urmeaz:
1) mai nti se examineaz drumurile minime care leag oraele vecine:
6:

0,
= G;

'D
.F. , G ( & 1. .;
= ] 6:,
, C ' &D D;

2) n continuare se examineaz drumurile minime ntre oraele i,j formate prin folosirea localitii
k drept punct de conexiune:
6: = minb 6@ , @: c , , G d1, 2, , e, G, L, G L,
3) punctul 2 se repet pentru k= 1,2, ..., n.
Valorile curente ale matricei costurilor pentru oraele din figura 19 snt prezentate n figura 20.
ntruct matricea costurilor C nu conine drumurile minime propriu-zise, ci numai lungimile lor, vom
construi drumul minim ce leag oraele a, b cu ajutorul tehnicii Greedy. Conform acestei tehnici,
construcia drumului minim X= (x1,..., xk-1, xk,...) ncepe cu oraul iniial x1 = a. n continuare, la fiecare
pas k se alege acel ora xk, xk Ak-1, care satisface principiul optimalittii:
C[a, xk] + C[xk, b] = C[a, b]

De exemplu, pentru oraele a = 1, b = 6 din figura 19 avem:


X = (1);
X = (l,3);
X = (l,3,5);
X = (1,3, 5,6).
Matricea iniial
1
1
2
3
4
5
6

k=1
6


1 0
2 0 2 3
6 2 0 5
3 5 0 2
2 0
0

1
1
2
3
4
5
6

k=2
4


1 0 3 7
2 3 0 2 3
6 7 2 0 5
3 5 0 2
2 0
0

1
1
2
3
4
5
6


1 0 3 7
2 3 0 2 3
6 7 2 0 5
3 5 0 2
2 0
0

54 | P a g i n

k=3
1 2 3 4 5 6
1 0 1 2 4 5
2 1 0 3 5 6

k=4
1 2 3 4 5 6
1 0 1 2 4 5
2 1 0 3 5 6

k=5
1 2 3 4 5 6
1 0 1 2 4 5 7
2 1 0 3 5 6 8

3 2 3 0 2 3

3 2 3 0 2 3

3 2 3 0 2 3 5

4 4 5 2 0 5

4 4 5 2 0 5

4 4 5 2 0 5 7

5 5 6 3 5 0 2

5 5 6 3 5 0 2

5 5 6 3 5 0 2

6 2 0

6 2 0

6 7 8 5 7 2 0

k=6
1 2 3 4 5 6
1 0 1 2 4 5 7
2 1 0 3 5 6 8
3 2 3 0 2 3 5
4 4 5 2 0 5 7
5 5 6 3 5 0 2
6 7 8 5 7 2 0

Fig. 20. Valorile curente ale matricei costurilor


Algoritmul de determinare a drumurilor minime bazat pe metoda programrii dinamice este
cunoscut n literatura de specialitate sub denumirea Roy-Floyd. n calitate de exerciiu v propunem s
demonstrai c acest algoritm este exact, adic ntotdeauna construiete numai drumuri minime.
n programul ce urmeaz algoritmul exact este implementat cu ajutorul procedurii RoyFloyd.
Program P160;
{Problema drumului minim - metoda programrii dinamice}
const nmax=50;
Infinit=1.0E+35;
var n : integer; { numrul de orae }
D:array[1. .nmax, L.nmaxl of real;{ matricea distanelor}
a, b : 1..nmAx;
X : array [0..nmax+l] of integer; { drumul construit }
V : array [1..nmax, L.nmax] of integer; { vecinii }
C : array [1..nmax, L.nmax] of real; { matricea costurilor }
Finput : text;
procedure InitializareVecini;
{nscrie in V[k] vecinii oraului k }
var k, i, j, p, q, r : integer;
begin
for k:=l to n do
begin
{iniial mulimea V[k] este vid}
for i:=l to n do V[k,i]:=0;
{ calculm elementele mulimii V[k] }
i:=0;
for j:=1 to n do
if D[k,j]<>0 then
begin
i:=i+l;
V[k,i]:=j;
end; { then }
end; { for }
end; { InitializareVecini }
procedure Iniializare;
55 | P a g i n

var i, j : integer;
begin
assign(Finput, 'DRUM.IN');
reset(Finput);
readln(Finput, n);
readln(Finput, a, b);
writeln('n=', n, ' a=' , a, ' b=' , b);
for i:=l to n do
for j:=l to n do read(Finput, D[i,j]);
close(Finput);
InitializareVecini;
end; { Iniializare }
procedure AfisareaDrumului;
var k : integer;
begin
write('Drumul gsit: ');
k:=l;
repeat
write(X[k] : 3);
k:=k+l;
until X[k]=0;
writeln;
writeln('Lungimea drumului ', C[a, b]:5);
readln;
end; { PrelucrareaSolutiei }
function Min(p, q : real) : real;
{ Returneaz minimul din p si q }
var s : real;
begin
if p<q then s:=p else s:=q;
if s>Infinit then s:=Infinit;
Min:=s;
end; { Min }
procedure RoyFloyd;
var i, j, k : integer;
s : real;
ors : integer;
end : boolean;{condiiile de includere a oraului n drum}
begin
{Iniializarea matricei costurilor}
for i:=l to n do
for j:=1 to n do
if (D[i,j]=0) and (i<>j) then C [i, j]:=Infinit
else C[i,j]:=D[i,j];
{Calcularea matricei costurilor}
for k:=l to n do
for i:=1 to n do if i<>k then
for j:=1 to n do
if j<>k then C[i, j]:=Min (C[i, j] , C[i, k] +C[j , k]);
{Trasarea drumului - tehnica Greedy}
for k:=1 to n do X[k]:=0;
k:=l; X[1]:=a;
while X[kl<>b do
begin
i:=l;
while V[X[k], i]<>0 do
56 | P a g i n

begin
ors:=V[X[k], i];
cnd:=true;
for j:=l to k do if ors=X[j] then cnd:=false;
if end and (C[A, ors]+C[ors, B]=C[a,b])
then X[k+1]:=ors;
i:=i+l;
end; { while }
k:=k+l
end; { while }
end; { RoyFloyd }
begin
Iniializare;
RoyFloyd;
AfisareaDrumului;
end.
Din analiza procedurii RoyFloyd se observ c aceast complexitate temporal a algoritmului
exact este O(n3), deci polinomial.
n practic, pentru soluionarea unei probleme, mai nti se ncearc elaborarea unui algoritm exact
de complexitate polinomial. Dac aceast tentativ eueaz, se elaborareaz un algoritm euristic.
Pentru a sistematiza acest proces, este convenabil s se pun n eviden toate condiiile pe care le
satisface o soluie optimi. Condiiile respective pot fi mprite n dou clase:
1) condiii necesare n sensul c nendeplinirea lor mpiedic obinerea unei soluii posibile pentru
problem;
2) condiii pentru care se poate accepta un compromis, n sensul c ele pot fi nlocuite cu alte
condiii ce permit apropierea de o soluie optimal.
De exemplu, n cazul drumului minimX= (a1, x2,..., xk-1,xk, ...,b) faptul c xk trebuie s fie un vecin
al oraului xk-1 este o condiie necesar, iar respectarea principiului optimalitii este o condiie de
compromis. In metoda relurii condiia de compromis a fost nlocuit cu una mai simpl, i anume,
oraul xk trebuie s fie ct mai aproape de oraul xk-1,. Evident, formularea condiiilor care accept un
compromis i nlocuirea lor cu altele mai simple cade n sarcina programatorului.
ntrebri i exerciii
1. Care este diferena dintre algoritmii exaci i cei euristici?
2. n care cazuri algoritmii euristici snt "mai buni" dect cei exaci?
3. Scriei un program care determin cel mai scurt drum prin metoda trierii. Estimai complexitatea
temporal a programului elaborat.
4. Efectuai un studiu comparativ al algoritmilor exaci i algoritmilor euristici destinai soluionrii
problemei drumului minim.
5. Calculai matricea distanelor pentru reeaua de drumuri auto ce leag centrele judeene. Determinai cele mai scurte drumuri ntre centrele judeene date cu ajutorul algoritmilor exaci i
algoritmilor euristici.
6. Cum credei, poate fi oare aplicat metoda trierii pentru determinarea celui mai scurt drum ntre
oricare dou localiti din ar ? Argumentai rspunsul Dvs.
7. Formulai condiiile necesare i condiiile pentru care se poate accepta un compromis n cazul
robotului ce exploreaz un teren aurifer (vezi paragraful 2.6).
8. Estimai complexitatea algoritmilor exaci i a algoritmilor euristici destinai soluionrii problemelor ce urmeaz:
a) memorarea fiierelor pe benzi magnetice (exerciiul 5, paragraful 2.3);
b) problema continu a rucsacului (exerciiul 6, paragraful 2.3);
c) colorarea unei hri (exerciiul 9, paragraful 2.4);
d) problema discret a rucsacului (exerciiul 7, paragraful 2.6);
e) arhivarea fiierelor (exerciiul 9, paragraful 2.6);
f) triangularea polinoamelor (exerciiul 10, paragraful 2.6);
g) jocul Perspico (paragraful 2.8);
h) problema comis-voiajorului (exerciiul 10, paragraful 2.8).
57 | P a g i n

Capitolul 3
ALGORITMI DE REZOLVARE A UNOR PROBLEME MATEMATICE
3.1. Operaii cu mulimi
Generarea soluiilor posibile ale unei probleme presupune prelucrarea elementelor ce aparin
diferitelor mulimi.
Fie A o mulime oarecare cu n elemente:
A = {a1,a2,...,aj,...,an}.
ntruct limbajul PASCAL nu permite accesul direct la elementele mulimilor descrise cu ajutorul tipului
de date set, vom memora elementele mulimii A ntr-un vector (tablou unidimensional) cu n componente
A = {a1,a2,...,aj,...,an}. Evident, o astfel de reprezentare stabilete implicit o ordine a elementelor
mulimii corespunztoare ordinii n care apar componentele n vectorul A.
Fie Ai o submulime a lui A. n PASCAL aceast submulime poate fi reprezentat prin vectorul
caracteristic al submulimii:
Bi = {b1,b2,...,bj,...,bn}.
unde

1,
: M6

0, C ' &D D
ntre submulimile Ai ale mulimii A i vectorii caracteristici Bi. exist o coresponden biunivoc:
M = A = 0, 0, ,0 ;
M = d e A = 1, 0, ,0 ;
MQ = d e AQ = 0, 1, ,0 ;
Mh = d , e AQ = 1, 1, ,0 ;

M@ = d , , , 5 e A@ = 1, 1, ,1 .
*: =

Evident, numrul tuturor submulimilor unei mulimi este k = 2n.


Reprezentarea submulimilor cu ajutorul vectorilor caracteristici presupune elaborarea unei uniti de
program ce conine cte o procedur pentru fiecare din operaiile frecvent utilizate n calculul cu mulimi: reuniunea, - intersecia, \ - diferena, - complemen-tarea. Scrierea procedurilor respective este propus
cititorului n calitate de exerciiu.

O alt operaie frecvent utilizat n algoritmii bazai pe metoda trierii este generarea tuturor
submultimilor unei mulimi. Realizarea acestei operaii n programele PASCAL este prezentat ,pu
ajutorul exemplului ce urmeaz.
Exemplul 1. Se consider mulimea A={a1, a2, ..., an} format din n numere ntregi. Determinai
dac exist cel puin o submulime M6 M6 M, suma elementelor creia este egal cu m.
Rezolvare. Soluiile posibile , {a1}, {a2}, {a1, a2} .a.m.d. pot fi generate formnd consecutiv
vectorii binari B1,B2, ..., Bk.
Program P161;
{Generarea tuturor submultimilor unei mulimi}
const nmax=50;
type Mulime = array [l..nmax] of integer;
CifraBinara = 0..1;
VectorCaracteristic=array[1..nmax] of CifraBinara;
var A : Mulime;
B : VectorCaracteristic;
n, m, j : integer;
function SolutiePosibila : boolean;
var j, suma : integer;
begin
suma:=0;
for j:=1 to n do
58 | P a g i n

if B[j]=l then suma:=suma+A[j];


if suma=m then SolutiePosibila:=true
else SolutiePosibila:=false;
end; { SolutiePosibila }
procedure PrelucrareaSolutiei;
var j : integer;
begin
write('Submulimea: ');
for j:=1 to n do
if B[j]=l then write(A[j],' ');
writeln;
end; { PrelucrareaSolutiei }
procedure GenerareSubmultimi(var t:CifraBinara);
var j:integer;
begin
t:=l; { transportul }
for j:=1 to n do
if t=l then
if B[j]=l then B[j]:=0
else begin B[j]:=l; t:=0 end;
end; { GenerareSubmultimi }
procedure CautareSubmultimi;
var i : integer;
t : CifraBinara;
begin
for j:=l to n do B[j]:=0;
{ ncepem cu vectorul caracteristic B=(0, 0, ..., 0) }
repeat
if SolutiePosibila then PrelucrareaSolutiei;
GenerareSubmultimi(t);
until t=l;
end; { CautareSubmultimi }
begin
write{'Dai n='); readln(n);
writeln('Dai ', n, ' numere ntregi:');
for j:=l to n do read(A[j]);
write('Dai m='); readln(m);
CautareSubmultimi;
writeln('Sfrit');
readln;
end.
n programul P161 trierea consecutiv a soluiilor posibile este organizat cu ajutorul ciclului
repeat...until din componena procedurii CautareSubmultimi. Vectorii caracteristici ai
submulimilor respective snt formai cu ajutorul procedurii GenerareSubmultimi. n aceast
procedur vectorul caracteristic B este tratat ca un numr binar, valoarea cruia trebuie mrit cu o
unitate la fiecare apel.
Instruciunile if din componena procedurii GenerareSubmultimi simuleaz funcionarea
unui semisumator care adun cifrele binare bj i t, variabila t reprezentnd transportul. Valoarea t=1 a
transportului din rangul n indic faptul c de la vectorul final Bk = (1, 1, ..., 1) se trece la vectorul initial
B1 = (0, 0, ..., 0).
Complexitatea temporal a algoritmilor bazai pe generarea tuturor submulimilor unei mulimi
este O(2n).
n unele probleme mulimea soluiilor posibile S poate fi calculat ca produsul cartezian al altor
mulimi.

59 | P a g i n

Exemplul 2. Se consider n mulimi A1, A2,. ..,An, fiecare mulime Aj fiind format din mj. numere
ntregi. Selectai din fiecare mulime Aj cte un numr aj. n aa mod, nct produsul al * a2 * ...* an s fie
maxim.
Rezolvare. Mulimea soluiilor posibile S=A1*A2*...*An. Evident, numrul soluiilor posibile
k=m1*m2*...*mn. Fiecare element si al produsului cartezian A1*A2*...*An poate fi reprezentat prin
vectorul indiciilor:
Ci = (c1, c2, ..., cj, ..., cn),
unde ci este indicele elementului respectiv din mulimea Aj. De exemplu, pentru:
1 23
12
123
A1 = (-6, 2, 1); A2 = (4, 9); A3 = (-8, 3, 5);

= d6, 4, 8e l = 1,1,1);
= d2, 4, 8e l = 2,1,1);
Q = d1, 4, 8e lQ = 3,1,1);
h = d6, 9, 8e lh = 1,2,1);
m = d2, 9, 8e lm = 2,2,1);

! = d1, 9, 5e l ! = 3,2,3);
unde 1, 2 i 3 sunt indicii elementelor din mulimile respective. Vectorii C1,C2, ...,Ck pot fi generai n
ordine lexicografic pornind de la vectorul initial C1=(1, 1, ..., 1).
Program P162;
{Generarea elementelor unui produs cartezian}
const nmax=50; {numrul maximal de mulimi}
mmax=50; { numrul maximal de elemente }
type Mulime = array [L.mmax] of integer;
Vectorlndicii = array[1..nmax] of l..mmax;
var A : array[1..nmax] of Mulime;
n : l..nmax; {numrul de mulimi}
M : array[1..nmax] of l..mmaX; {cardinalul mulimii A[i]}
Pmax : integer; { produsul maximal }
C, Cmax : Vectorlndicii;
i, j : integer;
procedure PrelucrareaSolutieiPosibile;
var j, p : integer;
begin
p:=l;
for j:=l to n do p:=p*A[j, C[j]];
if p > Pmax then begin Pmax:=p; Cmax:=C end;
end; { PrelucrareaSolutieiPosibile }
procedure GenerareProdusCartezian(var t:integer);
var j : integer;
begin
t:=l; {transportul}
for j:=1 to n do
begin
C[j]:=C[j]+t;
if C[j]<=M[j] then t:=0 else C[j]:=l;
end; {for}
end; {GenerareProdusCartezian}
procedure CautareaProdusuluiMaximal;
var j : integer;
t : integer;
begin
Pmax:=-Maxlnt;
writeln('Pmax=', Pmax);
obinem

60 | P a g i n

for j:=l to n do C[j]:=l;


{ncepem cu vectorul indiciilor C=(l, 1, ..., 1) }
repeat
PrelucrareaSolutieiPosibile;
write('Produsul cartezian: ');
for j:=l to n do write(A[j, C[j]], ' '); writeln;
GenerareProdusCartezian(t)
until t=l;
end; { CautareaProdusuluiMaxinial }
begin
write('Dati numrul de mulimi n='); readln(n);
for i:=l to n do
begin
write('Dai cardinalul M[',i, ']='); readln(M[i]);
write('Dai elementele mulimii A[', i, ']: ');
for j:=l to M[i] do read(A[i, j]);
writeln;
end;
CautareaProdusuluiMaxinial;
writeln('Pmax=', Pmax);
write('Elementele selectate: ');
for j:=l to n do write(A[j, Cmax[j]], ' ');
writeln;
readln;
readln;
end.
n procedura GenerareProdusCartezian vectorul indiciilor C este tratat ca un numr
natural scris ntr-un sistem mixt de numeratie. n acest sistem cifra c1 este scris n baza m1, cifra c2 n baza m2, cifra c3 - n baza m3 .a.m.d. La fiecare apel al procedurii GenerareProdusCartezian
valoarea numrului nscris n vectorul C este mrit cu o unitate. Valoarea t=1 a transportului din rangul
n indic faptul c de la vectorul final Ck = = (m1, m2, ..., mn) se trece la vectorul iniial C1 = (1, 1, ..., 1).
Menionm c dac numrul de mulimi n este cunoscut pn la scrierea programului, generarea
elementelor produsului cartezian A1*A2*.. .*An poate fi fcut mult mai simplu cu ajutorul a n cicluri
imbricate:
for jl:=l to m1 do
for j2:=1 to m2 do
...
for jn:=l to mn do
if SolutiePosibila(ajl, aj2,..., ajn);
then PrelucrareaSolutiei(ajl, aj2,..., ajn);
Complexitatea temporar a algoritmilor bazai pe generarea tuturor elementelor unui produs
cartezian este O(mn), unde m = max(m1, m2, ..., mn).
1.
2.

3.
4.

ntrebri i exerciii
Submulimile Ai, Aj ale mulimii A snt reprezentate prin vectori caracteristici. Elaborai procedurile necesare pentru efectuarea urmtoarelor operaii: M6 M: , M6 M: , M6 \ M: , Mpo .
Orice submulime Ai, Ai A, poate fi reprezentat printr-un vector cu n componente, unde
elementele submulimii At snt plasate la nceputul vectorului, iar restul poziiilor au o valoare ce
nu aparine mulimii A. Elaborai procedurile necesare pentru efectuarea operaiilor frecvent
ntlnite n calculul cu mulimi: , , \, . Cum credei, care reprezentare a submul-imilor este
mai comod: prin vectorii caracteristici sau prin vectori ce conin chiar elementele submulimii?
Estimai timpul de execuie a procedurii CautareSubmultimi din programul P161. Verificai
aceste estimri prin msurri directe ale timpului de execuie pentru diferite valori ale lui n.
Se consider mulimea A format din primele n caractere ale alfabetului latin. Elaborai un
program care afieaz la ecran toate submulimile acestei mulimi.
61 | P a g i n

5. Se consider numrul natural n= 32*35*17, format din 9 cifre zecimale. Determinai cifrele care
trebuie nscrise n poziiile marcate cu simbolul * pentru ca numrul obinut s se mpart fr rest
la m .
6. Estimai timpul de execuie a procedurii CautareaProdusuluiMaximal din programul
P162. Verificai aceste estimri prin msurri directe ale timpului de execuie pentru diferite
valori ale lui n i ml, m2, ..., mn.
7. ntr-un co snt m mere i p pere. S se genereze toate posibilitile de a alege f fructe dintre care k
s fie mere.
8. Elaborai o procedur recursiv care genereaz toate elementele unui produs cartezian.
9. Fie A = (a1, a2, ..., aj, ..., an) o mulime ordonat de caractere numit alfabet. Numim cuvnt de
lungime p orice succesiune de p caractere din alfabetul A. Elaborai o procedur care genereaz
toate cuvintele de lungimea p.
3.2. Analiza combinatorie
n rezolvarea multor probleme implementarea algoritmilor bazai pe analiza consecutiv a
soluiilor posibile presupune generarea permutrilor, aranjamentelor sau combinrilor unei mulimi.
Generarea permutrilor. E cunoscut faptul c numrul de permutri posibile ale unei mulimi
A={a1,a2,..., an} cu n elemente se determin ca Pn = n!. Acest numr poate fi calculat cu ajutorul funciei
factorial, exprimat n form iterativ:
Pn=1*2*3*...*n sau recursiv:
sau recursiv:
1,
= 0;
N5 =
N5 ,
> 0;
De exemplu, pentru A={a1, a2} cele P2=2!=2 permutri snt (a1, a2) i (a2, a1). Pentru A={a1, a2,
a3} cele P3 = 3! = 6 permutri snt:
(a1, a2, a3);
(a1, a3, a2);
(a2, a1, a3);
(a2, a3, a1);
(a3, a1, a2);
(a3, a2, a1).
ntruct ntre permutrile mulimii A={a1, a2, ..., an} i permutrile mulimii I={1, 2, ..., n} exist
o coresponden biunivoc, problema generrii permutrilor oricrei mulimi A cu n elemente se reduce
la generarea permutrilor mulimii {1, 2, ..., n}, denumite permutri de grad n.
Exist mai multe metode ingenioase de generare a permutrilor de grad n, cea mai rspndit fiind
metoda lexicografic. n aceast metod se pleac de la permutarea cea mai mic n ordine
lexicografic i anume de la permutarea identic (1, 2, ..., n).
Avnd construit o permutare p = (p1,..., pi-1, pi,,..., p1), pentru determinarea urmtoarei permutri
p' care i urmeaz n ordine lexicografic se caut acel indice i care satisface relaiile
pi<pi+1; pi+1>pi+2>...>pn
n continuare elementul pi, este nlocuit cu cel mai mic dintre elementele pi+1 ..., pn care este mai
mare dect pi, fie el pk:
(p1, ..., pi-1, pk, pl+1,..., pi-1, pi, pk+1,..., pn).
Permutarea cutat p' se obine prin inversarea ordinii ultimilor (n-1) elemente din acest vector,
astfel nct ele s apar n ordine cresctoare.
Dac nu exist nici un indice i ca mai sus, nseamn c s-a ajuns la permutarea cea mai mare n
ordine lexicografic, adic la (n, (n-1), ..., 1) i algoritmul se termin.
De exemplu, pentru n=3 se obin permutrile:
(1, 2, 3);
(1, 3, 2);
(2, 1, 3);
(2, 3, 1);
(3, 1, 2);
(3, 2, 1).
n programul ce urmeaz metoda lexicografic este realizat cu ajutorul procedurii
GenerarePermutari.
Program P163; { Generarea permutrilor }
const nmax=100;
type Permutare=array[1..nmax] of 1..nmax;
var P : Permutare;
n : 2..nmax;
Indicator : boolean;
i : integer;
62 | P a g i n

procedure GenerarePermutari(var Indicator: boolean);


label 1;
var i, j, k, aux : integer;
begin
{ permutarea identic }
if not Indicator then
begin
for i:=1 to n do P[i]:=i;
Indicator:=true;
goto 1;
end;
{ cutarea indicelui i }
i:=n-l;
while P[i]>P[i+l] do
begin
i:=i-l;
if i=0 then
begin
Indicator:=false;
goto 1;
end; { then }
end; {while }
{ cutarea indicelui k }
k:=n;
while P[i]>P[k] do k:=k-l;
aux:=P[i]; P[i]:=P[k]; P[k]:=aux;
for j:=l to (n-i) div 2 do
begin
aux:=P[i+j];
P[i+j]:=P[n-j+l];
P[n-j+1]:=aux;
end; { for }
Indicator:=true;
l:end; { GenerarePermutari }
begin
write('Dai n=f); readln(n);
Indicator:=false;
repeat
GenerarePermutari(Indicator);
if Indicator then
for i:=l to n do write(P[i]:3);
writeln;
until not Indicator;
readln;
end.
Pentru a porni de la permutarea iniial, nainte de primul apel al procedurii
GenerarePermutari, parametrului Indicator i se atribuie valoarea false. La fiecare apel
procedura nscrie n vectorul P permutarea ce urmeaz n ordine lexicografic i atribuie parametrului
Indicator valoarea true. Dup generarea tuturor permutrilor, procedura GenerarePermutari
va atribui parametrului Indicator valoarea false.
Din pcate, indiferent de metoda folosit, timpul necesar pentru generarea tuturor permutrilor
este cel puin O(n!). In consecin, algoritmii bazai pe cutarea soluiilor prin generarea tuturor
permutrilor posibile pot fi aplicai numai pentru valori mici ale lui n.
Generarea aranjamentelor. Numrul aranjamentelor de m elemente ale unei mulimi A={a1, a2,
..., an} cu n elemente este dat de formula
63 | P a g i n

M;
5 =

!
0 !

sau, pentru a evita folosirea funciei factorial,


M;
1 2 0 + 2 0 + 1 .
5 =
Ca i n cazul permutrilor, putem reduce problema generrii aranjamentelor unei mulimi
arbitrare A la generarea aranjamentelor mulimii I={1, 2, ..., n}. De exemplu, pentru I={1, 2, 3} i m=2
cele MQ =6 aranjamente snt:
(1,2); (2,1); (1,3);
(3,1); (2,3); (3,2).
Generarea aranjamentelor poate fi fcut n ordine lexicografic, pornind de la aranjamentul cel
mai mic a=(1, 2, ..., m).
Fie a=(a1, a2, ..., ai, ..., am) un aranjament oarecare. Pentru a determina succesorul a' al
aranjamentului a, se caut mai nti cel mai mare indice i cu proprietatea c ai poate fi mrit. Un element
a, poate fi mrit dac cel puin una din valorile ai+l, ai+2,..., n cu care ar putea fi nlocuit ai este
disponibil. Pentru a putea efectua mai uor aceste verificri, se utilizeaz vectorul D=(d1, d2,..., di, ...,
dn), unde di este 0 sau 1 n funcie dac valoarea i apare sau nu n aranjamentul curent a. n momentul n
care a fost determinat indicele i, elementele ai, ai+1,..., am vor obine n ordine cresctoare cele mai mici
numere disponibile.
Dac nu exist un indice i cu proprietatea menionat, nseamn c s-a ajuns la aranjamentul (nm+1, n-m+2, ..., n), deci procesul generrii s-a ncheiat. Pentru a semnala acest lucru, n programul ce
urmeaz se utilizeaz variabila boolean Indicator.
Program P164;
{ Generarea aranjamentelor }
const nmax=100;
mmax=100;
type Aranjament=array[1..mmax] of 1..nmax;
var A : Aranjament;
D : array[1..nmax] of 0..1;
n : 1..nmax;
m : 1..nmax;
i : integer;
Indicator : boolean;
procedure GenerareAranjamente(var Indicator : boolean);
label 1;
var i, j, k, 1 : integer;
begin
{ aranjamentul iniial }
if not Indicator then
begin
for i:=l to m do
begin
A[i]:=i; D[i]:=1;
end;
for i:=m+l to n do D[i]:=0;
Indicator:=true ;
goto 1;
end; { succesorul aranjamentului curent }
for i:=m downto 1 do
begin
D[A[i]]:=0;
for j:=Afi]+l to n do
if D[j]=0 then
begin
A[i]:=j; D[j]:=1; k:=0;
for l:=i+l to m do
begin
64 | P a g i n

repeat k:=k+l until D[k]=0;


A[l]:=k; D[k]:=1;
end; { for }
goto 1;
end; { if }
end; { for }
Indicator:=false;
l:end; { GenerareAranjamente }
begin
write ('Dai n=' ); readln(n);
write ('Dai m=' ); readln(m);
Indicator:=false;
repeat
GenerareAranjamente(Indicator);
if Indicator then
for i:=l to m do write(A[i]:3);
writeln;
until not Indicator;
readln;
end.
Aadar, complexitatea temporal a algoritmilor bazai pe generarea tuturor aranjamentelor este cel
mult O(n!).
Generarea combinrilor. Numrul de combinri de n elemente luate cte m (mn) se calculeaz
ca
M;
!
5
l5; =
=
N; 0! 0 !
De exemplu, pentru I={1, 2, 3} i m=2 avem l5; = 3 combinri:
{1, 2}; {1, 3}; {2, 3}

Generarea combinrilor poate fi fcut n ordine lexicografic, pornind de la combinarea iniial


{1,2, ..., m}.
Fiind dat o combinare c={c1, c2,..., ci, ..., cm}. Combinarea c care i urmeaz imediat n ordine
lexicografic se determin astfel:
se determin indicele i care satisface relaiile ci<n - m+1, ci+1=n-m+i+1, cm-1,=n-1, cm=n;
se trece la combinarea c={c1, ..., ci-1, ci+l, ci +2, ..., ci +n-i+l}.
Dac nu exist un indice i care satisface condiiile de mai sus, nseamn c au fost generate toate
combinrile.
n programul ce urmeaz combinrile mulimii I={1, 2,..., n} se genereaz consecutiv n vectorul
(tabloul unidimensional) C.
Program P165;
{ Generarea combinrilor }
const nmax=100;
mmax=100;
type Combinare=array [1. .mmax] of 1.nmax;
var C : Combinare;
n : 1..nmax;
m : 1..mmax;
i : integer;
Indicator : boolean;
procedure GenerareCombinari(var Indicator : boolean);
label 1;
var i, j : integer;
begin { combinarea iniiala }
if not Indicator then
65 | P a g i n

begin
for i:=l to m do C[i]:=i;
Indicator:=true;
goto 1;
end; { succesorul combinrii curente }
for i:=m downto 1 do
if C[i]<(n-m+i) then
begin
C[i]:=C[i]+l;
for j:=i+l to m do C[j]:=C[j-1]+1;
goto 1;
end; { then } Indicator:=false;
l:end; { GenerareCombinari }
begin
write ('Dai n='); readln(n);
write ('Dai m='); readln(m);
Indicator:=false;
repeat
GenerareCombinari(Indicator);
if Indicator then
for i:=l to m do write(C[i]:3);
writeln;
until not Indicator;
readln;
end.
Se poate demonstra c timpul cerut de un algoritm bazat pe generarea tuturor combinrilor este de
ordinul O(nk), unde k=min(m, n-m+1), deci polinomial.
ntrebri i exerciii
1. Scriei un program PASCAL care afieaz la ecran numrul permutrilor Pn, numrul aranja;
mentelor M;
5 i numrul combinrilor l5 . Valorile n i m se citesc de la tastatur.
2. Elaborai o procedur recursiv pentru generarea tuturor permutrilor posibile ale mulimii
I={1,2,...,n}.
3. Utiliznd metoda relurii, schiai trei algoritmi pentru generarea, respectiv, a permutrilor, aranjamentelor i combinrilor unei mulimi formate din n elemente distincte.
4. Se consider un tablou bidimensional T[1..n, 1..n] format din numere ntregi. Elaborai un
program care determin o permutare a coloanelor tabloului astfel nct suma componentelor de pe
diagonala principal s fie minim.
5. Elaborai un program care afieaz la ecran toate irurile posibile formate din caracterele A, b, C,
d, E. Fiecare caracter apare n ir numai o singur dat.
6. Dintr-o list ce conine n candidai trebuie alese m persoane care vor fi incluse n echipa de fotbal
a unui jude. Elaborai un program care afieaz la ecran toate modalitile de selecie a celor m
persoane.
7. Se consider mulimea numerelor ntregi A={a1, a2,..., an}. Elaborai un program care determin o
submulime ce conine exact m elemente ale mulimii A astfel nct suma lor s fie maxim.
8. Cum credei, care snt avantajele i neajunsurile algoritmilor bazai pe generarea tuturor permutrilor, aranjamentelor i combinrilor posibile?
9. Exist oare tehnici de programare care ar permite evitarea unei analize exhaustive a tuturor
permutrilor, aranjamentelor sau combinrilor posibile?
10. Se consider mulimea numerelor ntregi A={a1, a2,...,an}. Elaborai un program care determin o
descompunere a mulimii A n dou submulimi nevide B i C astfel nct suma elementelor din
submulimea B s fie egal cu suma elementelor din submulimea C. De exemplu, pentru A={-4,1,0,1,2,3,9} avem B={-4, 0, 9} i C={-1,1,2,3}.

66 | P a g i n

Capitolul 4
PROBLEME RECAPITULATIVE
Problemele ce urmeaz au fost propuse la diverse concursuri de informatic. Rezolvarea lor
necesit cunoaterea profund a tehnicilor de programare i a metodelor de estimare a complexitii
algoritmilor.
1. Cercuri. Un ptrat cu latura a cm conine n cercuri (n 100). Fiecare cerc i este definit prin
coordonatele centrului (xi, yi) i raza ri. Elaborai un program care n cel mult t secunde calculeaz ct
mai exact aria obinut prin reuniunea celor n cercuri.
2. Puncte. Se dau n puncte n plan, n < 100. S se calculeze numrul maxim de puncte coliniare.
3. Poduri. Se consider n insule legate prin m poduri. E cunoscut faptul c pe podul ce leag
insulele i, j pot circula vehicule greutatea crora nu depete gij tone. Determinai greutatea maxim Gab
a vehiculului care poate ajunge de pe insula a pe insula b.
4. Texte. Se consider n texte care trebuie tiprite pe foi de hrtie. Textul i este format din ri linii.
Pe o foaie pot fi tiprite cel mult m linii care pot forma unul, dou sau mai multe texte. Pentru a le
separa, ntre textele de pe aceeai foaie se insereaz o linie vid. Fragmentarea textelor este interzis,
adic toate liniile oricrui text trebuie imprimate pe aceeai foaie. Elaborai un program care determin
numrul minim de foi necesare pentru a tipri toate textele.
5. Circumferine. Se consider n puncte pe un plan cartezian. Fiecare punct i este definit prin
coordonatele sale xi, yi. Elaborai un program care verific, dac punctele n studiu aparin unei
circumferine.
6. Reeaua telefonic. Se consider n orae, n 100, care trebuie legate prin cabluri ntr-o reea
telefonic. Pentru fiecare ora i snt cunoscute coordonatele carteziene xi, yi. Cablurile telefonice ce
leag oricare dou orae nu pot avea ramificaii. Abonaii reelei telefonice comunic ntre ei direct sau
prin intermediul staiilor telefonice din alte orae. Lungimea cablului care leag oraele i,j este egal cu
distana ntre ele. Determinai lungimea sumar minim a cablurilor necesare pentru a conecta toate
oraele.
7. Evaluarea expresiilor. Se consider expresiile aritmetice formate din numere ntregi, parantezele
(, ) i operatorii binari +, -, *, mod, div. Scriei un program care evalueaz expresiile aritmetice n
studiu.
8. Psihologie. Se consider n angajai, n 100, care trebuie repartizai n m echipe. Fiecare echip
este format din k angajai, k * m = n. Relaia de compatibilitate ntre angajaii i,j se caracterizeaz prin
coeficientul rij care poate lua valorile 0 (incompatibili), 1, 2,..., 10 (compatibilitate excelent).
Compatibilitatea ntregului colectiv C se calculeaz nsu-mnd coeficienii rij pentru toate perechile
posibile (i,j) din cadrul fiecrei echipe. Determinai compatibilitatea maxim Cmax care poate fi asigurat
prin formarea corespunztoare a echipelor.
9. Compasul. Se consider n puncte pe un plan cartezian. Fiecare punct i este specificat prin
coordonatele sale xi, yi. Elaborai un program care verific, dac se poate desena o circumferin cu
centrul n unul din punctele n studiu i care ar trece prin toate celelalte puncte.
10. Intersecia dreptunghiurilor. Se dau n dreptunghiuri (n 10) care au laturile paralele cu
axele de coordonate, iar coordonatele vrfurilor snt numere naturale din mulimea {0, 1, 2,..., 20}.
Elaborai un program care calculeaz aria figurii obinute prin intersecia celor n dreptunghiuri.
11. Reuniunea dreptunghiurilor. Se dau n dreptunghiuri (n 10) care au laturile paralele cu
axele de coordonate, iar coordonatele vrfurilor snt numere reale. Elaborai un program care calculeaz
aria figurii obinute prin reuniunea celor n dreptunghiuri.
12. Numere prime. Calculai toate numerele prime formate din 4 cifre inversul crora este la fel
un numr prim, iar suma cifrelor este de asemenea un numr prim.
13. Vizibilitate. Se consider linia frnt nchis P1P2... PnP1, n 20, care nu se autointersecteaz. n punctul A din interiorul liniei este situat un observator. Pentru observator unele segmente
ale liniei frnte pot fi invizibile. Elaborai un program care calculeaz numrul segmentelor invizibile.
14. Felinare. Un parc de form dreptunghiular este mprit n ptrate de aceleai dimensiuni, n
fiecare ptrat al parcului poate fi instalat cte un felinar. n general, un felinar asigur iluminarea nu
numai a ptratului n care se afl, dar i a celor opt ptrate vecine. Elaborai un program care determin
numrul minim de felinare necesare pentru iluminarea parcului.

67 | P a g i n

15. Laserul. Se consider o plac dreptunghiular cu dimensiunile m*n, unde m i n snt numere
naturale. Aceast plac trebuie tiat n m*n plci mai mici, fiecare bucat avnd forma unui ptrat cu
dimensiunile l x l. ntruct placa este neomogen, pentru fiecare bucat se indic densitatea dxy, unde x, y
snt coordonatele colului stnga-jos al ptratului respectiv.
Pentru operaiile de tiere se folosete un strung cu laser. Fiecare operaie de tiere include:
- fixarea unei plci pe masa de tiere;
- stabilirea puterii laserului n funcie de densitatea materialului de tiat;
- o singur deplasare a laserului de-a lungul oricrei drepte paralele cu una din axele de coordonate;
- scoaterea celor dou plci de pe masa de tiere.
Costul unei operaii de tiere se determin dup formula c = dmax, unde dmax este densitatea
maxim a bucilor l x l peste marginile crora trece raza laserului. Evident, costul total T poate fi
determinat adunnd costurile individuale c ale tuturor operaiilor de tiere necesare pentru obinerea
bucilor l x l. Scriei un program care calculeaz costul minim T.
16. Judee. Teritoriul unei ri este mprit n judee (fig. 21). Pe hart, frontiera rii i graniele
administrative ale fiecrui jude reprezint cte un poligon definit prin coordonatele (xi, yi) ale vrfurilor
sale. Se presupune c vrfurile de poligoane snt numerotate direct prin 1, 2, 3, ..., n, iar coordonatele lor
snt numere ntregi. n interiorul oricrui jude nu exist alte judee.
Un virus de calculator a distrus parial informaia despre graniele administrative, lsnd intacte
urmtoarele date:
- numrul n i coordonatele (xi, yi) ale tuturor vrfurilor de poligoane;
- numrul de segmente m care formeaz laturi de poligoane i informaia despre extremitile
fiecrui segment.
y
9
8
7
6 3
5

1
2

4
5

4
7
8
9
3
10
2
1
11
0
1 2 3 4 5 6 7 8

Fig. 21. Judeele unei ri


Scriei un program care determin numrul de judee d i vrfurile fiecrui poligon ce reprezint o
grani administrativ de jude.
17. Turnuri. Fie n plci dreptunghiulare numerotate de la 1 la n. Despre placa i se tie c are
grosimea hi i lungimile laturilor xi, yi. Elaborai un program care determin nlimea maxim a unui
turn ce poate fi construit din plcile n studiu. Pentru a asigura stabilitatea turnului, se vor respecta
urmtoarele reguli (fig. 22):
- plcile snt puse una peste alta orizontal, nu pe muchii sau n alt mod;
- muchiile omoloage ale plcilor suprapuse snt paralele;

Fig. 22. Turn construit din plci dreptunghiulare


68 | P a g i n

- orice plac din componena turnului se va sprijini n ntregime pe placa de mai jos (evident, placa
de la baza tunului se sprijin pe sol);
- nu se cere s folosim toate plcile.
Date de intrare. Fiierul text TURNURI.IN conine pe prima linie numrul n. Pe fiecare din
urmtoarele n linii se conin cte trei numere ntregi pozitive xi, yi, hi separate prin spaiu.
Date de ieire. Fiierul text TURNURI.OUT va conine pe o singur linie un numr ntreg nlimea maxim a turului.
Exemplu:
TURNURI.IN
5
3
3
4
1
2

TURNURI.OUT
8

4
4
3
5
2

2
3
2
4
1

Restricii: n 1000; xi, yi < 1000. Timpul de execuie nu va depi 10 sec.


18. Speologie. Speologul este un specialist care se ocup cu explorarea i studierea peterilor.
Antrenarea speologilor presupune parcurgerea unor labirinturi subterane. Un astfel de labirint const din
n, n 100, peteri i galerii (fig. 23). Fiecare peter are o denumire individual format din cel mult 10
caractere alfanumerice, fr spaii, scris pe unul din pereii ei. Petera de intrare are denumirea
INTRARE, iar cea de ieire - denumirea IEIRE. La intrarea n fiecare galerie este scris denumirea
peterii spre care ea duce.
Speologul nu cunoate planul labirintului. n schimb, el este echipat cu un caiet, un creion i o
lantern, fapt ce i permite s poat citi denumirile de peteri sau de galerii i s fac notie. Vom numi
drum o succesiune de peteri cu proprietatea c ntre oricare dou peteri consecutive din succesiune
exist o galerie. Prin lungimea drumului nelegem numrul de peteri ce-l formeaz. De exemplu,
drumul INTRARE, STALAGMITE, LILIECI, IZVOARE, IEIRE are lungimea 5.
Elaborai un program care gsete unul din cele mai scurte drumuri de la petera INTRARE la
petera IEIRE.
Date de intrare. Fiier de intrare nu exist. Totui caracteristica peterii curente poate fi aflat prin
apelul funciei predefinite UndeMaAflu de tip string. Funcia returneaz un ir de caractere ce conine
denumirea peterii n care n prezent se afl speologul, dou puncte i denumirile de intrri de galerii,
separate prin spaiu. De exemplu, dac speologul se afl n petera LILIECI, funcia va ntoarce
valoarea:
LILIECI: STALAGMITE IZVOARE LILIECI LILIECI
Trecerea speologului din petera curent n petera spre care duce galeria c se realizeaz prin
apelul procedurii predefinite TreciCoridorul (g), unde g este o expresie de tip string. Dac se
indic un coridor inexistent, speologul rmne pe loc. Pentru ca aceste subprograme s fie accesibile,
includei n partea declarativ a programului de elaborat linia
uses LABIRINT;
Date de ieire. Fiierul text SPEOLOG.OUT va conine pe prima linie un numr ntreg - lungimea
celui mai scurt drum. Pe urmtoarele linii se va scrie dramul. Fiecare denumire de

Fig. 23. Planul unei peteri


69 | P a g i n

peter ocup o linie separat. Dac un astfel de drum nu exist, fiierul va conine o singur linie cu
cuvntul FUNDAC.
Exemplu. Pentru labirintul din figura 23 avem:
SPEOLOG.OUT

Timpul de execuie nu va depi 20 sec.


19. Livada. Planul unei livezi de form dreptunghiular cu dimensiunile n*m este format din zone
ptrate cu latura 1. n fiecare zon crete o singur specie de arbori. Orice specie de arbori poate ocupa
una sau mai multe zone, nu neaprat vecine. Elaborai un program care gsete un sector dreptunghiular
de arie minim ce conine cel puin k specii de arbori. Laturile sectorului vor coincide cu laturile zonelor
din plan.
20. Discoteca. La o discotec particip mai multe persoane, numerotate de la 1 la n. Iniial, numai
un singur participant, cel cu numrul i, cunoate o tire foarte important pe care el o comunic
prietenilor si. In continuare, orice participant j, care deja cunoate aceast tire, o comunic, de
asemenea, numai prietenilor si. Elaborai un program care determin numrul de participani p care vor
afla tirea respectiv. Relaia de prietenie este definit prin m perechi distincte de tipul {j, k} cu
semnificaia "participanii j, k snt prieteni". Se consider c 3 n 1000 i 2 m 30000.
21. Genistul. O poriune de drum este mprit n n segmente. Pe fiecare segment poate fi
plantat cel mult o min. Genistul a memorat informaia despre minele plantate ntr-un tablou
unidimensional M = ||mi|| n care mi = 1, dac segmentul i conine o min i m, = 0 n caz contrar. Pentru
orice eventualitate, genistul a cifrat informaia din tabloul M ntr-un alt tablou C = ||ci||n componentele
cruia se determin dup cum urmeaz:
0 + 0 , I. &DH = 1;
+ 06 + 06t , I. &DH 1 < < ;
6 = s 06
05 + 05 ,
I. &DH =
n condiiile de lupt datele din tabloul M au fost pierdute. Elaborai un program care calculeaz
tabloul Mavnd ca date de intrare tabloul C. Se consider c problema are cel puin o solue i 3 n
10000.

22. Cutii. Se consider n cutii n form de paralelipiped dreptunghiular. Pentru fiecare cutie snt
cunoscute cele trei dimensiuni xi, yi, zi. n funcie de dimensiunile cutiilor, unele din ele pot fi puse una
n alta. n general, cutiile pot fi rotite. Cutia i poate fi pus n cutiay numai atunci cnd n rezultatul
tuturor rotirilor posibile se va gsi o astfel de poziie pentru care dimensiunile cutiei i snt cu strictee
mai mici dect dimensiunile corespunztoare ale cutiei j. Pentru a asigura o mpachetare estetic, se cere
ca feele omoloage ale cutiilor s fie paralele (fig. 24). Mai mult dect att, unele cutii pot fi imbricate
sau, cu alte cuvinte, poate fi format un ir de numere de cutii i1, i2, i3,..., ik cu proprietatea c cutia z, se
afl n cutia i2; cutia i2 se afl n cutia i3 .a.m.d. Scriei un program care determin numrul maxim de
cutii kmax ce pot fi imbricate ntr-un astfel de ir.

Fig. 24. Cutii imbiricate


Date de intrare. Fiierul text CUTII.IN conine pe prima linie numrul natural n. Fiecare din
urmtoarele n linii conine cte trei numere naturale xi, yi, zi, separate prin spaiu.
70 | P a g i n

Date de ieire. Fiierul text CUTII.OUT va conine pe o singur linie numrul natural kmax.
Exemplu.
CUTII.IN
5
4
1
2
1
1

CUTII.OUT
3

4
3
2
1
1

4
5
3
1
2

Restricii. 2 n 500; 1 xi, yi, zi 30000. Timpul de execuie nu va depi 2 secunde.

71 | P a g i n

Bibliografie
1. Cerchez Emanuela, erban Marinel. Informatica. Manual pentru clasa a X-a. Filiera teoretic, profilul
matematic-informatic. Iai: Editura POLIROM, 2000. - 199 p.
2. Gremalschi Anatol, Mocanu Iurie, Spinei Ion. Informatica. Limbajul PASCAL. Manual pentru clasele
IX-XI. Chiinu, Editura TIINA, 2000. - 256 p.
3. Ivac Cornelia, Prun Mona. Bazele informaticii (Grafuri i elemente de combinatoric). Proiect de
manual pentru clasa a X-a. Profil informatic. Bucureti, Editura PETRION, 1995.-175 p.
4. Livovschi Leon, Georgescu Horia. Sinteza i analiza algoritmilor. Bucureti, Editura tiinific i
Enciclopedic, 1986. - 458 p.
5. Moraru Florin. Bacalaureat. Informatic. Bucureti, Editura PETRION, 2000. - 319 p.
6. Roca Ion Gh., Cocianu Ctlina, Uscatu Cristian. Bazele informaticii. Manual pentru clasa a X-a,
licee teoretice. Bucureti, Editura ALL EDUCATIONAL, 1999. - 64 p.
7. Roca Ion Gh., State Luminia, Ghilic-Micu Bogdan, Cocianu Ctlina-Luca, Stoica Marian, Uscatu
Cristian. Informatica. Manual pentru clasa a X-a. Profilul matematic-informatic. Bucureti, ALL
EDUCATIONAL, 2000. - 96 p.
8. Sorin Tudor. Informatica (Tehnici de programare). Manual pentru clasa a X-a. Varianta PASCAL.
Bucureti, Editura L&S INFOMAT, 2000. - 188 p.
9. Thomas H. Cormen, Charles E. Leiserson, Ronald R. Rivest. ntroducere n algoritmi. Cluj-Napoca,
Editura COMPUTER LIBRIS AGORA, 2000. - 881 p.
10. Axo B., Xonpom , . . .
.: . . - ., "", 2000. - 384 .

Imprimare la Editura Universul


str. Vlaicu Prclab, 45
Comanda nr. 4955

72 | P a g i n