Sunteți pe pagina 1din 9

1.

Diferene ntre informatic i matematic

Vom prezenta numai dou aspecte ce deosebesc cele dou tiine:

1) n lucrul pe calculator, majoritatea proprietilor algebrice nu sunt satisfcute.


- elementul neutru: egalitatea a+b=a poate fi satisfcut fr ca b=0: este situaia n
care b0, dar ordinul su de mrime este mult mai mic dect al lui a, astfel nct
memorarea unui numr limitat de cifre i aducerea la acelai exponent fac ca, la
efectuarea adunrii, b s fie considerat egal cu 0.
- comutativitate: s considerm urmtoarea funcie scris n Pascal ce folosete
apelul prin referin:
function f(var a:integer):integer;
begin a:=a+1; f:=a end;
Secvena de instruciuni:
a:=1; write (a+f(a))
produce la ieire valoarea 1+2=3, pe cnd secvena de instruciuni:
a:=1; write (f(a)+a))
produce la ieire valoarea 2+2=4.
- asociativitate: pentru simplificare (dar fr a reduce din generalitate) vom
presupune c numerele sunt memorate cu o singur cifr semnificativ i c la
nmulire se face trunchiere. Atunci rezultatul nmulirilor (0.50.7)0.9 este
0.30.9=0.2, pe cnd rezultatul nmulirilor 0.5(0.70.9) este
0.50.6=0.3.

2) Nu intereseaz n general demonstrarea teoretic a existenei unei soluii, ci


accentul este pus pe elaborarea algoritmilor.
Vom pune n vedere acest aspect prezentnd o elegant demonstraie a
urmtoarei propoziii:
Propoziie. Exist ,R\Q cu Q.
Pentru demonstraie s considerm numrul real x=aa, unde a= 2 .
Dac xQ, propoziia este demonstrat.
Dac xQ, atunci xa=a2=2Q i din nou propoziia este demonstrat.

Frumuseea acestei scurte demonstraii nu poate satisface pe un informatician,


deoarece lui i se cere n general s furnizeze un rezultat i nu s arate existena
acestuia.
2. Aspecte generale care apar la rezolvarea unei probleme

Aa cum am spus, informaticianului i se cere s elaboreze un algoritm pentru


o problem dat, care s furnizeze o soluie (fie i aproximativ, cu condiia
menionrii acestui lucru).
Teoretic, paii sunt urmtorii:
1) demonstrarea faptului c este posibil elaborarea unui algoritm pentru
determinarea unei soluii;
2) elaborarea unui algoritm (caz n care pasul anterior devine inutil);
3) demonstrarea corectitudinii algoritmului;
4) determinarea timpului de executare a algoritmului;
5) demonstrarea optimalitii algoritmului (a faptului c timpul de executare este mai
mic dect timpul de executarea al oricrui alt algoritm pentru problema studiat).
Evident, acest scenariu este idealist, dar el trebuie s stea n permanen n
atenia informaticianului.
n cele ce urmeaz, vom schia cteva lucruri legate de aspectele de mai sus,
nu neaprat n ordinea menionat.

3. Timpul de executare a algoritmilor

Un algoritm este elaborat nu numai pentru un set de date de intrare, ci pentru o


mulime de astfel de seturi. De aceea trebuie bine precizat mulimea (seturilor de
date) de intrare. Timpul de executare se msoar n funcie de lungimea n a datelor de
intrare.
Ideal este s determinm o formul matematic pentru T(n)=timpul de
executare pentru orice set de date de intrare de lungime n. Din pcate, acest lucru nu
este n general posibil. De aceea, n majoritatea cazurilor ne mrginim la a evalua
ordinul de mrime al timpului de executare.
Mai precis, spunem c timpul de executare este de ordinul f(n) i exprimm
acest lucru prin T(n)=O(f(n)), dac raportul ntre T(n) i f(n) tinde la un numr
real atunci cnd n tinde la .
De exemplu, dac f(n)=nk pentru un anumit numr k, spunem c algoritmul
este polinomial.
Specificm, fr a avea pretenia c dm o definiie, c un algoritm se numete
"acceptabil" dac este este polinomial. n capitolul referitor la metoda backtracking
este prezentat un mic tabel care scoate n eviden faptul c algoritmii exponeniali
necesit un timp de calcul mult prea mare chiar pentru un n mic i indiferent de
performanele calculatorului pe care lucrm.
De aceea, n continuare accentul este pus pe prezentarea unor algoritmi
polinomiali.
4. Corectitudinea algoritmilor

