Sunteți pe pagina 1din 7

UNIVERSITATEA TEHNICA A MOLDOVEI

Facultatea ,, Calculatoare,Informatica si Microelectronica


FILIERA FRANCOFONA INFORMATICA

Raport
Analiza i Proiectarea Algoritmilor
Tema :Analiza algoritmilor

A efectuat: Harea Ion


Student gr.FI-161

A verificat: Catruc Mariana


Lector superior

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.

Numerele lui Fibonacci


irul lui Fibonacci este definit prin urmtoarea recurena:

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

Mai exist un algoritm :

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

Code source C++:


#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

long int c = 0,d=0,e=0;

long double fib1(int n);


long int fib2(int n);
long int fib3(int n);

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);
}

long int fib2(int n)


{
long int i, j, k;
i = 1;
j = 0;

for (k = 0; k<n; k++)


{
j = i + j;
i = j - i;
d++;
}
return j;
}

long int fib3(int n)


{
long int i, j, k, h, t;
i = 1; k = 0;
j = 0; h = 1;
while (n>0)
{
e++;
if (n % 2 != 0)
{
t = j*h;
j = i*h + j*k + t;
i = i*k + t;
}
t = h*h;
h = 2 * k*h + t;
k = k*k + t;
n = n / 2;
}
return j;
}

Determinm complexitatea asimptotic a acestor metode:


Expresia care definete irul lui Fibonacci este:
tn = tn-1 + tn-2 n2
i t0 = 0, t1 = 1.
Putem s rescriem aceasta expresie n alt form:
tn - tn-1 - tn-2 = 0, care are ecuaia caracteristic:
x2 - x - 1 = 0, cu radacinile r1/2 = (15 )/2.
Solutia general are forma:

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
) )

Concluzionm c timpul algoritmului care determin irul lui Fibonacci prin


metoda 1,crete n mod exponenial n funcie de n .
O alt metod propus a acestei probleme:
function fib2(n)
i 1; j 0
for k 1 to n do j i + j
ij-i
return j

Costul Numarul de
iteratii

C1 1
C2 1
C3 N
C4 N
C5 N

T(n)=c1+c2+(c3+c4+c5)n, scriem c1+c2 prin k1 si (c3+c4+c5) prin k2 =>


t(n)=k1+k2n si mai departe ca t(n)=O(n).In aceasta metoda,timpul de
executie depinde liniar de n.
Metoda a 3 este o functie logaritmica: tn=O(log2n)

Costul Numarul de iteratii

C1 1
C2 log2n
C3 log2n
C4 log2n
C5 log2n
C6 log2n
C7 log2n
C8 log2n
C9 log2n

Analiza empirica a algoritmilor:


Rezultatul executiei programului

Numarul de interatii pentru fiecare algoritm :

Algoritmii. Valorile introduce (n):


5 10 20 50
I algoritm 15 177 21891 2.075.316.483
II algoritm 5 10 20 50
III algoritm 3 4 5 6

Timpul de execuie pentru fiecare algoritm(sec) :

Algoritmii. Valorile introduce (n) :


10 20 50
I algoritm 0 0 0 197.347
II algoritm 0 0 0 0
III algoritm 0 0 0 0
Concluzie:
n aceast lucrare de laborator am analizat 3 metode diferite de calcul a
sirului lui Fibonacci .

n urma efecturii si rulrii programului am inteles c toate cele 3 metode


sunt eficace si au rezultat bun. Pentru numerele mici prima metoda este cea mai
bun fiindc este simpl ,ns ncepnd cu n >30 se observ c acest algoritm nu
este rentabil pentru c numrul de iteraii crete n mod exponential,iar mpreun cu
acestea i timpul de execuie devine foarte mare(de ex. : pentru n=50 se
nregistreaz 2.075.316.483 de iteraii i tmpul de execuie este de aproximativ 3
minute +/- 20(sec) ).

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 .

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