Anda di halaman 1dari 7

Universitatea Tehnic a Moldovei

Catedra: Tehnologii Informaionale

Raport
Lucrare de laborator Nr.1
la Analiza i proiectarea algoritmelor

Tema: Analiza algoritmilor

A efectuat:
st. gr. SI-151 Cucu Dumitru

A verificat: Bagrin Veronica

Chiinu 2016
Sarcina lucrarea nr.1: Numerele lui Fibonacci
Scopul lucrrii:
1. Analiza empiric a algoritmilor.
2. Analiza teoretic a algoritmilor.
3. Determinarea complexitii temporale i asimptotice a algoritmilor

Listingul programului:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long long int nr_i=0;
long long int fib1(int n) {
int i;

if (n<2){
nr_i++;
return n;
}

else{
nr_i++;
return fib1(n - 1) + fib1(n - 2);
}

long long int fib2(int n) {

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

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


j=i+j;nr_i++;
i=j-i;nr_i++;

}
return j;
}

long long int fib3(int n) {


long long int i = 1, j = 0, k = 0, h = 1, t;
while (n > 0) {

if (n%2== 1) {

t = j*h;nr_i++;
j = (i*h) + (j*k)+ t;nr_i++;
i = (i*k) + t;nr_i++;
}

t = h*h;nr_i++;
h = (2 * k*h) + t;nr_i++;
k = (k * k)+ t;nr_i++;
n = n / 2;nr_i++;
}
return j;
}

long long int fib4(int n)


{
if(n == 1 || n == 2)
{
nr_i++; return n;
}

else {nr_i++;
return 1.618*fib4(n-1);
}
}

int main()
{
int n, nm;
long long int t,j;
float times;
clock_t t_start, t_stop;
printf("Introduceti numarul de termeni ai seriei Fibonacci pe care doriti:");
scanf("%d", &n);
while (1)
{
system("cls");

puts("\tMeniu\n");
puts("1.Fib1");
puts("2.Fib2");
puts("3.Fib3");
puts("4.Fib4");
puts("0.EXIT");
scanf("%d", &nm);
switch (nm)
{
case 1:
system("cls");
t_start = clock();
nr_i=0;
t = fib1(n);
t_stop = clock();
times = ((float)(t_stop - t_start))*1000 / CLOCKS_PER_SEC;
printf("Fib1=%lld", t);
printf("\nTimp de executie: %f milisec.\n", times);
printf ("Numarul de iteratii =%lld \n",nr_i);
system("pause");
break;

case 2:
system("cls");
t_start = clock();
nr_i=0;
j=fib2(n);
t_stop = clock();
times = ((float)(t_stop - t_start))* 1000000LL / CLOCKS_PER_SEC;
printf("Fib2=%lld",j);
printf("\nTimp de executie: %f milisec.\n", times);
printf ("Numarul de iteratii =%lld \n",nr_i);
system("pause");
break;

case 3:
system("cls");
t_start = clock();
nr_i=0;
j = fib3(n);
t_stop = clock();
times = ((float)(t_stop - t_start))* 1000 / CLOCKS_PER_SEC;
printf("Fib3=%lld", j);
printf("\nTimp de executie: %f milisec.\n", times);
printf ("Numarul de iteratii =%lld \n",nr_i);
system("pause");
break;

case 4:
system("cls");
t_start = clock();
nr_i=0;
j = fib4(n);
t_stop = clock();
times = ((float)(t_stop - t_start))* 1000 / CLOCKS_PER_SEC;
printf("Fib4=%lld",j);
printf("\nTimp de executie: %f milisec.\n", times);
printf ("Numarul de iteratii =%lld \n",nr_i);
system("pause");
break;
case 0:
printf("Pentru a esi apasati Enter");
system("pause");
return 0;
default:
puts("Ati ales o varianta incorecta");
system("pause");
break;
}
}

}
Rezultatele obinute:
Dup timp:

T (s) 10 20 30 40 50
135,2
f1(n) fib1(recursia) 0 0,001 0,009 1,121 89
f2(n) fib2(for) 0 0 0 0 0
f3(n) fib3(while) 0 0 0 0 0
f4(n) fib4(rata de aur) 0 0 0 0 0
Graficul variatiei timpului pe intervalul [10;30]

0.01

Fib1(recursia) Fib2(for) Fib3(while) Fib4(rata de aur)

0 0 0
10 20 30

Graficul obinut n intervalul [30;50]:

135.29

0.01
0 1.12
0 0
30 40 50
fib2(for) fib3(while) fib1(recursia)

Rezultatele obinute dup numrul de iteraii:


it 10 20 30 40 50
26925 3311602 125862690
f1(n) fib1(recursia) 177 21891 37 81 25
f2(n) fib2(for) 20 40 60 80 100
f3(n) fib3(while) 22 26 32 30 33
f4(n) fib4(rata de aur) 9 19 29 39 49
Graficul variatiei iteratiilor

12586269025

2692537 331160281
177
20
22
9 21891
40
26
19 60
32
29 80
30
39 100
33
49
10 20 30 40 50
fib1(recursia) fib2(for)
fib3(while) fib4(rata de aur)

Compararea Fib2 cu Fib3 dupa nr de iteratii

100

80

60

40
32 30 33
26
22
20

10 20 30 40 50

Fib2(for) Fib3(while)
Concluzii:

n urma efecturii acestei lucrari de laborator am fcut cunotin cu Numerele lui


Fibonacci. Pentru afiarea unui numr al acestui ir am folosit 4 metode:
1. recursia
2. for
3.while
4.rata de aur

Dup obinerea rezultatelor , am fcut comparaii ntre ele cu ajutorul unor grafice.
Dup rezultatele primului tabel care arat timpul msurat n clockuri, am facut grafi-
ce pe intervale [1;20] si [30;50] . In primul ca si in al doilea interval algoritmul
fib1(recursia) are nevoie de mai mult timp pentru a afisa rezultatul, iar fib2 si fib 3
sint mai eficiente deoarece afiseaza rezultatul imediat, acesta observam si in graficile
facute. Calcule facute dupa numarul de iteratii arata tot aceleasi rezultate .
Pentru fib1 (recursia) numarul de interatii creste foarte rapid , iar pentru fib2 si fib3
lent . In graficul 3 am comparat fib2(for) si fib3(while) si observam ca fib2 face mai
multe iteratii ca fib3, respectiv fib3 este mai eficient.