n demonstrarea corectitudinii algoritmilor, exist dou aspecte importante:


Corectitudinea parial: presupunnd c algoritmul se termin (ntr-un numr finit
de pai), trebuie demonstrat c rezultatul este corect;
Terminarea programului: trebuie demonstrat c algoritmul se ncheie n timp finit.
Evident, condiiile de mai sus trebuie ndeplinite pentru orice set de date de
intrare admis.

Modul tipic de lucru const n introducerea n anumite locuri din program a


unor invariani, adic relaii ce sunt ndeplinite la orice trecere a programului prin
acele locuri.
Ne mrginim la a prezenta dou exemple simple.
Exemplul 1. Determinarea concomitent a celui mai mare divizor comun i a
celui mai mic multiplu comun a dou numere naturale.
Fie a,bN*. Se caut:
(a,b)=cel mai mare divizor comun al lui a i b;
[a,b]=cel mai mic multiplu comun al lui a i b.

Algoritmul este urmtorul:


x a; y b; u a; v b;
while xy
{ xv+yu = 2ab; (x,y)=(a,b) } (*)
if x>y then x x-y; u u+v
else y y-x; v u+v
write(x,(u+v)/2)

Demonstrarea corectitudinii se face n trei pai:


1) (*) este invariant:
La prima intrare n ciclul while, condiia este evident ndeplinit.
Mai trebuie demonstrat c dac relaiile (*) sunt ndeplinite i ciclul se reia, ele
vor fi ndeplinite i dup reluare.
Fie (x,y,u,v) valorile curente la o intrare n ciclu, iar (x',y',u',v')
valorile curente la urmtoarea intrare n ciclul while. Deci: xv+yu=2ab i
(x,y)=(a,b).
Presupunem c x>y. Atunci x'=x-y, y'=y, u'=u+v, v'=v.
x'v'+y'u'=(x-y)v+y(u+v)=xv+yu=2ab i
(x',y')=(x-y,y)=(x,y)=(a,b).
Cazul x<y se studiaz similar.
2) Corectitudinea parial:
La ieirea din ciclul while, x=(x,x)=(x,y)=(a,b). Notm d=(a,b)=x.
Conform relaiilor (*), avem d(u+v)=2d2, unde a=d i b=d. Atunci
(u+v)/2=d=ab/d=[a,b].
3) Terminarea programului:
Fie {xn}, {yn}, {un}, {vn} irul de valori succesive ale variabilelor. Toate
aceste valori sunt numere naturale pozitive. Se observ c irurile {xn} i {yn} sunt
descresctoare, iar irul {xn+yn} este strict descresctor. Aceasta ne asigur c dup
un numr finit de pai vom obine x=y.

Exemplul 2. Metoda de nmulire a ranului rus.


Fie a,bN. Se cere s se calculeze produsul ab.
ranul rus tie doar:
- s verifice dac un numr este par sau impar;
- s adune dou numere;
- s afle ctul mpririi unui numr la 2;
- s compare un numr cu 0.

Cu aceste cunotine, ranul rus procedeaz astfel:


x a; y b; p 0
while x>0
{ xy+p=ab } (*)
if x impar then p p+y
x x div 2; y y+y
write(p)

S urmrim cum decurg calculele pentru x=54, y=12:

x y p
54 12 0
27 24
13 48 24
6 96 72
3 192
1 384 264
0 ? 648

Ca i pentru exemplul precedent, demonstrarea corectitudinii se face n trei pai:


