Documente Academic
Documente Profesional
Documente Cultură
FCIM
Catedra Informatica Aplicativă
RAPORT
la lucrarea de laborator nr. 7
la SDA
Varianta 28
Chişinău – 2016
Sarcina şi obiectivele:
- de studiat şi însuşit materialul teoretic pentru evidenţierea esenţialului evaluării tehnicilor de
programare în elaborarea modelelor eficiente a soluţiei problemelor: esenţa metodelor (strategiilor
tehnicilor de apreciere) şi specificul realizării;
- să se analizeze complexitatea asimptotică şi notaţiile ei ca să se definească tehnica modelării
timpului de execuţie prin analiza empirică şi scenariile programării eficiente prin calculul
timpului de execuţie pentru diverse cazuri şi modele de structuri abstracte cu argumentări;
- să se efectueze analiza empirică a algoritmilor folosiţi, determinând relaţia de evaluare a
complexităţii temporale pentru aceşti algoritmi.
- să se analizeze modalitatea de evaluare a timpului de execuţie şi timpului de rulare din
exemplele propuse;
să se preia varianta problemei din Anexa pentru analiza empirică a complexităţii algoritmilor
şi calculul timpului de execuţie, implementând funcţiile de timp C, şi rularea programelor în limbajul C
să se elaboreze scenariile succinte de modificare, incluzând pointeri, subprograme şi fişiere
cu teste de verificare şi vizualizări şi explicaţii la principalele subprograme prin analiza comparativă.
Folosiţi ceasul de timp real al sistemului pentru a estima performanţele
algoritmului.
- Faceţi o concluzie asupra eficienţei.
Consideraţii teoretice:
Importanţa analizei şi implementării algoritmilor eficienţi
1.1 Eficienta algoritmilor. Ideal este ca, pentru o problema data, sa gasim mai multi algoritmi, iar apoi
sa-l alegem dintre aceştia pe cel optim. Care este insa criteriul de comparatie? Eficienta unui algoritm poate fi
exprimata in mai multe moduri. Putem analiza a posteriori (empiric) comportarea algoritmului dupa
implementare, prin rularea pe calculator a unor cazuri diferite. Sau, putem analiza a priori (teoretic)
algoritmul, inaintea programarii lui, prin determinarea cantitativa a resurselor (timp, memorie etc) necesare
ca o functie de marimea cazului considerat.
Marimea unui caz x, notata cu | x |, corespunde formal numarului de biti necesari pentru reprezentarea
lui x, folosind o codificare precis definita si rezonabil de compacta. Astfel, cand vom vorbi despre sortare,
| x | va fi numarul de elemente de sortat. La un algoritm numeric, | x | poate fi chiar valoarea numerica a
cazului x. Avantajul analizei teoretice este faptul ca ea nu depinde de calculatorul folosit, de limbajul de
programare ales, sau de indemanarea programatorului. Ea salveaza timpul pierdut cu programarea si rularea
unui algoritm care se dovedeste in final ineficient. Din motive practice, un algoritm nu poate fi testat pe
calculator pentru cazuri oricat de mari. Analiza teoretica ne permite insa studiul eficientei algoritmului pentru
cazuri de orice marime.
Este posibil sa analizam un algoritm si printr-o metoda hibrida. In acest caz, forma functiei care descrie
eficienta algoritmului este determinata teoretic, iar valorile numerice ale parametrilor sunt apoi determinate
empiric. Aceasta metoda permite o predictie asupra comportarii algoritmului pentru cazuri foarte mari, care
nu pot fi testate. O extrapolare doar pe baza testelor empirice este foarte imprecisa.
1.4 De ce avem nevoie de algoritmi eficienti?
Performantele hardware-ului se dubleaza la aproximativ doi ani. Mai are sens atunci sa investim in
obtinerea unor algoritmi eficienti? Nu este oare mai simplu sa asteptam urmatoarea generatie de calculatoare?
Problemele de autocontrol:
APLICAŢIE Se consideră un triunghi format din n linii, fiecare linie i conţinând i numere întregi. Să se
determine cea mai mare sumă de numere aflate pe un drum între numărul de pe prima linie şi un număr
de pe ultima linie. Fiecare număr din acest drum este situat sub precedentul, la stânga sau la dreapta
acestuia.
8. Exemplul 4 Metoda Divide et Impera
#include <iostream>
using namespace std;
#include <stdio.h>
int n; int a[30][30];
void citire() { int i,j;
cout<<"n=";cin>>n;
for (i=1;i<=n;i++)
for (j=1;j<=i;j++) { cout<<"a["<<i<<","<<j<<"]="; cin>>a[i][j]; } }
void afisare() { int i,j;
for (i=1;i<=n;i++) { for (j=1;j<=i;j++) printf("%5d",a[i][j]); printf("\n"); } }
int suma (int i, int j) { int s,d,S; if (i<=n) { s=suma(i+1,j); d=suma(i+1,j+1);
if (s>d) S=a[i][j]+s; else S=a[i][j]+d; } else S=0; return S; }
int main()
#include <iostream>
#include <stdio.h>
using namespace std;
#include <conio.h>
#include <math.h>
#include<cstdio>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#define INT 'i'
#define STR 's'
struct data { char tag;
union { int i; char *s; } value; } *a; int counter = 0;
int main() { char word[128]; int n; int i; clock_t t1,t2; float t; system("cls");
t1=clock();
printf("Dati numarul de elemente pentru tablou :"); scanf("%d",&n);
a=(data *) malloc(n *sizeof(*a));
if(!a) { puts("Memoria nu a fost alocata :"); }
puts("Dati numarul sau cuvintul :"); for(counter=0; counter < n; counter++)
{ fflush(stdin); if( gets(word) == NULL ) break; if( isdigit((unsigned char) *word))
{ a[counter].value.i = atoi(word); a[counter].tag = INT; }
else { a[counter].value.s =(char *) malloc(strlen(word)+1); strcpy(a[counter].value.s,
word); a[counter].tag = STR; } }
t2=clock(); t=t2-t1/CLK_TCK;
puts("Rezultatele obtinute :"); printf("Timpul de executie este: %f\n",t);
for(i=0; i < counter; i++)
switch(a[i].tag)
{
case INT: printf("numarul %d\n", a[i].value.i); break;
case STR: printf("cuvintul %s\n", a[i].value.s);
free(a[i].value.s);
break;
}
}
Problema 28:
1. Sa se genereze toate permutarile de dimensiune n cu valori în 1..n cu proprietatea ca oricare ar fi
2<=i<=n exista un 1<=j<=i astfel incât |v(i)-v(j)|=1.
#include<stdio.h>
#include<string.h>
#define N 10
Bibliografie
Limbajul de programare C". Brian W.Kernighan. Dennis M.Ritchie.
- Liviu Negrescu. ”Limbajul de programare C şi C++” V.1-4. Buc. 1999
- Knuth, D. E. - "Arta programarii calculatoarelor, vol. 1: Algoritmi fundamentali", Ed. Teora, 1999.
- Knuth, D. E. - "Arta programarii calculatoarelor, vol. 2: Algoritmi seminumerici", Ed. Teora, 2000.
- Knuth, D. E. - "Arta programarii calculatoarelor, vol. 3: Sortare si cautare", Ed. Teora, 2001.
- Bacivarov, A.; Nastac, I. - "Limbajul C. Indrumar de laborator", Tipografia UPB, Bucuresti, 1997.
- Bates, J; Tompkins, T. - "Utilizare C++", Ed. Teora 2001.
- Andonie, R.; Gabarcea, I. - "Algoritmi fundamentali. O perspectiva C++", Ed. Libris, 1995.
- Help din Turbo C ++IDE ,versiunea 3.0. 1999
- CORMEN, T. - LEISERSON, CH. - RIVEST, R. : Introducere in algoritmi, Editura Computer Libris. Agora,
Cluj-Napoca, 2000.
- Conspectele la PC 2009 şi SDA-2010
- L.Negrescu.Limbajele C si C++ pentru incepatori.Vol 1 si 2.Ed.Microinformatica.Cluj-N.,1994 si reeditata in
1996 ,1998,2000.
- L.Livovschi,H.Georgescu.Analiza si sinteza algoritmilor. Ed.Enciclopedica, Bucuresti,, 1986.
- I.Ignat, C.Ignat. Structuri de date si algoritmi. Indrumator de laborator. U.T.Pres, 2001.
- Informatica. Îndrumar metodic pentru lucrările de laborator. Marin Şt. Chişinău 2003. UTM