raport apa cucu eugeniu lab.1

9
Ministerul Educației al Republicii Moldova Universitatea Tehnică a Moldovei Catedra Informatica Aplicată RAPORT Lucrarea de laborator nr.1 Tema: Analiza algoritmilor (Timpul de execuţie al algoritmilor) A efectuat:

Upload: cucu-eugen

Post on 05-Jan-2016

18 views

Category:

Documents


0 download

DESCRIPTION

Raport Analiza si proiectarea algoritmelor lab 1

TRANSCRIPT

Page 1: Raport APA Cucu Eugeniu Lab.1

Ministerul Educației al Republicii MoldovaUniversitatea Tehnică a Moldovei

Catedra Informatica Aplicată

RAPORTLucrarea de laborator nr.1

Tema: Analiza algoritmilor (Timpul de execuţie al algoritmilor)

A efectuat:st. gr. SI-141 E. Cucu

A verificat: Lector universitar V. Bagrin

Chișinău 2015

Page 2: Raport APA Cucu Eugeniu Lab.1

1. Descrierea algoritmelor Algoritmul este noțiunea fundamentală a informaticii. Totul este construit în jurul algoritmilor (și a structurilor de date, cum ar fi listele sau grafurile). Este și un concept fundamental al matematicii moderne alături de cel de sistem axiomatic

Timpul de executie al algoritmilor

De multe ori, pentru rezolvarea unei probleme, trebuie ales un algoritm dintre mai multi posibili, două criterii principale de alegere fiind contradictorii: algoritmul să fie simplu de inteles, de codificat si de depanat; algoritmul să folosească eficient resursele calculatorului, să aibă un timp de executie redus.Dacă programul care se scrie trebuie rulat de un număr mic de ori, prima cerintă este mai importantă; in această situatie, timpul de punere la punct a programului e mai important decat timpul lui de rulare, deci trebuie aleasă varianta cea mai simplă a programului.Daca programul urmează a fi rulat de un număr mare de ori, avand si un număr mare de date de prelucrat, trebuie ales algoritmul care duce la o executie mai rapidă. Chiar in această situatie, ar trebui implementat mai inainte algoritmul mai simplu si calculată reducerea de timp de executie pe care ar aduce-o implementarea algoritmului complex.

Analiza empirica a complexitatii algoritmilor

O alternativă la analiza matematică a complexitătii o reprezintă analiza empirică.Aceasta poate fi utilă pentru:- a obtine informatii preliminare privind clasa de complexitate a unui algoritm;- pentru a compara eficienta a doi (sau mai multi) algoritmi destinati rezolvării aceleiasi probleme; - pentru a compara eficienta mai multor implementări ale aceluiasi algoritm; - pentru a obtine informatii privind eficienta implementării unui algoritm pe un anumit calculator

Page 3: Raport APA Cucu Eugeniu Lab.1

2. Listingul programului

#include <iostream>#include <stdlib.h>#include <time.h>

using namespace std;unsigned long long fib_1(int n);unsigned long long fib_2(int n);unsigned long long fib_3(int n);unsigned long long num_schmb_1 = 0;unsigned long long num_schmb_2 = 0;unsigned long long num_schmb_3 = 0;int main() { clock_t start_1,finish_1; clock_t start_2,finish_2; clock_t start_3,finish_3; cout << "Dati numarul fibonacci pe care doriti sa-l obtineti!" << endl; int n; cin >> n; unsigned long long fib1; unsigned long long fib2; unsigned long long fib3; start_1 = clock(); fib1 = fib_1(n); finish_1 = clock() - start_1; cout << "Utilizind algoritmul 1:" << endl; cout <<"Numarul lui fibonacci este:" << fib1 << endl << "S-au produs " << num_schmb_1 << " de interschimbari in " << (float)finish_1/CLOCKS_PER_SEC <<" secunde." <<endl; start_2 = clock(); fib2 = fib_2(n); finish_2 = clock() - start_2; cout << "Utilizind algoritmul 2:" << endl; cout <<"Numarul lui fibonacci este:" << fib2 << endl << "S-au produs " << num_schmb_2 << " de interschimbari in " << ((float)finish_2/CLOCKS_PER_SEC)/1000 <<" secunde." <<endl; start_3 = clock(); fib3 = fib_3(n); finish_3 = clock() - start_3; cout << "Utilizind algoritmul 3:" << endl; cout <<"Numarul lui fibonacci este:" << fib3 << endl << "S-au produs " << num_schmb_3 << " de interschimbari in " << (float)finish_3/CLOCKS_PER_SEC <<" secunde." <<endl; system("pause"); return 0;}unsigned long long fib_1(int n) { if(n <= 2) return 1; else { num_schmb_1++; return fib_1(n-1) + fib_1(n-2); }}unsigned long long fib_2(int n) { unsigned long long fib_num = 0; unsigned long long k = 1; for (int i = 0; i < n; i++) { fib_num = k + fib_num; k = fib_num - k; num_schmb_2 += 2; }

Page 4: Raport APA Cucu Eugeniu Lab.1

return fib_num;}unsigned long long fib_3(int n) { unsigned long long i = 1; unsigned long long j = 0; unsigned long long k = 0; unsigned long long h = 1; unsigned long long t; while(n > 0){ if ((n % 2) != 0){ t = j*h; j = (i*h) + (j*k) +t; i = (i*k) +t; num_schmb_3 += 3; } t = h*h; h = (2*k*h) + t; k = (k*k) + t; n = n / 2; num_schmb_3 += 3; } return j;}