1) (*) este invariant:
La prima intrare n ciclul while, relaia este evident ndeplinit.
Mai trebuie demonstrat c dac relaia (*) este ndeplinit i ciclul se reia, ea
va fi ndeplinit i la reluare.
Fie (x,y,p) valorile curente la o intrare n ciclu, iar (x',y',p') valorile
curente la urmtoarea intrare n ciclul while. Deci: xy+p=ab.
Presupunem c x este impar. Atunci (x',y',p')=((x-1)/2,2y,p+y).
Rezult x'y'+p'=(x-1)/22y+p+y=xy+p=ab.
Presupunem c x este par. Atunci (x',y',p')=(x/2,2y,p). Rezult
x'y'+p'=xy+p=ab.
2) Corectitudinea parial:
Dac programul se termin, atunci x=0, deci p=ab.
3) Terminarea programului:
Fie {xn}, {yn} irul de valori succesive ale variabilelor corespunztoare.
Se observ c irul {xn} este strict descresctor. Aceasta ne asigur c dup un
numr finit de pai vom obine x=0.
5. Optimalitatea algoritmilor

S presupunem c pentru o anumit problem am elaborat un algoritm i am


calculat timpul su de executare T(n). Este natural s ne ntrebm dac algoritmul
nostru este "cel mai bun" sau exist un alt algoritm cu timp de executare mai mic.
Problema demonstrrii optimalitii unui algoritm este foarte dificil, n mod
deosebit datorit faptului c trebuie s considerm toi algoritmii posibili i s artm
c ei au un timp de executare superior.
Ne mrginim la a enuna dou probleme i a demonstra optimalitatea
algoritmilor propui, pentru a pune n eviden dificultile care apar.

Exemplul 3. Determinarea celui mai mic element al unui vector.


Se cere s determinm m=min(a1,a2,...,an).
Algoritmul binecunoscut este urmtorul:
m a1
for i=2,n
if ai<m then m ai
care necesit n-1 comparri ntre elementele vectorului a=(a1,a2,...,an).

Propoziia 1. Algoritmul de mai sus este optimal.


Trebuie demonstrat c orice algoritm bazat pe comparri necesit cel puin n-
1 comparri. Demonstrarea optimalitii acestui algoritm se face uor prin inducie.
Pentru n=1 este evident c nu trebuie efectuat nici o comparare.
Presupunem c orice algoritm care rezolv problema pentru n numere efectueaz
cel puin n-1 comparri i s considerm un algoritm oarecare care determin cel
mai mic dintre n+1 numere. Considerm prima comparare efectuat de acest
algoritm; fr reducerea generalitii, putem presupune c s-au comparat a1 cu a2
i c a1<a2. Atunci m=min(a1,a3,...,an=1). Dar pentru determinarea acestui
minim sunt necesare cel puin n-1 comparri, deci numrul total de comparri
efectuat de algoritmul considerat este cel puin egal cu n.

Exemplul 4. Determinarea minimului i maximului elementelor unui vector.


Se cere determinarea valorilor:
m=min(a1,a2,...,an) i M=max(a1,a2,...,an).
Determinarea succesiv a valorilor m i M necesit timpul T(n)=2(n-1).
O soluie mai bun const n a considera cte dou elemente ale vectorului, a
determina pe cel mai mic i pe cel mai mare dintre ele, iar apoi n a compara pe cel
mai mic cu minimul curent i pe cel mai mare cu maximul curent:

if n impar then m a1; M a1; k 1


else if a1<a2 then m a1; M a2
else m a2; M a1
k 2
{ k = numrul de elemente analizate }
while kn-2
if ak+1<ak+2 then if ak+1<m then m ak+1
if ak+2>M then M ak+2
else if ak+2<m then m ak+2
if ak+1>M then M ak+1
k k+2

S calculm numrul de comparri efectuate:


- pentru n=2k, n faza de iniializare se face o comparare, iar n continuare se fac
3(k-1) comparri; obinem T(n)=1+3(k-1)=3k-3=3n/2-2= 3n/2 -2.
- pentru n=2k+1, la iniializare nu se face nici o comparare, iar n continuare se fac
3k comparri; obinem T(n)=(3n-3)/2=(3n+1)/2-2= 3n/2 -2.
n concluzie, timpul de calcul este T(n)= 3n/2 -2.

Propoziia 2. Algoritmul de mai sus este optimal.


Considerm urmtoarele mulimi i cardinalul lor:
- A= mulimea elementelor care nu au participat nc la comparri; a=|A|;
- B= mulimea elementelor care au participat la comparri i au fost totdeauna mai
mari dect elementele cu care au fost comparate; b=|B|;
- C= mulimea elementelor care au participat la comparri i au fost totdeauna mai
mici dect elementele cu care au fost comparate; c=|C|;
- D= mulimea elementelor care au participat la comparri i au fost cel puin o dat
mai mari i cel puin o dat mai mici dect elementele cu care au fost comparate;
d=|D|.
Numim configuraie un quadruplu (a,b,c,d). Problema const n
determinarea numrului de comparri necesare pentru a trece de la quadruplul
(n,0,0,0) la quadruplul (0,1,1,n-2).

Considerm un algoritm arbitrar care rezolv problema i artm c el


efectueaz cel puin 3n/2 -2 comparri.
S analizm trecerea de la o configuraie oarecare (a,b,c,d) la urmtoarea.
Este evident c nu are sens s efectum comparri n care intervine vreun element din
D. Apar urmtoarele situaii posibile:
1) Compar dou elemente din A: se va trece n configuraia (a-2,b+1,c+1,d) .
2) Compar dou elemente din B: se va trece n configuraia (a,b-1,c,d+1) .
3) Compar dou elemente din C: se va trece n configuraia (a,b,c-1,d+1) .
4) Se compar un element din A cu unul din B. Sunt posibile dou situaii:
- elementul din A este mai mic: se trece n configuraia (a-1,b,c+1,d);
- elementul din A este mai mare: se trece n configuraia (a-1,b,c,d+1).
Cazul cel mai defavorabil este primul, deoarece implic o deplasare "mai lent"
spre dreapta a componentelor quadruplului. De aceea vom lua n considerare acest
caz.
5) Se compar un element din A cu unul din C. Sunt posibile dou situaii:
- elementul din A este mai mic: se trece n configuraia (a-1,b,c,d+1);
- elementul din A este mai mare: se trece n configuraia (a-1,b+1,c,d).
Cazul cel mai defavorabil este al doilea, deoarece implic o deplasare "mai lent"
spre dreapta a componentelor quadruplului. De aceea vom lua n considerare acest
caz.
6) Se compar un element din B cu unul din C. Sunt posibile dou situaii:
- elementul din B este mai mic: se trece n configuraia (a,b-1,c-1,d+2);
- elementul din B este mai mare: se rmne n configuraia (a,b,c,d).
Cazul cel mai defavorabil este al doilea, deoarece implic o deplasare "mai lent"
spre dreapta a componentelor quadruplului. De aceea vom lua n considerare acest
caz.
Observaie. Cazurile cele mai favorabile sunt cele n care d crete, deci ies din
calcul elemente candidate la a fi cel mai mic sau cel mai mare.

