Documente Academic
Documente Profesional
Documente Cultură
Lab 1 APA
Lab 1 APA
Raport
Analiza i Proiectarea Algoritmilor
Tema :Analiza algoritmilor
Chiinu 2017
LUCRAREA DE LABORATOR NR. 1
Scopul lucrrii:
1. Analiza empiric a algoritmilor.
2. Analiza teoretic a algoritmilor.
3. Determinarea complexitii temporale i asimptotice a algoritmilor
SARCINA DE BAZ:
1. Efectuai analiza empiric a algoritmilor propui .
2. Determinai relaia ce determin complexitatea temporal pentru aceti
algoritmi.
3. Determinai complexitatea asimptotic a algoritmilor.
4. Facei o concluzie asupra lucrrii efectuate.
Acest celebru ir a fost descoperit n 1202 de ctre Leonardo Pisano (Leonardo din Pisa),
cunoscut sub numele de Leonardo Fibonacci. Cel de-al n-lea termen al irului se poate obtine
direct din definiie:
1. function fib1(n)
if n < 2 then return n
else return fib1(n-1) + fib1(n-2)
Aceast metod este foarte ineficienta, deoarece recalculeaz de mai multe ori aceleai
valori. Urmeaz o alt metod, mai performant, care rezolv aceeai problem.
2. function fib2(n)
i 1; j 0
for k 1 to n do j i + j
ij-i
return j
3. function fib3(n)
i 1; j 0; k 0; h 1
while n > 0 do
if n este impar then t jh
j ih+jk+t
i ik+t
t h2
h 2kh+t
k k2+t
n n div 2
return j
int main()
{
clock_t start, finish;
int n;
cout << "Introdu n:";
cin >> n; cout << "\n";
start = clock();
cout << "fib1 Rezultat:" << fib1(n) << "\n";
finish = clock();
cout << "Numarul de iteratii:" << c << endl;
cout << "Timpul de executie pentru fib1 =" << ((double)finish - start) /
CLOCKS_PER_SEC << endl;
cout << "--------------------------------" << endl;
start = clock();
cout << "fib2 Rezultat:" << fib2(n) << "\n";
finish = clock();
cout << "Numarul de iteratii:" << d << endl;
cout << "Timpul de executie pentru fib2 =" << ((long double)finish -
start) / CLOCKS_PER_SEC << endl;
cout << "--------------------------------" << endl;
start = clock();
cout << "fib3 Rezultat:" << fib3(n) << "\n";
finish = clock();
cout << "Numarul de iteratii:" << e << endl;
cout << "Timpul de executie pentru fib3 =" << ((long double)finish -
start) / CLOCKS_PER_SEC << endl;
system("pause");
}
long double fib1(int n)
{
c++;
if (n < 2)
{
return n;
}
else
return fib1((n - 1)) + fib1(n - 2);
}
tn c1r1n c2 r2n
Avnd condiiile iniiale,obinem:
c1+c2 = 0, n=0
r1c1 + r2c2 = 1, n = 1
unde determinm:
c1/2 = 1/5
Deci, tn 1
5 r1n r2n .
1+5
tn=((
2
) )
Costul Numarul de
iteratii
C1 1
C2 1
C3 N
C4 N
C5 N
C1 1
C2 log2n
C3 log2n
C4 log2n
C5 log2n
C6 log2n
C7 log2n
C8 log2n
C9 log2n
Algotitmul nr.2 este mai bun ca prima metod timpul de execuie depinde
liniar de n ,de aceea este cu mult mai mic dect n primul caz,iar numrul de iteraii
coincide cu n.
Pentru numerele n intervalul [30 ] metoda a 3-a este cea mai eficace
avnd un numr de iteraii mult mai mic, de aceea aceast metod consider ca e cea
mai eficienta si mai potrivita .