Sunteți pe pagina 1din 10

1

BIBLIOGRAFIE

1. Horia Georgescu. Tehnici de programare. Editura Universitii din Bucureti
2005
2. Leon Livovschi, Horia Georgescu. Sinteza i analiza algoritmilor. 1986
3. T.H. Cormen, C.E. Leiserson, R.R. Rivest Introducere n algoritmi, Mit Press
1990, trad. Computer Libris Agora
4. Horia Georgescu. Introducere n universul Java. Editura Tehnic Bucureti 2002
5. Clin Marin Vduva. Programarea n Java. Editura Albastr 2004
6. Ivor Horton Beginning Java 2, JDK 5 Edition, Wiley Pub., 2005
7. tefan Tanas, Cristian Olaru, tefan Andrei, Java de la 0 la expert, ediia a II-a,
Polirom 2007
8. http://www.oracle.com/technetwork/java/javase/documentation/index.html
9. M. Naftalin, P. Wadler - Java Generics and Collections, OReilly, 2007
2
DESPRE ALGORITMI


- Diferene ntre informatic i matematic

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 b=0, dar ordinul su de mrime este mult mai mic dect al lui a.

- comutativitate: s considerm urmtoarea funcie scris n Pascal:
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 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 algoritmilor, ci
accentul este pus pe elaborarea algoritmilor.
Vom pune n vedere acest aspect prezentnd o elegant demonstraie a
urmtoarei propoziii:
Propoziie. Exist o,|eR\Q cu o
|
eQ.
Pentru demonstraie s considerm numrul real x=a
a
, unde a= 2 .
Dac xeQ, propoziia este demonstrat.
Dac xeQ, atunci x
a
eQ i din nou propoziia este demonstrat.

- Aspecte generale care apar la rezolvarea unei probleme

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 unei 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).
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. 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)=n
k
pentru un anumit numr k, spunem c algoritmul
este polinomial.
Un algoritm se numete "acceptabil" dac este este polinomial.

- 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 trebuie ndeplinite la orice trecere a programului prin
acel loc.

Exemplul 1 Determinarea concomitent a cmmdc i cmmmc a dou numere
naturale.
Fie a,beN
*
. 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 x=y
{ 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:

4
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.
Avem (x,y)=(xy,y) = (a,b)
Cazul x>y se studiaz similar.
2) Corectitudine parial:
Cnd x=y se obine x=(a,b). Conform relaiilor (*), avem x(u+v)=2ab,
Atunci (u+v)/2=ab/x= ab/(a,b) =[a,b].
3) Terminarea programului:
Fie {x
n
}, {y
n
}, {u
n
}, {v
n
} irul de valori succesive ale variabilelor. Toate
aceste valori sunt numere naturale pozitive. Se observ c irurile {x
n
} i {y
n
}
sunt descresctoare, iar irul {x
n
+y
n
} 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,beN. 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.

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

5
Ca i la 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) Corectitudine parial:
Dac programul se termin, atunci x=0, deci p=ab.
3) Terminarea programului:
Fie {x
n
}, {y
n
} irul de valori succesive ale variabilelor corespunztoare. Se
observ c irul {x
n
} este strict descresctor. Aceata ne asigur c dup un numr
finit de pai vom obine x<=0.

- Optimalitatea algoritmilor

S presupunem c pentru o anumit problem am elaborat un algoritm i am
putut calcula i 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 1 S se determine m=min(a
1
,a
2
,...,a
n
).
Algoritmul binecunoscut este urmtorul:
m a
1

for i=2,n
if a
i
<m then m a
i

care necesit n-1 comparri ntre elementele vectorului a=(a
1
,a
2
,...,a
n
).
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 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 a
1
cu
6
a
2
i c a
1
<a
2
. Atunci m=min(a
1
,a
3
,...,a
n+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 2 S se determine minimului i maximului elementelor unui vector.
Mai precis, se cere determinarea cantitilor m=min(a
1
,a
2
,...,a
n
) i
M=min(a
1
,a
2
,...,a
n
).
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 a
1
; M a
1
; k 1
else if a
1
<a
2
then m a
1
; M a
2

else m a
2
; M a
1
;
k 2
{ k = numrul de elemente analizate }
while ksn-2
if a
k+1
<a
k+2
then if a
k+1
<m then m a
k+1

if a
k+2
>M then M a
k+2

else if a
k+2
<m then m a
k+2

if a
k+1
>M then M a
k+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(n-2)/2=3(k-1)comparri; obinem
T(n)=1+3(k-1)=3k-2=3n/2-2=3n/2(-2.
- pentru n=2k+1, la iniializare nu se face nici o comparare, iar n continuare se fac
3(n-1)/2=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|;
7
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 problem 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,c,d+1).
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 i 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 se trateaz similar).
Paii sunt urmtorii:
- 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.


8
- 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!
Noiunea de algoritm nu poate fi definit dect pe baza unui limbaj sau a unei
maini matematice abstracte.
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).
9
Limbajul JAVA

Caracteristici:

