Documente Academic
Documente Profesional
Documente Cultură
Algoritmi
Dup cum s-a specificat n paragraful 1.3, etapa preliminar scrierii unui algoritm de
rezolvare a unei probleme este analiza acesteia, n cadrul creia trebuie determinate mrimile
de intrare, cele de ieire, precum si relaiile ce conduc la obinerea marimilor de ieire. n
cadrul etapei de descriere a algoritmului de rezolvare a problemei, trebuie descris de fapt
succesiunea operaiilor care realizeaz relaiile determinate anterior. Un algoritm care nu este
precedat de o analiz corect a problemei de rezolvat este de cele mai multe ori un algoritm
eronat sau neperformant.
ntre cele dou cuvinte se specific secvena de instruciuni ce formeaz descrierea rezolvrii
problemei asociate. O secven de instruciuni reprezint un ir de instruciuni, scrise n mod
uzual unele sub altele, care se execut secvenial (una dup alta).
Cele mai utilizate instruciuni sunt cele de citire i scriere a datelor, de atribuire, de
selecie i instruciunile repetitive.
Corespunztor intrrii i ieirii unui algoritm, limbajul algoritmic posed dou
instruciuni, numite instruciunea de citire, respectiv instruciunea de scriere. Prima este
folosit pentru citirea din afara algoritmului a datelor de intrare n algoritm, iar a doua pentru
scrierea n afara algoritmului a datelor de ieire (a rezultatelor).
Instruciunea de citire are urmtoarea form sintactic:
citeste lista variabile
unde lista variabile reprezint o list de una sau mai multe variabile de intrare ale
algoritmului, separate prin virgul dac sunt mai multe.
Observaie. Cracterele i nu fac parte din sintaxa limbajului algoritmic, ci din cea a
limbajului de descriere. ntre cele dou caractere se specific o categorie sintactic, adic o
mulime de construcii sintactice grupate mpreun.
Exemple de instruciuni de citire:
citeste x
citeste a, b, c
unde lista parametri reprezint o list de unul sau mai muli parametri separai prin
virgul.
Exist dou categorii de parametri: de tip mesaj i de tip expresie. Parametrii de tip
mesaj sunt iruri de caractere cuprinse ntre dou apostrofuri i sunt utilizai pentru
tranmiterea unor mesaje n exteriorul algoritmilor. Valoarea unui astfel de parametru este
chiar irul de caractere. Prametrii de tip expreise sunt expresii care se pot evalua. Valoarea
unui astfel de parametru este cea rezultat n urma evalurii.
Exemple de instruciuni de scriere:
scrie x
scrie Acesta este un mesaj
scrie x=, x
Exemplul 2.2. S se scrie un algoritm care determin suma i produsul a dou numere date.
Descrierea algoritmului
Notnd cu x i y variabilele de intrare corespunztoare valorilor de intrare, algoritmul
se poate descrie astfe:
start
citeste x, y
scrie suma=, x+y, produsul=, x*y
sfarsit
Una dintre cele mai utilizate instruciuni, att n limbajul algoritmic, ct i n limbajele de
programare, este instruciunea de atribuire. Aceasta reprezint cel de-al doilea mod prin care
se pot asigna valori variabilelor. Definiia sintactic a instruciunii este:
atribuie variabila expresie
unde variabila este numele unei variabile a algoritmului, iar expresie este o
expresie compatibil cu variabila. Cracterul reprezint operatorul de atribuire i are
rolul de a indica sensul de transfer al informaiei. ntruct operatorul de atribuire identific
exact instruciunea de atribuire, cuvntul cheie atribuie se poate omite, rezultnd o form
simplificat de scriere:
variabila expresie
n mod uzual, operatorii care apar n cadrul expresiilor sunt preluai din matematic,
reprezentnd principalele operaii, dar mulimea acestora poate fi extins pentru a cuprinde
operaii din diferite domenii. Dei nu se specific n mod formal, urmtoarele categorii de
operatori sunt mai des utilizai:
- operatori aritmetici:
- +, -, *, /: reprezint operaiile algebrice elementare;
...
altfel daca expresie n atunci
secventa n
altfel
secventa n+1
scrie x,y
sfarsit
Exist cazuri n care a doua alternativ dintr-o decizie nu apare. n acest caz se poate utiliza
forma scurt a instruciunii de decizie:
daca expresie atunci
secventa
n cazul n care expresia logic este adevrat, se execut secvena de instruciuni intern; n
caz contrar, instruciunea de decizie este inefectiv.
Exemplul 2.4. S relum exemplul precedent, dar folosind doar instruciuni de decizie cu
form scurt: pentru fiecare ramur a funciei se va considera o singur instruciune de
decizie.
start
citeste x
daca x<-2 atunci
y -2*x2-x+2
daca x1 atunci
y (2*x2+x-2)/(2*x+1)
scrie x,y
sfarsit
Exemplul 2.5. S se determine cel mai mare divizor comun a dou numere ntregi folosind
algoritmul lui Euclid.
Aanaliza problemei.
Algoritmul lui Euclid a fost prezentat anterior. Se vor utiliza dou variabile de intrare,
m i n, reprezentnd iniial cele dou numere. n timpul operaiilor repetate de determinare a
ctului, m reprezint dempritul, n mpritorul, iar r restul mpririi. Dup fiecare iteraie,
se vor efectua atribuirrile: mn, nr, pentru reiniializarea variabilelor la urmtoarea
iteraie. Rezultatul problemei va fi memorat n variabila n, care stocheaz ultimul rest nenul.
Descrierea algoritmului.
start
citeste m, n
cat timp m mod n 0 executa
r m mod n
//se determina restul
m n
n r
scrie n
sfarsit
cat timp x0
scrie np
sfarsit
n cazul precedentelor dou instruciuni repetitive, numrul de iteraii este greu de estimat n
faza de proiectare a algoritmului. Sunt ns situaii n care acesta poate fi estimat relativ uor.
n aceste cazuri este probabil preferabil utilizarea instruciunii repetitive cu numr
cunoscut de iteraii.
De data aceasta gestionarea numrului de iteraii se realizeaz cu ajutorul unei
variabile numite variabila de control a instruciunii. Aceasta va primi n timpul execuiei
instruciunii repetitive valori succesive dintr-un ir de valori monoton, mrginit de dou
valori distincte numite valoare iniial, respectiv valoare final. Valoarea iniial este chiar
prima valoare din sir, pe cnd valoarea final este doar o margine a irului de valori (margine
superioar n cazul unui ir cresctor, sau margine inferioar n cazul unui ir descresctor).
irul valorilor variabilei de control are proprietatea c diferena ntre oricare dou
valori consecutive este constant. Aceast constant se numete pas de incrementare. Astfel,
irul valorilor unei variabile de control se poate determina dac se cunosc valoarea iniial,
limita final i pasul de incrementare.
Notnd cu vi, vf i p valoarea iniial, limita final, respectiv pasul de incrementare, iat
cteva exemple de iruri de valori pentru variabila v:
a) vi=2, vf=9, p=2 v{2, 4, 6, 8}
b) vi=9, vf=2, p=-2 v{9, 7, 5, 3}
c) vi=2, vf=2, p=3 v{2}
d) vi=2, vf=9, p=0 v{2, 2, 2, ...}
Se observ faptul c ntre valoarea iniial vi, limita final vf i pasul de incrementare p
trebuie s existe anumite relaii:
unde:
- variabila reprezint numele unei unei variabile din algoritm, care este variabila
de control a instruciunii repetitive;
- expresie1, expresie2 i expresie3 sunt trei expresii compatibile cu
tipul variabilei de control a cror valoare reprezint: valoarea iniial, valoarea final,
respectiv pasul de incrementare.
Observaie. Parantezele drepte nu fac parte din sintaxa instruciunii, ci din cea a limbajului
de descriere: ntre paranteze drepte se specific acele construcii sintactice opionale. n cazul
n care ntr-o instruciune, pasul de incrementare nu este specificat, el are valoarea implicit
1.
De exemplu, urmtoarele instruciuni afieaz urmtoarele valori:
pentru i1 la 10 executa
scrie i
afieaz valorile: 1, 2, 3, 4, 5
pentru i1 la 10 pas 2 executa
scrie i
afieaz valorile: 1, 3, 5, 7, 9
pentru i10 la 1 pas -2 executa
scrie i
Pentru calculul lui S se va utiliza o relaie de recuren. Vom nota cu Si suma cuburilor
primelor i numere naturale:
Si=13+23+ ... +i3.
Definim relaia astfel:
(1)
Si=Si-1+i3, pentru i>0,
S0=0.
Se observ astfel c Sn=S, suma ce trebuie determinat.
Se va utiliza proprietatea instruciunii de atribuire, n care o variabil poate apare n ambele
pri ale operatorului de atribuire, astfel nct instruciunea:
S S + i3,
reprezint chiar relaia (1) la iteraia I.
Folosind aceast observaie, se va utiliza variabila S pentru stocarea valorilor Si la diferitele
iteraii (adic va memora pe rnd valorile S0, S1, ..., Sn). Variabila va fi iniializat cu
valoarea 0, iar dup ultima iteraie va memora chiar valoarea dorit.
Descrierea algoritmului.
start
citeste n
s 0
pentru k1 la n executa
s s+k3
scrie s
sfarsit
citeste n
* citirea sirului de numere x1, x2, ..., xn *
* calculul mediei aritmetice:medie=(x1+ x2+ ...+ xn)/n *
scrie med
sfarsit
Sfarsit
* calculul mediei aritmetice:medie=(x1+ x2+ ...+ xn)/n *
s 0
pentru i 1 la n executa
s s+xi
medie s/n
sfarsit
Se observ faptul c rafinarea unei propoziii nestandard conine trei elemente: enunul
propoziiei, secvena de instruciuni ce formeaz descrierea rezolvrii problemei aferente si
cuvntul cheie sfarsit, care are rolul de a delimita rafinarea propoziiei curente.
n cazul n care anumite subprobleme sunt de asemenea complexe, procesul de
mprire n subprobleme poate continua. Rezult astfel o descriere a algoritmului pe nivele:
- pe nivelul 0 se afl algoritmul principal al problemei;
- pe nivelul 1 se afl refinrile propoziiilor nestandard de pe nivelul 0;
- n general, pe nivelul k se afl refinrile propoziiilor nestandard de pe nivelul k-1.
Operaia de rafinare succesiv continu pn la un nivel n care rafinrile tuturor propoziiilor
conin doar instruciuni standard ale limbajului algoritmic.
Exemplul 2.9. Dndu-se un numr natural k i o matrice ptrat A de dimensiune nn, s se
determine matricea B=Ak.
Analiza problemei.
Conform definiiei puterii unei matrici:
A0=I, Ak=Ak-1*A, pentru k>0,
se poate descrie algoritmul de rezolvare dup ablonul problemei redus la numere reale:
Dndu-se un numr natural k i un numr real a, s se determine numrul b=ak.
Un algoritm pentru acesta este:
start
citeste k
citeste a
b 1
pentru p 1 la k executa
c b*a
b c
scrie b
sfarsit
Descrierea algoritmului.
Subproblemele puse n eviden corespund celor citirii matricii A i scrierii matricii B,
instruciunii de atribuire, precum i intruciunii repetitive. Nivelul 0 este:
start
citeste k
* citeste matricea A *
* atribuie mtricial B I *
* determina matricea: B=Ak *
* scrie matricea B *
sfarsit
sfarsit
* atribuie mtricial B I *
pentru i 1 la n executa
pentru j 1 la n executa
daca i=j atunci
bij 1
altfel
bij 0
sfarsit
* determina matricea: B=Ak *
pentru p 1 la k executa
* determina matricea: C = B*A *
* atribuie matricial: B C *
sfarsit
* scrie matricea B *
pentru i 1 la n executa
pentru j 1 la n executa
scrie bij
sfarsit
sfarsit
* atribuie matricial: B C *
pentru i 1 la n executa
pentru j 1 la n executa
scrie bij cij
sfarsit
Execuia algoritmilor descrii prin metoda rafinarilor succesive nu este direct. nainte de
execuia propriu-zis, va trebui ca un asemenea algoritm s fie transformat ntr-un algoritm
echivalent din punct de vedere paragmatic, dar care nu contine dect instruciuni standard ale
limbajului. Notnd cu n numrul nivelulu maxim, operaia de transformare a algoritmului se
poate descrie astfel:
pentru k n-1 la 0 pas -1 executa
pentru *fiecare rafinare r de pe nivelul k* executa
pentru *fiecare propozitie nestandard p din rafinarea r* executa
*inlocuieste propozitia p cu rafinarea sa de pe nivelul k+1*
Cu alte cuvinte, ncepnd de la penultimul nivel, se vor substitui toate propoziiile nestandard
cu rafinrile lor aflate pe nivelul imediat urmtor. Se asigur n acest mod apariia doar a
instruciunilor standard ale limbajului.
n exemplul anterior, se vor substitui nti propoziiile nestandard: *determina
matricea:C=B*A* i *atribuie matricial:BC* n propoziia *determina matricea:B=Ak *.
La pasul urmtor se vor substitui cele patru propoziii nestandard din algoritmul principal cu
rafinrile lor, rezultnd un algoritm direct executabil:
start
citeste k
pentru i 1 la n executa
pentru j 1 la n executa
citeste aij
pentru i 1 la n executa
pentru j 1 la n executa
daca i=j atunci
bij 1
altfel
bij 0
pentru p 1 la k executa
pentru i 1 la n executa
pentru j 1 la n executa
cij 0
pentru s 1 la n executa
cij cij+aik*bkj
pentru i 1 la n executa
pentru j 1 la n executa
cij bij
pentru i 1 la n executa
pentru j 1 la n executa
scrie bij
sfarsit
sfarsit
returneaza s/nr
sfarsit
Descrierea algortimului n forma prezentat mai sus are avantajul execuiei directe a acestuia
prin apelul procedurii CitireElementeSir i a funciei CalculMedieAritmetica.
Deosebirea ntre funcii i proceduri se refer la rezultatul determinat de acestea.
Funciile sunt folosite n cazul n care subprobleme aferente au drept scop principal
determinarea unei valori simple, pe cnd procedurile au drept scop principal efectuarea
anumitor operaii. Distincia ntre acestea nu este ns foarte clar, pentru c i funciile pot
avea mai multe mrimi de ieire transmise prin parametri.
Se observ dublul avantaj al folosirii funciilor i procedurilor:
a) descrierea subproblememelor folosind un nalt grad de generalitate;
b) modul simplu de execuie al algoritmilor, ntruct funciile i procedurile reprezint
elemente executabile i care pot fi apelate.
Din acest motiv, se va analiza distinct att operaia de definire a funciilor i procedurilor,
precum i operaia de apel a acestora.
Observaie. Caracterele [ i ] nu fac parte din sintaxa limbajului algoritmic, ci din cea a
limbajului de descriere. ntre dou paranteze drepte se specific n mod uzual o categorie
sintactic opional (care poate sau nu s apar mtr-un algoritm).
Antetul unei funcii sau proceduri conine un cuvnt cheie specificnd tipul acesteia (funcie
sau procedur), un identificator reprezentnd numele asociat ei, precum i parametrii formali
ai acesteia.
Parametri formali ai unei funcii sau proceduri sunt opionali i reprezint modul prin
care funcia/procedura interacioneaz cu exteriorul, specificnd mrimile de intrare i de
ieire. O funcie sau o procedur fiind de fapt un algoritm ce descrie modul de rezolvare al
unei subprobleme, ea poate primi la intrare valorile care sunt necesare pentru execuia
algoritmului (care sunt parametri formali de intrare ai funciei/procedurii respective) i
trebuie s determine mrimile de ieire ale acesteia (care sunt parametri formali de ieire).
Aceti parametri pot fi considerai drept variabile locale funciei/procedurii, care nu au
semnificaie n afara corpului acesteia.
Specificarea parametrilor de intrare se face cu ajutorul cuvntului cheie intrare,
iar a celor de ieire cu ajutorul cuvntului cheie ieire. n exemplul anterior parametrul nr
(specificnd numrul de elemente al irului) reprezint un parametru de intrare att n cazul
funciei ct i al procedurii, iar v (specificnd vectorul ce conine elementele irului) este un
parametru de ieire n cazul procedurii i unul de intrare n cazul funciei.
Observaie. Nu exist o distincie formal ntre subproblemele a cror rezolvare se descrie cu
ajutorul funciilor i cele care se descriu cu ajutorul procedurilor, acest lucru rmnnd la
latitudinea programatorului. O regul care se poate folosi sugereaz c funciile se pot folosi
pentru acele subprobleme a cror scop este determinarea unor mrimi simple scalare.
Corpul funciilor i procedurilor conine o secven de instruciuni care descriu rezolvarea
subproblemei aferente. Exist o instruciune care se poate utiliza n carpul corpurilor
funciilor/procedurilor, dar nu se poate utiliza ntr-un algoritm principal, numit instruciune
de ntoarcere, a crei sintax este:
returneaza [expresie]
unde returneaz este un cuvnt cheie, specificnd locul unde execuia procedurii sau a
funciei se ncheie, revenindu-se n algoritmul care a apelat-o. Categoria sintactic
expresie reprezint o expresie opional, folosit doar n cadrul funciilor. n acest caz,
valoarea expresisei reprezint chiar valoarea pe care funcia respectiv trebuie s o determine
i care trebuie returnat algoritmului apelant. n cazul n care expresia lipsete, instruciunea
se utilizeaz n corpul procedurilor, n caz contrar ea utilizndu-se n corpul funciilor. n
exemplul anterior, instruciunea de ntoarcere este folosit doar n cadrul funciei
CalculMedieAritmetica, expresia s/nr reprezentnd media aritmetic pe care funcia trebuie
s o calculeze.
Observaie. n corpul unei proceduri instruciunea de ntoarcere este opional; n cazul n
care instruciunea de ntoarcere lipsete, execuie procedurii se termin dup execuia ultimei
instruciuni din corpul ei. n corpul unei funcii trebuie s existe cel puin o instruciune de
ntoarcere, pentru c o funcie ntotdeauna returneaz o valoare.
Operaia de definire a funciilor i procedurilor reprezint componenta declarativ a
subproblemelor descrise, pe cnd execuia lor reprezint o component pragmatic,
specificnd momentul i modul de execuia a acestora.
2.4.2 Apelul i execuia funciilor i procedurilor
n cazul n care se folosesc funcii sau proceduri pentru descrierea unui algoritm, trebuie
realizate dou operaii distincte: definirea funciilor i/sau procedurilor folosite, precum i
apelul acestora n cadrul algoritmului. Din punct de vedere sintactic, apelul indic numele
funciei/procedurii apelate, precum i parametrii de apel, specificai ntre paranteze rotunde:
identificator ([lista parametri de apel])
Apelul unei funcii sau proceduri presupune efectuarea mai multor etape:
1) suspendarea execuiei elgoritmului apelant n locul apelului respectiv;
2) transferul informaiei dinspre algoritmul apelant spre procedura/funcia apelat;
3) execuia funciei/prodedurii apenate;
4) transferul informaiei dinspre funcia/procedura apelat spre algoritmul apelant;
5) reluarea execuiei algoritmului apelant din locul imediat urmtor apelului.
Execuia funciei/procedurii apelate se realizeaz secvenial ncepnd cu prima instruciune
din corpul acesteia. Execuia se termin fie la ntlnirea primei instruciuni de ntoarcere, iar
dac aceasta nu exist (n cazul procedurilor), dup ultima instruciune.
Exemplul 2.11 Considerndu-se un ir de numere reale, s se determine poziia primului
element negativ din ir. Se va folosi o funcie care primete ca parametri de intrare numrul
de elemente precun i vectorul elementelor. Funcia va returna poziia primului elment
negativ din ir, iar n cazul n care irul nu conine elemente negative, se va returna numrul
0.
start
citeste n
CitireElementeSir(n,x)
k DeterminaPozitia(n,x)
daca k > 0 atunci
scrie k
altfel
scrie Nu sunt elemete negative
sfarsit
functia DeterminaPozitia(intrare dim, v)
pentru i 1 la dim executa
daca vi < 0 atunci
returneaza i
returneaza 0
sfarsit
expresia din partea dreapt a operatorului de atribuire conine doar un apel de funcie, iar
evaluarea expresiei se reduce la nlocuirea apelului: DeterminaPozitia(n,x) cu
valoarea returnat de execuia funciei respective.
Exist cazuri n care pentru o anumit funcie sau procedur, anumii pararmetri pot fi att de
intrare ct i de ieire, n sensul c la nceputul execuiei funciei/procedurii intr cu anumite
valori, iar la sfritul execuiei se ntorc n algoritmul apelant cu valorile modificate. Acetia
formeaz o categorie aparte: parametri de intrare i ieire, specificai de cuvntul cheie
intrare-iesire. Ei se comport la fel cu parametrii de intrare la etapa a doua a apelului
i la fel cu parametrii de ieire la etapa a patra a apelului. Exemplul urmtor utilizeaz
parametri de intrare-ieire.
Exemplul 2.12 S se determine derivata de ordinul k a unui polinom.
Analiza problemei.
Fie polinomul:
P = a0 + a1X + ... + anXn,
care va fi specificat prin gradul su i vectorul coeficienilor.
ScrieCoeficienti(n,a)
sfarsit
procedura CitesteCoeficienti(intrare dim, iesire a)
pentru i 0 la dim executa
citeste ai
sfarsit
procedura ScrieCoeficienti(intrare dim, a)
pentru i 0 la dim executa
scrie ai
sfarsit
procedura DerivataPolinom(intrare-iesire dim, a)
pentru i 0 la dim-1 executa
ai (i+1)*ai+1
dim dim-1
sfarsit
n cazul n care o funcie sau o procedur are mai multe tipuri de parametri formali, n mod
uzual se declar nti parametrii de intrare, apoi parametrii de intrare-ieire i parametrii de
ieire.
Evaluarea expresiilor logice sau de relatie din cadrul instruciunilor de decizie sau
repetitive
Evaluarea expresiilor aritmetice din cadrul instruciunii repetitive cu numr cunoscut
de pai
Considernd c toate operaiile elementare au acelai cost de execuie (presupus, n general,
egal cu 1), timpul de execuie se obine prin nsumarea costurilor prelucrrilor din algoritm.
S exemplificm operaia de analiz pe urmtorul algoritm tipic:
Exemplul 2.13 S se determine valoarea maxim a unui ir de numere, precum i poziia din
ir a valorii maxime. n cazul n care sunt mai multe valori maxime, s se determine ultima
valoare. Descrierea formal este urmtoarea:
Dndu-se n elemente, x1, x2, ..., xn, s se determine m i j astfel nct:
m=xj=max(x1, x2, ..., xn),
pentru care j este cel mai mare posibil.
Analiza problemei.
Se vor utiliza urmtoarele variabile de ieire:
- m, pentru memorarea valorii maxime pn la valoarea curent care se testeaz;
- j, pentru memorarea indicelui valorii maxime.
Iniial, valoarea maxim se consider x1. Se vor parcurge pe rnd elementele irului de
numere; dac elementul curent xi este mai mare dect valoarea maxim curent, acesta va
deveni noua valoare maxim.
Descrierea algoritmului.
1
2
2.1
3
4
5
5.1
5.1.1
5.1.2
start
citeste n
pentru k 1 la n executa
citeste xk
m x1
j 1
pentru k 2 la n executa
daca xk>m atunci
m xk
j k
scrie m,j
sfarsit
Pentru a putea fi identificate, s-au notat instruciunile cu numere. Instruciunile interne unor
instruciuni compuse s-au notat cu mai multe numere. De exemplu, instruciunea 5.1 este
instruciunea de decizie intern instruciunii repetitive 5. n general, numrul de numere cu
care este etichetat o instruciune indic nivelul de indentare al acesteia (nivelul de
includere).
Analiza algoritmului.
A. Timpul de execuie
Pentru analiza algoritmului, trebuie precizate cteva elemente privind timpul de execuie al
instruciunilor limbajului algoritmic:
a) toate instruciunile simple au un timp egal de execuie (presupus egal cu 1);
b) timpul de execuie al instruciunii de decizie este egal cu timpul de execuie al uneia
dintre secvenele interne de instruciuni (acea care se va executa) plus timpul de
evaluare al expresiei logice (presupus egal cu 1);
c) timpul de execuie al instruciunilor repetitive cu test iniial i final se calculeaz dup
urmtoarea formul:
t = n*(t1+1) ,
unde t1 reprezint timpul de execuie al instruciunilor din secvena intern, n numrul
de iteraii al instruciunii; constanta 1 provine de la evaluarea expresiei logice la
fiecare iteraie;
d) timpul de execuie al instruciunii repetitive cu numr cunoscut de iteraii se
calculeaz dup urmtoarea formul:
t = 1+n*(t1+2) ,
unde t1 reprezint timpul de execuie al instruciunilor din secvena intern, n numrul
de iteraii al instruciunii; constanta 2 provine de la operaia de determinare a valorii
curente a variabilei de control a instruciunii i de la evaluarea expresiei logice la
fiecare iteraie, iar constanta 1 de la operaia de iniializare a variabilei de control.
Se observ faptul c pentru determinarea timpului de execuie al unei instruciuni compuse,
este necesar s se determine timpul de execuie al unei secvene de instruciuni. Acesta este
egal cu suma timpilor de execuie al instruciunilor ce compun secvena.
Se poate estima acum timpul de execuie:
t = t1+t2+t3+t4+t5+t6,
unde:
t1 = t3 = t4 = t6 = 1,
t2 = 1+n*(t2.1+2) = 1+n*3, pentru c t2.1 = 1,
Rezult:
t = 2+3*n+*t.
Estimarea timpului t depinde de estimarea timpului de execuie a instruciunii 5.1. Aceasta
este o instruciune scurt de decizie: din cele (n-1) apeluri ale sale, o parte execut
instruciunile 5.1.1 i 5.1.2 (precum i evaluarea expresiei logice), iar cealalt doar evaluarea
expresiei logice. Notnd cu a numrul de execuii ale secvenei interne, timpul de execuie al
instruciunii 5 se poate scrie astfel:
t5 = 1 + 2*(n-1) + a*3 + (n-1-a)*1
Timpul total de execuie al algoritmului va fi:
t = 5+3*n+t5 = 3+6*n+2*a.
Singura valoare necunoscut este a, care reprezint numrul de modificri ale valorii maxime
curente. Acest numr depinde de distribuia valorilor din ir, deci de execuia algoritmului i
nu poate fi determinat exact n etapa de proiectare a acestuia.
n mod uzual, timpul de execuie al unui algoritm nu poate fi determinat exact. Din
acest motiv, analiza unui algoritm presupune determinarea unuia dintre urmtorii timpi de
execuie (sau mai muli dintre acetia):
- timpul maxim de execuie;
- timpul minim de execuie;
- timpul mediu de execuie.
n cazul algoritmului precedent, vor trebui determinate: valoarea minim, valoarea maxim i
cea media a lui a.
Valoarea minim a lui a este zero. Aceasta se ntmpl cnd irul este ordonat cresctor:
x1<x2< ... <xn. n acest caz, timpul minim al algoritmului este:
tmin = 1+6*n.
Valoarea maxim este n-1, n czul n care sirul este ordonat descrector: x1>x2> ... >xn. n
acest caz, timpul maxim al algoritmului este:
tmin = 1+8*n.
Valoarea medie a lui a este cuprins ntre 0 i n-1, dar este mai greu de estimat. Pentru
determinarea valorii medii, vor trebui fcute anumite presupuneri asupra caracteristicilor
probabile pentru datele de intrare.
Pentru algoritmul precedent vom considera c elementele xk sunt distincte i c
fiecare din cele n! permutri ale acestora sunt echiprobabile. Aceast presupunere este uzual
pentru cele mai multe situaii, dar analiza poate fi efectuat si pe baza altor presupuneri.
Pentru cazul particular n=3, de exemplu, presupunem c urmtoarele ase situaii sunt
la fel de probabile (alturat sunt specificate valorile lui a pentru cazul respectiv):
- x1<x2<x3, a=2;
- x1<x3<x2, a=1;
- x2<x1<x3, a=1;
- x2<x3<x1, a=1
- x3<x1<x2, a=0
- x3<x2<x1, a=0.
Valoarea medie a lui a pentru cazul n=3 este: (2+1+1+1+0+0)/6=5/6.
Se observ faptul c n cele ase situaii conteaz doar ordinea relativ a numerelor,
ceea ce conduce la considerarea mulimii indicilor elementelor n locul valorilor: 123, 132,
213, 231, 312, 321.
Folosind aceast observaie, se poate defini probabilitatea ca a s aib valoarea k
(notat cu pnk):
pnk = (numrul de permutri a n obiecte pentru care a=k) / (n!)
De exemplu, pentru cazul de mai sus: p32=1/6, p31=3/6=1/2, p30=2/6=1/3.
Valoarea medie a lui a se definete n mod uzual astfel:
n 1
(1)
an =
k * p
k 0
nk
Pentru determinarea lui an ar trebui determinate valorile probabilitilor pnk, operaie destul de
dificil. O variant const n determinarea unei relaii de recuren pentru probabilitile pnk
i utilizarea unei funcii generatoare pentru aceste probabiliti.
Determinarea unei relaii de recuren se face pe baza urmtoarelor observaii:
- se consider permutrile mulimii x1, x2, ..., xn pe mulimea {1, 2, ..., n};
- dac xn=n, atunci valoarea lui a este cu unu mai mare dect valoarea obinut
raportat la mulimea x1, x2, ..., xn-1 (cazurile a i c de mai sus);
- dac xnn, atunci valoarea lui a este aceeai cu valoarea obinut raportat la
mulimea x1, x2, ..., xn-1 (cazurile b, d, e i f de mai sus).
Considernd permutrile mulimii {x1, x2, ..., xn} pe mulimea {1, 2, ..., n}, rezult c
numrul total de cazuri n care ultimul element are valoarea i (adic xn = i) este ci = (n-1)!.
n 1
k * p
k 0
nk
(8)
Hn = 1/2 + 2/3 + 3/4 + ... + (n-1)/n,
rezult c timpul mediu de execuie al algoritmului este:
(9)
tmed = 3+6*n+2*a = 3+6*n+2*(Hn-1) = 1 + 6*n + 2*Hn.
B. Notaia asimptotic
O notaie convenabil pentru specificarea aproximaiilor este notaia O. Ea descrie pe scurt
conceptul de aproximare i suprim informaia detaliat, care nu este n mod uzual
revelatoare.
Fie f i g dou funcii reale de variabil ntreag i pozitiv:
f, g: NR+,
Se spune c f(n) aproximeaz g(n) i se noteaz g(n)O(f(n)), dac exist o constant
pozitiv M i un numr n0N, astfel nct: |g(n)| M*|f(n)|, pentru orice n n0.
n general, pentru o funcie g: NR+, O(g(n)) reprezint mulimea de funcii:
O(g(n)) = {f: NR+ | MR+, n0N, a.. 0 f(n) M*g(n), nn0}
Intuitiv, faptul c f(n)O(g(n)) nseamn c f(n) crete asimptotic cel mult la fel de repede ca
g(n).
Prin abuz de limbaj, notaia g(n)O(f(n)) se scrie g(n)=O(f(n)).
De exemplu, se poate scrie:
12+22+ ... +n2 = O(n3),
ntr-adevr, avem:
g(n) = 12+22+ ... +n2 = n*(n+1)*(2*n+1)/6 = n3/3+n2/2+n/6.
Considernd f(n)=n3, trebuie determinat M astfel nct |n3/3+n2/2+n/6| M*n3. Dar M poate
fi ales astfel: M=1/3+1/2+1/6 i n0=1.
n general, dac P(n) este un polinom de grad cel mult m, atunci:
(10)
O(P(n)) = O(a0+a1*n+ ... +am*nm) = O(nm).
Cteva proprieti ale notaiei O:
f(n)O(f(n)) - reflexivitate
dac f(n)O(g(n)) i g(n)O(h(n)), atunci f(n)O(h(n)) tranzitivitate
O(f(n)+g(n)) = O(max{f(n),g(n)})
O(loga(n)) = O(logb(n)), pentru orice valori reale pozitive diferite, a i b.
Primele dou proprieti permit notaiei O s defineasc clase de echivalen: f(n) i g(n)
sunt echivalente dac f(n)O(g(n)). Clasele de echivalen corespunztoare se numesc clase
de complexitate. Principalele clase de complexitate sunt urmtoarele:
Complexitate logaritmic, O(lg(n)); de exemplu: cutarea binar
Complexitate liniar, O(n); de exemplu: cutarea secvenial
Complexitate ptraticic, O(n2); de exemplu: sortarea prin inserie
Complexitate cubic, O(n3); de exemplu: produsul a dou matrici
Complexitate exponenial, O(2n); de exemplu: prelucrarea tuturor submulimilor unei
mulimi de n elemente
Complexitate factorial, O(n!); de exemplu: prelucrarea tuturor permutrilor unei
mulimi de n elemente
Cu ajutorul acestei notaii, timpul minim i maxim de execuie al algoritmului precedent
poate fi descris astfel:
2.6 Probleme
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
2.6.
2.7.
reflexiv,
tranzitiv.
2.8.
2.9.
Se consider dou iruri de numere: x1, , xn i y1, , ym. S se scrie un algoritm care
determin dac irul al doilea este un subir al primului (adic este format din elemente
consecutive ale primului ir: exist un indice k astfel nct xk+i = yi, pentru i=1, 2, ,
m).
2.10. Se consider sistemul biel-manivel din figura alturat. n lungul axei Ox se mic o
culis, iar manivela OA se mic n sens trigonometric cu viteza unghiular constant .
S se scrie un algoritm care determin poziia i viteza punctului C situat la jumtatea
distanei AB (adic valorile x, y, vx, vy ale acestuia), n puncte succesive pentru intervalul
de timp [0, tmax], cu un pas de incrementare dt pentru variabila t. Se cunoate: tmax, , dt,
|OA| = r, |AB| = l.
y
x
O
2.11. Se consider n plan n puncte de coordonate: (x1, y1), (x2, y2), ..., (xn, yn). S se scrie un
algoritm care determin dac poligonul cu vrfurile n punctele date este convex sau
nu;
2.12. S se determine timpul de execuie al algoritmului din exemplul 2.7.
2.13. S se determine timpul minim, maxim i mediu de execuie al algoritmului din
exemplul 2.6. Se va considera c irul de intrare conine n valori nenule.
2.14. S se determine timpul minim, maxim i mediu de execuie al algoritmului din
problema 2.6.
2.15. S se determine timpul minim, maxim i mediu de execuie al algoritmului din
problema 2.10.