Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrare de laborator Nr.1
la Analiza i proiectarea algoritmelor
A efectuat:
st. gr. SI-151 Cucu Dumitru
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);
}
int k;
long long int i=1, j=0;
}
return j;
}
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;
}
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
0 0 0
10 20 30
135.29
0.01
0 1.12
0 0
30 40 50
fib2(for) fib3(while) fib1(recursia)
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)
100
80
60
40
32 30 33
26
22
20
10 20 30 40 50
Fib2(for) Fib3(while)
Concluzii:
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.