Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrarea de laborator Nr.1
La disciplina Analiza i Proiectarea Algoritmilor
A efectuat
Chicu Roman
St.gr.TI-142
A verificat
Bagrin Veronica
Chiinu 2015
Scopul lucrrii: [1]
Analiza empiric a algoritmilor.
Analiza teoretic a algoritmilor.
Determinarea complexitii temporale i asimptotice a algoritmilor.
Sarcina de baz: [1]
1. Efectuai analiz 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.
Fib(1)
0.1
0
0
0
0
0
1,6
3,5
5,3
8,5
Fib(2)
Fib(3)
Fib(4)
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0.1
Tabelul 1. Analiza timpului de execuie
8
7
6
Fib(1)
Fib(2)
Fib(3)
Fib(4)
2
1
0
1
10
20
30
32
33
34
Fib(1)
1
2
8
66
176
21890
2692536
7049154
11405772
18454928
Fib(2)
1
2
4
8
10
20
30
32
33
34
Fib(3)
Fib(4)
1
0
2
0
3
0
4
0
4
0
5
0
5
0
6
0
6
0
6
0
Tabelul 2. Analiza nr. de iteraii
Fib(1)
10000000
Fib(2)
Fib(3)
8000000
Fib(4)
6000000
4000000
2000000
0
1
10
20
30
32
33
34
deci nr. de iteraii va crete foarte rapid la calculul urmtorilor termeni ai irului.
Comparativ cu algoritmul recursiv, cel iterativ realizeaz la termenul 30 interaii n nr.
de 30, fiind de cca. 89751,2 ori mai rapid. Algoritmul nr.3 se dovedete a fi mult mai
eficient, realiznd doar 6 iteraii la calculul termenului 34, iar utilizarea seciunii de
aur, care nu efectueaz nici o iteraie, se dovedete a fi cea mai eficient metod.
Codul programului n C/C++:
Lab.cpp
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include "Fibonnaci.cpp"
int main()
{
int op; int n1,n2,n3; //max 47
clock_t begin, end;
float time_spent,time_spent2,time_spent3,time_spent4;
int r=0;
menu:
system("cls");
printf("\n\
\n\
[ MENIU ]
Analiza Fibonnaci
\n\
\n\
%c\n\
[1] - Afiseaza datele pentru pozitia 1 \n\
[2] - Afiseaza datele pentru pozitia 2 \n\
[3] - Afiseaza datele pentru pozitia 4 \n\
[4] - Afiseaza datele pentru pozitia 8 \n\
[5] - Afiseaza datele pentru pozitia 10 \n\
[6] - Afiseaza datele pentru pozitia 20 \n\
[7] - Afiseaza datele pentru pozitia 30 \n\
[8] - Afiseaza datele pentru pozitia 32 \n\
[9] - Afiseaza datele pentru pozitia 33 \n\
[10] -Afiseaza datele pentru pozitia 34 \n\
[11]- Iesirea/Exit
\n\
\n",185);
printf("\t\t\t Comand: ");
cin>>op;
switch(op)
{
case 1: system("cls");
n1=1;
// de adaugata inainte de fiecare
cout<<"Metoda Recursiei\n\n";
cout<<"Primul element este= >> ";
r=1;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
getch();
break;
case 2: system("cls");
n1=2;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 2-a element este=>> ";
r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de itinerati
este=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerarin\n";
cout<<"Al 2-a element este=>> ";
r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent2<<" \n\nNr. de
itinerati este=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\A 3-a Metoda\n\n";
cout<<"Al 2-a element este=>> ";
r=0;
begin = clock();
cout<<fib_3(n1,r);
end = clock();
time_spent3 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent3<<" \n\nNr. de
itinerati este=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda raportul de aur\n\n";
cout<<"Al 2-a element este=>> ";r=0;
begin = clock();
cout<<fib_4(n1,r);
end = clock();
time_spent4 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent4<<" \n\nNr. de
itinerati=>> "<<r;
getch();
break;
case 3: system("cls");
n1=4;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 4-a element este= >> ";
r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerarin\n\n";
cout<<"Al 4-a element este=>> ";
r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent2<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nA 3-a Metoda\n\n";
cout<<"Al 4-a element este=>> ";
r=0;
begin = clock();
cout<<fib_3(n1,r);
end = clock();
time_spent3 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent3<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda raportul de aur\n\n";
cout<<"Al 4-a element este=>> ";r=0;
begin = clock();
cout<<fib_4(n1,r);
end = clock();
time_spent4 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent4<<" \n\nNr. de
itinerati=>> "<<r;
getch();
break;
case 4: system("cls");
n1=8;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 8-a element este=>> ";
r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerarin\n\n";
cout<<"Al 8-a element este=>> ";r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\Timpul executiei este=>> "<<time_spent2<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\A 3-a Metoda\n\n";
cout<<"Al 8-a element este>> ";r=0;
begin = clock();
cout<<fib_3(n1,r);
end = clock();
time_spent3 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent3<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda raportul de aur\n\n";
cout<<"Al 8-a element este=>> ";r=0;
begin = clock();
cout<<fib_4(n1,r);
end = clock();
time_spent4 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent4<<" \n\nNr. de
itinerati=>> "<<r;
getch();
break;
case 5: system("cls");
n1=10;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 10-a element este=>> ";r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerari\n\n";
cout<<"Al 10-a element este=>> ";r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
getch();
break;
case 6: system("cls");
n1=20;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 20-a element este=>> ";r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerari\n\n";
cout<<"Al 20-a element este=>> ";r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent2<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nA 3-a Metoda\n\n";
cout<<"Al 20-a element este=>> ";r=0;
begin = clock();
cout<<fib_3(n1,r);
end = clock();
time_spent3 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent3<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda raportul de aur\n\n";
cout<<"Al 20-a element este=>> ";r=0;
begin = clock();
cout<<fib_4(n1,r);
end = clock();
time_spent4 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent4<<" \n\nNr. de
itinerati=>> "<<r;
getch(); break;
case 7: system("cls");
n1=30;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 30-a element este=>> ";r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerari\n\n";
cout<<"Al 30-a element este=>> ";r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent2<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nA 3-a Metoda\n\n";
cout<<"Al 30-a element este=>> ";r=0;
begin = clock();
cout<<fib_3(n1,r);
end = clock();
time_spent3 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent3<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda raportul de aur\n\n";
cout<<"Al 30-a element este=>> ";r=0;
begin = clock();
cout<<fib_4(n1,r);
end = clock();
time_spent4 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent4<<" \n\nNr. de
itinerati=>> "<<r;
getch();
break;
case 8: system("cls");
n1=32;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 32-a element este=>> ";r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerari\n\n";
cout<<"Al 32-a element este=>> ";r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
getch();
break;
case 9: system("cls");
n1=33;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 33-a element este=>> ";r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerari\n\n";
cout<<"Al 33-a element este=>> ";r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent2<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nA 3-a Metoda\n\n";
cout<<"Al 33-a element este=>> ";r=0;
begin = clock();
cout<<fib_3(n1,r);
end = clock();
time_spent3 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent3<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda raportul de aur\n\n";
cout<<"Al 33-a element este=>> ";r=0;
begin = clock();
cout<<fib_4(n1,r);
end = clock();
time_spent4 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent4<<" \n\nNr. de
itinerati=>> "<<r;
getch();
break;
cout<<"Metoda Recursiei\n\n";
cout<<"Al 34-a element este=>> ";r=0;
begin = clock();
cout<<fib_1(n1,r);
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nMetoda Itinerari\n\n";
cout<<"Al 34-a element este=>> ";r=0;
begin = clock();
cout<<fib_2(n1,r);
end = clock();
time_spent2 = (double)(end - begin) / CLOCKS_PER_SEC;
cout<<"\n\nTimpul executiei este=>> "<<time_spent2<<" \n\nNr. de
itinerati=>> "<<r;
cout<<"\n\n--------------------------";
cout<<"\n\nA 3-a Metoda\n\n";
cout<<"Al 34-a element este=>> ";r=0;
begin = clock();
cout<<fib_3(n1,r);
end = clock();
time_spent3 = (double)(end - begin) / CLOCKS_PER_SEC;
lab.cpp
#include <math.h>
while(n>0)
{
//Functions
if(n%2==1)
t=j*h;
j=i*h+j*k+t;
if (n<2) return n;
i=i*k+t;
t=h*h;
h=2*k*h+t;
int i=1; unsigned long j=0; int k=0;
k=k*k+t;
for(k=1;k<=n;k++)
n=n/2;
++r;
j=i+j;
i=j-i;
return j;
++r;
}
return j;
}
long)
Concluzii
n urma realizrii lucrrii de laborator nr.1, a fost efectuat analiza empiric a
algoritmilor de determinare a unui n-termen din irul Fibonacci. Analiznd rezultatele
a 10 seturi de date, s-au concluzionat urmtoarele:
1. Timpul pentru calculul termenilor de pn la 20 este nul pentru fiecare algoritm,
deci aceti termeni sunt relativ uori de calculat.
2. Conform timpului de execuie, cel mai ineficient algoritm este cel recursiv.
Pentru a calcula a 34-lea termen, a fost nevoie de 0,086 secunde, pe cnd ceilali
algoritmi practic nu necesit timp pentru calcul. Nu se poate demonstra care
dintre ceilali algoritmi este mai eficient, deoarece timpul de execuie este
practic nul.
3. Conform nr. de iteraii, cel mai ineficient algoritm este cel recursiv. Pentru
termenul 20, este nevoie de un nr. de interaii cu ordinul de 10 7. Cel mai eficient
se dovedete a fi algoritmul ce utilizeaz seciunea de aur, ce nu realizeaz
practic nici o iteraie.
4. Rezultatele analizei algoritmilor pot fi diferite pentru diferite calculatoare, o
influen deosebit de important avnd-o capacitatea de procesare a
calculatorului i memoria operativ a acestuia.
Bibliografie
1. Indicaii la lucrarea de laborator nr.1 , UTM 2015 (accesat 03.10.2015)