Page 5: Raport APA Cucu Eugeniu Lab.1

3. Reprezentarea rezultatelor

Nr.term.

Algor. n=5 n=12 n=25 n=34 n=40

1 15 465 242785 18454929 331160281

2 5 12 25 34 40

3 3 4 6 6 6

Tabelul 1.

Graficul 1.

n=5 n=12 n=25 n=34 n=400

50000000

100000000

150000000

200000000

250000000

300000000

350000000

0

5

10

15

20

25

30

35

40

45

fib 1fib 2fib 3

Page 6: Raport APA Cucu Eugeniu Lab.1

4. Analiza rezultatelor

a. Algoritmul recursiv

Function fib1(n)1:     if n < 2   then   return n2:                             else   return fib1(n-1) + fib1(n-2)

T (n )=t (n−1 )−t (n−2 );t (n )−t (n )−1−t (n )−2=0 x2−x−1=0 ∆=5

x1=1−√52

, x2=1+√52

t (n )=¿¿ T (n )=O (φn ) ;

Analizind algoritmul recursive si determinind complexitatea asimptotica putem spune ca acest algoritm este neeficient avind un numar mare de apeluri recursive crescind foarte rapid exponential.

b. Algoritmul iterativ

function fib2(n)1: i 1; j 02: for k 1 to n do 3:                                 j i + j4: i j - i return j

T (n )=5 n−2;

Acest algoritm iterativ are o complexitate liniara ceea ce ofera o rapiditate in rezolvarea problemei numar te iteratii fiind egal cu numarul lui Fibonacci cautat.

Costul nr. de repC1 nC2 n*n*n

Costul nr. de rep1 1

1 15 n-2

Page 7: Raport APA Cucu Eugeniu Lab.1

c. Algoritmul divizarii

function fib3(n)1: i 1; j 0; k 0; h 12: while n > 0 do3: if n este impar then  4:                                           t jh5: j ih+jk+t6: i ik+t7: t h2

8: h 2kh+t9: k k2+t10: n n div 2 return j

T (n )=O( log2n);

Acest algoritm are o complexitate asimptotica logaritmica liniara,aceasta functie creaste logarithmic fata de n de aici rezulta ca conform operatiunii de baza n n div 2 este o functie rapida.

5. Concluzie

După efectuarea acestei lucrări de laborator am făcut cunostintă a trei algoritmi pentru a calcula numerele din sirul lui Fibonacci. Toate metodele lucrează dar ele se diferă după eficientă. Metoda I a fost cea mai ineficientă deoarice calculează de mai multe ori aceeasi valoare. Metoda II este mai eficientă decit Metoda I dar tutosi are si ea o limită. Metoda II este rea deoarece numărul de iteratii coincide cu pozitia numărului căutat in sirul Fibonacci. Şi in sfirsit Metoda III estea cea mai eficientă, introducind valoarea maximă a signed int pe 32-bit ea se isprăveste intr-un timp foarte mic si cu iteratii minimali.

Costul nr. de repC1 1C2 2n

C3 2n

C4 1C5 1C6 1C7 2n

C8 2n

C9 2n

C10 2n