Raport: Analiza Algoritmilor

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 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.
2.
3.

Analiza empiric a algoritmilor.


Analiza teoretic a algoritmilor.
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)
f1(n)
f2(n)
f3(n)
f4(n)

fib1(recursia)
fib2(for)
fib3(while)
fib4(rata de aur)

10

20

30

40

0
0
0
0

0,001
0
0
0

0,009
0
0
0

1,121
0
0
0

50
135,2
89
0
0
0

Graficul variatiei timpului pe intervalul [10;30]


0.01

Fib1(recursia)

Fib2(for)

Fib3(while)

Fib4(rata de aur)

0
0

10

20

30

Graficul obinut n intervalul [30;50]:


135.29

1.12
0

0.01
0

30

40

fib2(for)

50

fib3(while)

fib1(recursia)

Rezultatele obinute dup numrul de iteraii:


it
f1(n)
f2(n)
f3(n)
f4(n)

fib1(recursia)
fib2(for)
fib3(while)
fib4(rata de aur)

10

20

177
20
22
9

21891
40
26
19

30
26925
37
60
32
29

40
50
3311602 125862690
81 25
80
100
30
33
39
49

Graficul variatiei iteratiilor

12586269025

177
20
22
9

10

331160281
80
30
39

2692537
60
32
29

21891
40
26
19

20

30

40

fib1(recursia)

fib2(for)

fib3(while)

fib4(rata de aur)

100
33
49

50

Compararea Fib2 cu Fib3 dupa nr de iteratii


100
80
60
40
22
20

10

26

20
Fib2(for)

32

30

33

30

40

50

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 grafice 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.

You might also like