Odat stabilit trecerea de la o configuraie la urmtoarea, ne punem problema


cum putem trece mai rapid de la configuraia iniial la cea final.
Analizm cazul n care n=2k (cazul n care n este impar este propus ca
exerciiu). Trecerea cea mai rapid la configuraia final se face astfel:
- plecm de la (n,0,0,0)=(2k,0,0,0);
- prin k comparri ntre perechi de elemente din A ajungem la (0,k,k,0);
- prin k-1 comparri ntre perechi de elemente din B ajungem la (0,1,k,k-1);
- prin k-1 comparri ntre perechi de elemente din C ajungem la (0,1,1,n-2).
n total au fost necesare k+(k-1)+(k-1)=3k-2= 3n/2 -2 comparri.
6. Existena algoritmilor

Acest aspect este i mai delicat dect precedentele, pentru c necesit o


definiie matematic riguroas a noiunii de algoritm. Nu vom face dect s prezentm
(fr vreo demonstraie) cteva definiii i rezultate. Un studiu mai amnunit necesit
un curs aparte!

ncepem prin a preciza c problema existenei algoritmilor a stat n atenia


matematicienilor nc nainte de apariia calculatoarelor. n sprijinul acestei afirmaii
ne rezumm la a spune c un rol deosebit n aceast teorie l-a jucat matematicianul
englez Alan Turing (1912-1954), considerat printele inteligenei artificiale.

