Sunteți pe pagina 1din 7

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Catedra Informatica Aplicat

RAPORT
Lucrarea de laborator nr.1
Tema: Analiza algoritmilor (Timpul de execuie al algoritmilor)

A efectuat:
st. gr. SI-141

E. Cucu

A verificat:
Lector universitar

V. Bagrin

Chiinu 2015

1. Descrierea algoritmelor
Algoritmul este noiunea fundamental a informaticii. Totul este construit n jurul algoritmilor ( i
a structurilor de date, cum ar fi listele sau grafurile). Este i un concept fundamental al matematicii
moderne alturi de cel de sistem axiomatic

Timpul de executie al algoritmilor


De multe ori, pentru rezolvarea unei probleme, trebuie ales un algoritm dintre mai multi posibili,
dou criterii principale de alegere fiind contradictorii: algoritmul s fie simplu de inteles, de
codificat si de depanat; algoritmul s foloseasc eficient resursele calculatorului, s aib un timp
de executie redus.
Dac programul care se scrie trebuie rulat de un numr mic de ori, prima cerint este mai
important; in aceast situatie, timpul de punere la punct a programului e mai important decat
timpul lui de rulare, deci trebuie aleas varianta cea mai simpl a programului.
Daca programul urmeaz a fi rulat de un numr mare de ori, avand si un numr mare de date de
prelucrat, trebuie ales algoritmul care duce la o executie mai rapid. Chiar in aceast situatie, ar
trebui implementat mai inainte algoritmul mai simplu si calculat reducerea de timp de executie
pe care ar aduce-o implementarea algoritmului complex.
Analiza empirica a complexitatii algoritmilor
O alternativ la analiza matematic a complexittii o reprezint analiza empiric.
Aceasta poate fi util pentru:
- a obtine informatii preliminare privind clasa de complexitate a unui algoritm;
- pentru a compara eficienta a doi (sau mai multi) algoritmi destinati rezolvrii aceleiasi
probleme; - pentru a compara eficienta mai multor implementri ale aceluiasi algoritm;
- pentru a obtine informatii privind eficienta implementrii unui algoritm pe un anumit calculator

2. Listingul programului

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
unsigned long long fib_1(int n);
unsigned long long fib_2(int n);
unsigned long long fib_3(int n);
unsigned long long num_schmb_1 = 0;
unsigned long long num_schmb_2 = 0;
unsigned long long num_schmb_3 = 0;
int main() {
clock_t start_1,finish_1;
clock_t start_2,finish_2;
clock_t start_3,finish_3;
cout << "Dati numarul fibonacci pe care doriti sa-l obtineti!" << endl;
int n;
cin >> n;
unsigned long long fib1;
unsigned long long fib2;
unsigned long long fib3;
start_1 = clock();
fib1 = fib_1(n);
finish_1 = clock() - start_1;
cout << "Utilizind algoritmul 1:" << endl;
cout <<"Numarul lui fibonacci este:" << fib1 << endl << "S-au produs "
<< num_schmb_1 << " de interschimbari in " << (float)finish_1/CLOCKS_PER_SEC <<"
secunde." <<endl;
start_2 = clock();
fib2 = fib_2(n);
finish_2 = clock() - start_2;
cout << "Utilizind algoritmul 2:" << endl;
cout <<"Numarul lui fibonacci este:" << fib2 << endl << "S-au produs "
<< num_schmb_2 << " de interschimbari in " <<
((float)finish_2/CLOCKS_PER_SEC)/1000 <<" secunde." <<endl;
start_3 = clock();
fib3 = fib_3(n);
finish_3 = clock() - start_3;
cout << "Utilizind algoritmul 3:" << endl;
cout <<"Numarul lui fibonacci este:" << fib3 << endl << "S-au produs "
<< num_schmb_3 << " de interschimbari in " << (float)finish_3/CLOCKS_PER_SEC <<"
secunde." <<endl;
system("pause");
return 0;
}
unsigned long long fib_1(int n) {
if(n <= 2) return 1;
else {
num_schmb_1++;
return fib_1(n-1) + fib_1(n-2);
}
}
unsigned long long fib_2(int n) {
unsigned long long fib_num = 0;
unsigned long long k = 1;
for (int i = 0; i < n; i++) {
fib_num = k + fib_num;
k = fib_num - k;
num_schmb_2 += 2;
}
return fib_num;
}
unsigned long long fib_3(int n) {

unsigned long long i = 1;


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

3. Reprezentarea rezultatelor

Nr.term.
Algor.

n=5

n=12

n=25

n=34

n=40

15

465

242785

18454929

12

25

34

33116028
1
40

2
3

6
Tabelul 1.
350000000
300000000
250000000
200000000
150000000
100000000
50000000
0
n=5

Graficul 1.

4. Analiza rezultatelor

n=12

n=25

a. Algoritmul recursiv
Function fib1(n)
1: if n < 2 then return n
2:
else return fib1(n-1) + fib1(n-2)

Costul
C1
C2

nr. de rep
n
n*n*n

T ( n ) =t ( n1 )t ( n2 ) ;
t ( n ) t ( n ) 1t ( n )2=0
x 2x1=0
=5
x 1=

1 5
1+ 5
, x 2=
2
2

5
1+

t ( n ) =
T ( n ) =O ( n ) ;

Analizind algoritmul recursive si determinind complexitatea asimptotica putem spune ca acest


algoritm este neeficient avind un numar mare de apeluri recursive crescind foarte rapid
exponential.

b. Algoritmul iterativ
function fib2(n)
1:
i 1; j 0
2:
for k 1 to
3:
4:
return j

Costul
1

nr. de rep
1

1
5

1
n-2

ij-i

n do
ji+j

T ( n ) =5 n2 ;

Acest algoritm iterativ are o complexitate liniara ceea ce ofera o rapiditate in rezolvarea
problemei numar te iteratii fiind egal cu numarul lui Fibonacci cautat.

c. Algoritmul divizarii
function fib3(n)
1:
i 1; j 0; k 0; h 1
2:
while n > 0 do
3:
if n este impar then
4:
t jh
5:
j ih+jk+t
6:
i ik+t
2
7:
t h
8:
h 2kh+t
9:
k k2+t
10:
n n div 2
return j

Costul
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10

nr. de rep
1
2n
2n
1
1
1
2n
2n
2n
2n

T ( n ) =O(log 2 n) ;

Acest algoritm are o complexitate asimptotica logaritmica liniara,aceasta functie creaste


logarithmic fata de n de aici rezulta ca conform operatiunii de baza n n div 2 este o functie
rapida.

5. Concluzie
Dup efectuarea acestei lucrri de laborator am fcut cunostint a trei algoritmi pentru a calcula
numerele din sirul lui Fibonacci. Toate metodele lucreaz dar ele se difer dup eficient.
Metoda I a fost cea mai ineficient deoarice calculeaz de mai multe ori aceeasi valoare. Metoda
II este mai eficient decit Metoda I dar tutosi are si ea o limit. Metoda II este rea deoarece
numrul de iteratii coincide cu pozitia numrului cutat in sirul Fibonacci. i in sfirsit Metoda III
estea cea mai eficient, introducind valoarea maxim a signed int pe 32-bit ea se isprveste
intr-un timp foarte mic si cu iteratii minimali.

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