Sunteți pe pagina 1din 6

Ministerul Educaiei i

Tineretului al Republicii Moldova

Universitatea Tehnic a Moldovei

Facultatea IM
Catedra: Automatica si Tehnologii Informationale

Raport
Nr1
ANALIZA SI PROIECTAREA ALGORITMILOR
TEMA: Analiza algoritmilor

A elaborat:
st. gr.TI-142 Tincu M.

___________

A verificat:
Prof. Universitar Bagrin V.

____________

Chiinu 2015

Scopul lucrrii:
1. Analiza empiric a algoritmilor.
2. Analiza teoretic a algoritmilor.
3. Determinarea complexitii temporale i asimptotice a algoritmilor

Consideratii teoretice:
Numerele lui Fibonacci.
Sirul lui Fibonacci este definit prin urmatoarea recurenta:

Analiza matematic a complexitii algoritmilor poate fi dificil n cazul unor


algoritmi care nu sunt simpli.O alternativ la analiza matematic a
complexitii o reprezint analiza empiric.
Etapele analizei empirice
1. Se stabilete scopul analizei.
2. Se alege metrica de eficien ce va fi utilizat (numr de execuii ale
unei/unor operaii sau timp de execuie a ntregului algoritm sau a unei
poriuni din algoritm.
3. Se stabilesc proprietile datelor de intrare n raport cu care se face
analiza (dimensiunea datelor sau proprieti specifice).
4. Se implementeaz algoritmul ntr-un limbaj de programare.
5. Se genereaz mai multe seturi de date de intrare.
6. Se execut programul pentru fiecare set de date de intrare.
7. Se analizeaz datele obinute.
Pentru a efectua o analiz empiric nu este suficient un singur set de date de
intrare ci mai multe, care s pun n eviden diferitele caracteristici ale
algoritmului.

Sarcina
Executarea unui program in limbajul de programare C++ care va
compara cele 3 metode expuse in materialul teoretic p-ru diferite valori ale
lui n.

Listingul programului:
#include <iostream>
using namespace std;
int fibonacci(int n)
{
if ((n == 1) || (n == 0))
{
return(n);
}
else
{
return(fibonacci(n - 1) + fibonacci(n - 2));
}
}
int fib3(int n)//3 metoda dupa pseudocod
{
n = n - 1;
int i = 1, j = 0, k = 0, h = 1, t = 1;
while (n > 0) {
if (n % 2 != 0)
{
t = h*j;
j = i*h + j*k + t;
i = i*k + t;
}
{
t = h*h;
h = 2 * k*h + t;
k = k*k + t;
n = (n / 2);
}
}
return j;
}
int main()
{
//iteratie
int range, first = 0, second = 1, fibonaci = 0;
cout << "\t\tMetoda iterativa\n\n";
cout << "Introduceti raza: ";
cin >> range;
cout << "Seria lui Fibonacci pina la " << range << " este: " << endl;
for (int c = 0; c < range; c++)
{
if (c <= 1)
fibonaci = c;
else
{
fibonaci = first + second;
first = second;
second = fibonaci;
}
cout << fibonaci << " ";
}
//afisare
//recursie
int n, i = 0;

n = range;
int *p;
cout << "\n\n\t\tMetoda recursiei\n";
cout << "\n";
while (i<n)
{
cout << " " << fibonacci(i);
i++;
}
cout << "\n";
//afisare

//3 metoda
cout << "\n\t\tMetoda optimizarii\n\n";
cout << "Metoda 3 este:
" << fib3(n) << endl;
system("pause");
return 0;

Rezultatele programului:
n=10

n=20

n=30

Concluzie:
In urma efectuarii acestei lucrari de laborator am analizat 3 metode
diferite de calcul a sirului lui Fibonaci. In urma rularii programului am ajuns la
concluzia ca diferiti algoritmi au timpul de executare diferita. Cel mai eficient
este primul algoritm. Timpul de executie este foarte mic si numarul de iteratii
pentru numerele mari nu creste foarte repede.
5