Deci ce este un algoritm?


Noiunea de algoritm nu poate fi definit dect pe baza unui limbaj sau a unei
maini matematice abstracte.

Prezentm n continuare o singur definiie, care are la baz limbajul S care


opereaz asupra numerelor naturale.
Un program n limbajul S folosete variabilele:
- x1,x2,... care constituie datele de intrare (nu exist instruciuni de citire);
- y (n care va aprea rezultatul prelucrrilor);
- z1,z2,... care constituie variabile de lucru.
Variabilele y,z1,z2,... au iniial valoarea 0.

Instruciunile pot fi etichetate (nu neaprat distinct) i au numai urmtoarele


forme, n care v este o variabil, iar L este o etichet:
vv+1 { valoarea variabilei v crete cu o unitate }
vv-1 { valoarea variabilei v scade cu o unitate dac era strict pozitiv }
if v>0 goto L { se face transfer condiionat la prima instruciune cu eticheta
L, dac o astfel de instruciune exist; n caz contrar programul se termin }.
Programul se termin fie dac s-a executat ultima instruciune din program, fie
dac se face transfer la o instruciune cu o etichet inexistent.

Observaii:
- faptul c se lucreaz numai cu numere naturale nu este o restricie, deoarece n
memorie exist doar secvene de bii (interpretate n diferite moduri);
- nu intereseaz timpul de executare a programului, ci numai existena sa;
- dac rezultatul dorit const din mai multe valori, vom scrie cte un program
pentru calculul fiecreia dintre aceste valori;
- programul vid corespunde calculului funciei identic egal cu 0: pentru orice
x1,x2,... valoarea de ieire a lui y este 0 (cea iniial).
Este natural o nencredere iniial n acest limbaj, dac l comparm cu
limbajele evoluate din ziua de azi. Se poate ns demonstra c n limbajul S se pot
efectua calcule "orict" de complexe asupra numerelor naturale.

Teza lui Church (1936). Date fiind numerele naturale x1,x2,...,xn,


numrul y poate fi "calculat" pe baza lor dac i numai dac exist un program n
limbajul S care pentru valorile de intrare x1,x2,...,xn produce la terminarea sa
valoarea y.
Cu alte cuvinte, nelegem prin algoritm ce calculeaz valoarea y plecnd de la
valorile x1,x2,...,xn un program n limbajul S care realizeaz acest lucru.

Exist mai multe definiii ale noiunii de algoritm, bazate fie pe calculul cu
numere naturale fie pe calcul simbolic, folosind fie limbaje de programare fie maini
matematice, dar toate s-au dovedit a fi echivalente (cu cea de mai sus)!

Mai precizm c orice program n limbajul S poate fi codificat ca un numr


natural (n particular mulimea acestor programe este numrabil).

Numim problem nedecidabil o problem pentru care nu poate fi elaborat un


algoritm. Definirea matematic a noiunii de algoritm a permis detectarea de probleme
nedecidabile. Cteva dintre ele sunt urmtoarele:
1) Problema opririi programelor: pentru orice program i orice valori de intrare s se
decid dac programul se termin.
2) Problema opririi programelor (variant): pentru un program dat s se decid dac
el se termin pentru orice valori de intrare.
3) Problema echivalenei programelor: s se decid pentru orice dou programe dac
sunt echivalente (produc aceeai ieire pentru aceleai date de intrare).

n continuare vom lucra cu noiunea de algoritm n accepiunea sa uzual, aa


cum n liceu (i la unele faculti) se lucreaz cu numerele reale, fr a se prezenta o
definiie riguroas a lor.
Am dorit ns s evideniem c exist probleme nedecidabile i c (uimitor
pentru unii) studiul existenei algoritmilor a nceput nainte de apariia calculatoarelor.

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