Documente Academic
Documente Profesional
Documente Cultură
Un algoritm este o metodă generală de rezolvare a unui anumit tip de problemă. Pentru o
problemă pot fi găsiţi mai mulţi algoritmi, dintre aceştia alegându-se cel mai bun.
Criteriul de comparaţie între algoritmi este eficienţa lor. Eficienţa unui algoritm depinde atât
de metodele de programare cât şi de tipurile de date utilizate. Eficienţa se exprimă în funcţie de
resursele de calcul necesare aplicării algoritmului. Resursele de calcul sunt spaţiul de memorie
ocupat pentru stocarea datelor folosite de algoritm şi timpul de execuţie al algoritmului.
I. Spaţiul necesar stocării datelor se exprimă prin cantitatea de memorie ocupată de toate
variabilele declarate în programul care implementează algoritmul. De exemplu, dacă un program
conţine declaraţiile
int v[100], n, i;
float x[100];
cantitatea de memorie necesară păstrării acestor variabile va fi egală cu:
4*100+4+4 octeţi pentru datele de tip int
+
4*100 octeţi pentru datele de tip float
Calculele de mai sus s-au făcut în funcţie de spaţiul rezervat la declarare pentru
reprezentarea tipurilor elementare de date existente în C (corespunzător CodeBlocks).
Tip Dimensiune (în octeţi)
char 1
int 4
long 4
long long 8
float 4
double 8
long double 12
Exemplu: căutarea secvenţială a unei valori într-un vector. Operaţia dominantă este cea de
comparare a valorii x cu câte un element din vector.
V=(1, 8, 2, 4, 7, 6) Număr de comparaţii efectuate
Cazul cel mai favorabil apare pentru x=1 1
Cazul cel mai defavorabil apare pentru x=6 6
Cazul mediu presupune că valoarea căutată x s-ar putea afla cu aceeaşi probabilitate în orice
poziţie din tablou.
Notând cu p - probabilitatea ca x să fie în V într-o poziţie i oarecare
T - timpul mediu de execuţie al algoritmului
Ti - timpul necesar pentru a compara valoarea x cu toate elementele din
poziţia 1 până în poziţia i (Ti este egal cu i unităţi de timp, deoarece sunt necesare i
operaţii de comparare între x şi valorile V1, V2, ..., Vi ), atunci
T=(p*T1+p*T2+...+p*Tn)/n=p*(1+2+…+n)/n=p*(n+1)/2
Concluzia este că timpul mediu de căutare secvenţială a unei valori într-un vector
depinde liniar de n, dimensiunea vectorului în care se caută.
Dacă un algoritm necesită timp de execuţie de ordin n, se spune că se execută în timp liniar,
iar algoritmul respectiv se numeşte algoritm liniar. Similar, un algoritm este numit pătratic, cubic,
logaritmic, polinomial sau exponenţial, dacă necesită timp de execuţie de ordin n2, n3, log n, nk,
respectiv cn, unde k şi c sunt constante.
Exemple: 1. Nr prim
prim=1;
if(n%2==0 && n>2) prim=0;
else
{
int k=sqrt(n);
for(int d=3; d<=k && prim; d=d+2)
if(n%d==0) prim=0;
}
2. Calculul cmmdc a două numere prin scăderi succesive poate fi îmbunătăţit dacă se
folosesc împărţiri succesive, cunoscut fiind faptul că o împărţire este o scădere repetată.
while(a!=b) a=30 b=7
if(a>b) a=a-b; a=23 b=7
else b=b-a; a=16 b=7
a=9 b=7
a=2 b=7 după 5 paşi
a=2 b=5
a=2 b=3
a=2 b=1 după 8 paşi
a=1 b=1
r=a%b; a=30 b=7 r=2
while(r!=0) a=7 b=2 r=1 la al doilea pas
{ a=2 b=1 r=0 după 3 paşi
a=b;
b=r;
r=a%b;
}
Considerând că dominantă este operaţia de împărţire cu rest, pentru n=10000, prima variantă de calcul va
efectua 4999 de împărţiri (pentru valorile d=2, …, 5000), a doua 10 (de 4 ori la d=2, o dată la d=3, o dată la
d=4, de 4 ori la d=5)
5. Nr cuburi perfecte <=n=radical de ordin 3 din n
6.suma cuburi perfecte <=n= n2*(n+1)2/4
7.Numerele care nu sunt patrate perfecte au nr par de divizori
8.Singurele nr cu nr impar de divizori sunt patratele perfecte
9.Ciurul lui Erastotene
Pentru i0,n executa v[i]0
v[0]=v[1]=1;
pentru i2,sqrt(n) executa
daca v[i]=0 atunci
pentru j2,[n/i] executa
v[i*j]1
10. 1<<n (2n )
11. n>>k (n/2k)
12. n&1 =0 daca n este par, =1 daca n este impar
13 .n&(n-1) = 0 daca n este putere a lui 2
Comparativ, pentru diferite valori ale lui n şi complexităţi ale algoritmilor, durata lor de execuţie
este:
Tema:
#18, #570, #388