+ Simplitate. Dei sintaxa limbajului este bazat pe cea a limbajului C++, limbajul
Java este considerabil mai simplu. Au fost eliminate multe cuvinte cheie, nu mai
exist un preprocesor, a fost eliminat suprancrcarea operatorilor, motenirea
multipl. Nu mai exist funcii independente, variabile globale i lucrul liber cu
pointeri. Pointerii sunt nlocuii cu referine, dar nu mai exist o aritmetic a
pointerilor. n acest mod sunt eliminate multe surse de erori de programare, ceea
ce conduce la programe corecte i robuste.

+ Orientat pe obiecte. Limbajul Java a fost conceput de la nceput pentru a respecta
principiile programrii orientate pe obiecte. Ca i C++, Java folosete clase pentru
organizarea logic a codului; clasa este unitatea de baz n elaborarea
programelor. Nu exist variabile sau funcii n afara claselor. Este admis i larg
utilizat motenirea claselor, dar nu este permis motenirea multipl (ea este
suplinit de o alt facilitate, numit interfa).

+ Compilare prealabil urmat de executare pe maina gazd. Un program surs
Java trebuie mai nti compilat; ca rezultat se obine un fiier "bytecode" (o
secven de instruciuni de asamblare pentru o main imaginar, numit maina
virtual Java), care nu depinde de maina gazd pe care va fi executat programul.
Programul bytecode poate fi apoi transferat pe orice main. Fiecare main gazd
capabil s execute programe Java dispune de un interpretor, care convertete
reprezentarea "bytecode" n instruciuni main proprii, care apoi sunt executate;
conversia are loc la lansarea executrii i anume instruciune cu instruciune. n
acest mod este asigurat portabilitatea i independena de platform. Dezavantajul
acestui mod de lucru const n timpul mare de executare. O variant pentru
interpretor o constituie compilatoarele JIT (Just In Time), care transform
programul byte-code nu instruciune cu instruciune, ci n ntregime (la lansarea
executrii) ntr-o form executabil pe maina gazd, ceea ce conduce la o cretere
semnificativ a vitezei de executare. n continuare vom lucra n varianta clasic,
cea a utilizrii unui interpretor.




+ Colectorul de reziduuri. Java permite crearea explicit de obiecte (de tipul unei
clase). Distrugerea acestor obiecte este preluat de colectorul de reziduuri
(garbage collector), care marcheaz obiectele ce nu mai sunt folosite i elibereaz
spaiul ocupat de ele; eliberarea nu se face neaprat imediat, ci periodic sau atunci
cnd spaiul disponibil curent nu mai poate satisface o nou cerere de alocare de
memorie.
10
+ Securitate ridicat. Java asigur un grad de securitate ridicat, uneori cu un plus
de efort din partea programatorului. Lipsa pointerilor face ca accesarea unor zone
de memorie pentru care accesul nu este autorizat s nu fie posibil. Limbajul
oblig programatorul s prevad aciunile ce trebuie ntreprinse la diferitele erori
(numite excepii) posibile. De exemplu, chiar o simpl operaie de citire trebuie
nsoit de codul ce trebuie executat la detectarea unei excepii; de asemenea se
verific permanent, la executare, valorea indicelui unui tablou nainte de accesarea
componentei respective.

+ Java este proiectat pentru lucru n reea. Chiar de la nceput, limbajul Java a
fost gndit pentru Internet. Dei este posibil s construim programe care folosesc
numai resurse locale, Java pune la dispoziie o mulime de faciliti pentru
programare n reele, pentru a face conexiuni ntre calculatoare server i client i
pentru executare n medii ca de exemplu un browser WWW.

+ Posibilitatea lansrii mai multor fire de executare. Limbajul permite lansarea
mai multor fire de executare, permindu-se astfel executarea concurent a mai
multor aciuni. n acest mod este larg deschis drumul ctre programarea paralel i
concurent.

+ Extensibilitate. Limbajul Java permite includerea de metode native, adic de
funcii scrise n alt limbaj (de obicei C++). Metodele native sunt legate dinamic la
programul Java la momentul executrii, rolul lor fiind n principal de a mri viteza
de executare pentru anumite secvene din program.

+ Applet-uri. Programele Java se mpart n dou categorii. O prim categorie este
constituit de programele obinuite, de sine stttoare (stand alone), numite
aplicaii. A doua categorie o constituie applet-urile. Este folosit acelai limbaj, dar
difer modalitatea de lansare n executare. Cnd utilizatorul vizualizeaz o pagin
Web ce include un applet, maina la care este conectat transmite applet-ul mainii
gazd, care este cea pe care se execut applet-ul (se presupune c maina pe care
lucreaz utilizatorul are un interpretor Java). Applet-urile constituie o alternativ
larg folosit pentru aplicaiile Java. Menionm c applet-urile pot ngloba
elemente de grafic, animaie, sunet, jocuri etc., ceea ce la face foarte atractive.

Exemplu Afiarea unui mesaj

class Unu{
public static void main(String[] sir) {
System.out.println("Prima clasa");
}
}
Compilarea: javac Unu.java
n urma compilrii ia natere fiierul Unu.class; mai general, pentru orice
unitate de compilare (format din mai multe clase), va lua natere pentru fiecare clas
un fiier avnd numele clasei i extensia class). Pentru acest fiier putem comanda
executarea sa apelnd interpretorul java.exe astfel:
Rularea: java Unu

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