Sunteți pe pagina 1din 5

Ministerul Educaţiei ş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. ____________
Chişinău 2015

Scopul lucrării:
1. Analiza empirică a algoritmilor.
2. Analiza teoretică a algoritmilor.
3. Determinarea complexităţii temporale şi asimptotice a algoritmilor

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

Analiza matematică a complexităţii algoritmilor poate fi dificilă în cazul unor algoritmi care nu
sunt simpli.O alternativă la analiza matematică a complexităţii o reprezintă analiza empirică.
Etapele analizei empirice
1. Se stabileşte scopul analizei.
2. Se alege metrica de eficienţă ce va fi utilizată (număr de execuţii ale unei/unor operaţii sau
timp de execuţie a întregului algoritm sau a unei porţiuni din algoritm.
3. Se stabilesc proprietăţile datelor de intrare în raport cu care se face analiza (dimensiunea
datelor sau proprietăţi 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 obţinute.

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.

2
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;
3
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

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