Sunteți pe pagina 1din 3

LUCRARE DE LABORATOR NR.

1
Tema: Analiza algoritmilor (Timpul de execuie al algoritmilor). Scopul lucrrii:
1. 2.

3.

Analiza empiric a algoritmilor. Analiza teoretic a algoritmilor. Determinarea complexitii temporale i asimptotice a algoritmilor

Sarcina pentru lucrarea nr.1: 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: 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. Iat acum o alt metod, mai performant, care rezolv aceeai problem. function fib2(n) i 1; j 0 for k 1 to n do j i + j i j - i return j Mai exist un algoritm : 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 2 t h h 2kh+t k k2+t n n div 2 return j

Anexa 1: Listingul programului:


#include <iostream> #include <time.h> #include <conio.h> #include <stdio.h> using namespace std; int fib1(int n); int fib2(int n); int fib3(int n); int main() { int n; time_t start, end; cout << "Dati n: "; cin >> n; start = time(NULL); cout << endl << fib1(n); end = time(NULL); printf("\ntimp de %.2f\n", difftime(end, start)); cout<<endl; start = time(NULL); cout << endl << fib2(n); end = time(NULL); printf("\n timp de %.2f\n", difftime(end, start)); cout<<endl; start = time(NULL); cout << endl << fib3(n); end = time(NULL); printf("\n timp de %.2f\n", difftime(end, start)); cout<<endl; return 1; } int fib3(int n) {int i=1,j =0, k=0, h=1,t; while (n > 0){ if (n%2==1) { t= j*h; j= i*h+j*k+t; i= i*k+t; } t = h*h; h= 2*k* h+ ; k = k*k+t; n = n/2; } return j; } int fib2 (int n) { int i=1,j =0; for (int k=0;k<n;k++) { j=i+j; i=j-i; } return j; } int fib1 (int n) { if (n < 2) return n; else return fib1(n - 1) + fib1(n - 2); }

Anexa 2: Screenshot

SARCINA DE BAZ:
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.
1.

ntrebri de control:
1. 2. 3. 4. Enumerai factorii ce influeneaz timpul de execuie al algoritmului. Cnd timpul de execuie al algoritmului este dat de o relaie de recuren ? Care sunt regulile generale pentru evaluarea timpului de execuie? Care sunt etapele analizei empirice i n care cazuri se face analiza empiric a algoritmilor? 5. Ce proprieti posed funciile asimptotice?