Sunteți pe pagina 1din 35

Facultatea de Matematica si Informatica

Universitatea Bucuresti

Programare procedurala
- suport de curs -

Dobrovat Anca - Madalina


An universitar 2014 2015
Semestrul I
Saptamana 2
9/10/2014

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Curs 2 - Cuprins

1. Complexitatea algoritmilor
2. Corectitudinea algoritmilor

3. Concluzii si perspective

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Curs 2 - Cuprins

1. Complexitatea algoritmilor
- complexitate : timp, spatiu de memorie, notatii asimptotice,

time.h
- exemple

1. Corectitudinea algoritmilor
2. Concluzii si perspective
3

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (1/15)


Analiza complexitii unui algoritm => determinarea resurselor de care
acesta are nevoie pentru a produce datele de ieire.
Resurse - timpul de executare
- spatiu de memorie etc.
Obs: Modelul masinii pe care va fi executat algoritmul nu presupune
existenta operatiilor paralele (operatiile se executa secvential).
Notatie: T(n) timp de rulare al unui algoritm (in general masurat in nr. de
comparatii sau de mutari)
Cazuri:
- cel mai favorabil
- cel mai nefavorabil
- mediu
4

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (2/15)


De ce se alege, in general, cazul cel mai defavorabil?

- este cel mai raspandit


- timpul mediu de executare este de multe ori apropiat de timpul de
executare in cazul cel mai defavorabil
- ofera o limita superioara a timpului de executare (avem certitudinea ca
executarea algoritmului nu va dura mai mult)

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (3/15)


Notatii:
T(n) timp de rulare al unui algoritm (in general masurat in nr. de
comparatii sau de mutari)
Cmax numarul maxim de comparatii (obtinut in cazul cel mai defavorabil)

Cmin numarul minim de comparatii (cazul cel mai favorabil)


Mmax numarul maxim de mutari (operatii elementare) caz defavorabil

Mmin numarul minim de mutari caz favorabil

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (4/15)


Exemple
1. Produsul a doua numere complexe ([1])
int main()
{
float a,b,c,d, p, q;
float t1, t2;
scanf(%f%f%f%f, &a, &b, &c, &d);
t1 = a*c; t2 = b*d; p = t1 t2;
t1 = a*d; t2 = b*c; q = t1 + t2;
printf(Real = %f, Imaginar = %f, p, q);
}
- memorie pentru 8 variabile
Operatii elementare: 4 inmultiri, o adunare
si o scadere

int main()
{
float a,b,c,d, p, q;
float t1, t2, t3, t4;
scanf(%f%f%f%f, &a, &b, &c, &d);
t1 = a + b; t2 = t1 * c; t1 = d c; t3 = a * t1;
q = t2 + t3; t1 = d + c; t4 = b * t1; p = t2 t4;
printf(Real = %f, Imaginar = %f, p, q);
}
- memorie pentru 10 variabile
Operatii elementare: 3 inmultiri, 3 adunari si 2
scaderi

Operatia de inmultire e mai costisitoare


decat adunarea / scaderea.
[1] Albeanu G Programare procedurala (note de curs 2013)

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (5/15)


Exemple
2. Cmmdc a 2 numere
Euclid:

Scaderi repetate:

Algoritm brut:

int a,b,r;
scanf(%d%d, &a, &b);
r = a % b;
while (r!=0)
{ a = b;
b = r;
r = a %b;
}
printf(Cmmdc = %d, b);

int a,b,r;
scanf(%d%d, &a, &b);
while (a != b)
if (a >b )
a = a b;
else
b = b a;

int a,b,c,i,min;
scanf(%d%d, &a, &b);

printf(Cmmdc = %d, a);

if (a < b) min = a;
else min = b;
for(i = 1 ; I <= min; i++)
if ( %i==0 && b%i == 0)
c = i;
printf(Cmmdc = %d, c);

Cate operatii se executa daca se citesc initial numerele 97 si 99?


8

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (6/15)


Exemple
3. Determinarea maximului dintr-un sir
int main()
{
int a[100], n, i, max;
// citire vector
max = v[1];
for(i = 2; i <= n; i++)
if (max < v[i]) max = v[i];

Obs: Cmax = Cmin = Cmediu = n 1


Mmin = 0 // maximul se afla pe prima pozitie
Mmax = n -1 // maximul se afla pe ultima
pozitie in vectorul initial
Mmediu = (n -1) / 2
Exemplu: n = 6
v = (-32, 1, 56, 89, -20, 100)
- max = 100, gasit dupa 5 comparatii

printf(Maximul = %,max);
return 0;
}
Tema:
1. Un program eficient pentru verificarea primalitatii unui numar.
2. Determinati simultan maximul si minimul dintr-un sir, folosind 3n/2
+ O(1) comparatii

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (7/15)


Exemple
4. Cautarea unei valori intr-un sir ordonat (Cautarea binara)
int main()
{
int left = 0, right = n - 1;
int mid = (left + right) / 2;
while (left <= right && val != v[mid])
{
if (val < v[mid]) right = mid - 1;
else left = mid + 1;
mid = (left + right) / 2;
}
if (v[mid] == val) loc = mid;
else loc = UNDEFINED;
}

- O( log2n)
Exemplu: caut (fara succes) elementul 10 in
sirul v = (20, 30, 40, 50, 60, 70, 80, 90, 100)
- compar 10 cu 60 (elem din mijloc); 10 != 60
- 10 < 60 = > caut in v = (20, 30, 40, 50)
- compar 10 cu 30 (noul elem din mijloc)
- 10 < 30 = > caut in v = (20)
- compar 10 cu 20 (unicul elem)
- cautare fara succes
n = 9, [log29] = 3
10

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (8/15)


Exemple
5. Ordonarea unui sir folosind Interschimbarea directa
int main()
{
int v[100], n, i, j, aux;
// citire vector
for (i = 1; i< n; i++)
for(j = i+1; j <= n; j++)
If (v[i] > v[j])
{ aux = v[i];
v[i] = v[j];
v[j] = aux;
}
// Afisare vector ordonat
}

Caz

Comparatii

Mutari

Cel mai
favorabil

n(n 1) / 2

Cel mai
defavorabil

n(n 1) / 2

3n(n 1) / 2

mediu

n(n 1) / 2

3n(n 1) / 4

O( n2)

11

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (9/15)


Exemple
6. Ordonarea unui sir folosind Insertia directa
int main()
{
int v[100], n, i, j, aux;
// citire vector
for (i = 2; i<=n; i++)
{
x = v[i];
j = i 1;
while (j>0 && x < v[j])
{
v[j+1] = v[j];
j--;
}
v[j+1] = x;
}
// Afisare vector ordonat
}

Caz

Comparatii

Mutari

Cel mai
favorabil

n1

2(n 1)

Cel mai
defavorabil

n2 + n 1

n2+3/2n-2

mediu

( n2 + n 1)/2

Cmediu+2(n-1)

O( n2)

12

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (10/15)


Exemple
6. Inmultirea a doua matrice
int main()
{
=
x
int a[10][20], b[20][30], c[10][30];
int n, m, p, i, j, k;
// citire matrice a si b
for(i=1; i<=n; i++)
for(k=1; k<=p; k++)
n,m
x
m,p =
n,p
{ c[i][k] = 0;
for(j=1; j<=m; j++)
c[i][k] = c[i][k] + a[i][j] * b[j][k];
}
O( m*n*p)
// Afisare matrice produs
Tema(*)
}
Inmultirea optima a unui sir de matrice = >
Programare dinamica = > numar minim de
inmultiri

13

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (11/15)


Notatia asimptotica
T(n) timp de rulare al unui algoritm (comparatii / mutari)

Obs: Exista un timp minim si un timp maxim de rulare


Cmin <= T (n) <= Cmax
Margini superioare (si inferioare)

([2])

Timp de rulare T(n) - margine superioara


T(n) <= n2 + (3/2)n 2 (expl.)
=>

T (n) = O(n2 )

Timp de rulare T(n) - margine inferioara


3(n 1) <= T(n) (expl)
=>

T (n) = (n)

Timp de rulare T(n) in cazul cel mai nefavorabil


T(n) = a*Cmax + b ( const a ,b > 0) =>
T (n) = (n2)
[2] Ceterchi R. Algoritmi si Structuri de Date (note de curs 2013)

14

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (12/15)


Notatia asimptotica
comportarea lui T (n) cind n

([2])

Formal

f : N R+ (f asimptotic pozitiva)

O(g):= {f | c > 0, n0 a.i. 0 f (n) cg(n) oricare n n0 }

(g) := {f | c > 0, n0 a.i. 0 cg (n) f (n) oricare n n0 }


(g) := {f | c1, c2 > 0, n0 a.i. 0 c1g(n) f(n) c2g (n) oricare n n0 }
[2] Ceterchi R. Algoritmi si Structuri de Date (note de curs 2013)
15

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (13/15)


Fisierul antet time.h ([1])

Inclus pentru masurarea timpului


Contine prototipul functiei clock() => nr. de tacte de ceas de timp real

scurs de la inceperea programului, pana in punctul in care se plaseaza


aceasta functie
clock()/CLK_TCK => timpul in secunde (Obs: CLK_TCK este
denumirea pentru CLOCKS_PER_SEC in versiunile anterioare
Microsoft C.)
Plasand doua asemenea expresii, inaintea si dupa apelul
subprogramului aflat sub masurare, diferenta lor da timpul consumat
de algoritm.
[1] Albeanu G Programare procedurala (note de curs 2013)

16

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (14/15)


Fisierul antet time.h ([1])

Exemplu

[1] Albeanu G Programare procedurala (note de curs 2013)

17

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Complexitatea algoritmilor (15/15)


Fisierul antet time.h ([1])

Exemplu

[1] Albeanu G Programare procedurala (note de curs 2013)

18

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Curs 2 - Cuprins

1. Complexitatea algoritmilor
2. Corectitudinea algoritmilor
- Metoda asertiunilor (assert.h)

1. Concluzii si perspective

19

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (1/14)


Corectitudine logica a unui program => Algoritmul analizat produce
rezultatul dorit dupa efectuarea unui numar finit de operatii.

Modalitati de verificare a corectitudinii


Experimentala (prin testare): algoritmul este executat pentru un set de
date de intrare => relativ simpla dar nu garanteaza corectitudinea

Formala (prin demonstrare): se demonstreaza ca algoritmul produce


rezultatul corect pentru orice set de date de intrare care satisface cerintele
problemei => dificila in aplicarea pentru algoritmi complecis, dar garanteaza
corectitudinea

20

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (2/14)


Preconditii si postconditii ([3])
Preconditii = proprietati satisfacute de datele de intrare
Postconditii = proprietati satisfacute de datele de iesire (rezultate)
Exemplu:
Sa se determine valoarea maxima dintr-un sir nevid.

Preconditii: n>=1 (secventa este nevida)


Postconditii: m (valoarea maxima) = max{x[i]; 1<=i<=n} (sau m >=x[i] pentru
orice i) => m contine cea mai mare valoare din x[1..n]

[3] http://web.info.uvt.ro/~dzaharie/alg/alg2013_folii3.pdf

21

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (3/14)


Asertiuni
Asertiune = afirmatie (adevarata) privind starea algoritmului
Limbajele de programare permit specificarea unor asertiuni si generarea
unor exceptii daca asertiunea nu este satisfacuta. In C: assert.h .
Etapele verificarii corectitudinii
1. Identificarea preconditiilor si a postconditiilor
2. Adnotarea algoritmului cu asertiuni astfel incat:
Preconditiile sa fie satisfacute
Asertiunea finala sa implice postconditiile
3. Fiecare pas de prelucrare asigura modificarea starii algoritmului astfel
incat asertiunea urmatoare sa fie adevarata.
22

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (4/14)


Asertiuni
Constructia
assert (P);
A()
assert (Q);
este numita formula de corectitudine totala.
P - preconditii
Q - postconditii
A algoritm
Def: Un program este corect cand este adevarata propozitia logica:
Daca datele de intrare satisfac preconditia P, atunci:
1. executarea lui A se termina (intr-un nr finit de pasi)
2. datele de iesire satisfac postconditia Q
23

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (5/14)


Asertiuni
Obs: Daca
assert (P);
A();
assert (Q);

si

assert (R)
A();
assert (Q)

sunt formule corecte, atunci:


assert (P || R);
A();
assert (Q);
este program corect.

24

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (6/14)


Asertiuni
Reguli pentru verificarea corectitudinii
- Prelucrari secventiale
- Prelucrari conditionale
- Prelucrari repetitive

25

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (7/14)


Asertiuni
Prelucrari secventiale
Obs: Daca A() este de forma SEQ B(); C(); END {B si C sunt instructiuni
care se executa secvential }, atunci a verifica formula:
assert (P);
A();
assert (Q);
revine la a verifica formulele:
assert (P);
B();
assert (R);
si
assert (R);
C();
assert (Q);
Unde R este o expresie logica asupra datelor intermediare
26

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (8/14)


Asertiuni
Prelucrari secventiale (generalizare)
Obs: Daca A() este de forma SEQ A1(); A2(), , An(); END, obtinem regula
compunerii secventiale generale:
Daca assert(Pi); Ai(); assert(Pi+1); i = 0, 1, , n-1, sunt programe corecte
atunci assert(P0); A0(); A1(); An-1(); assert(Pn); este program corect.

Exemplu: Fie x si y doua variabile avand valorile a si b.


Sa se interschimbe valorile fara a folosi memorie
suplimentara.
P: {x=a, y=b}
Q: {x=b, y=a}

P: {x=a,y=b}
x x+y
P1: {x=a+b, y=b}
y x-y
P2: {x=a+b, y=a}
x x-y
{x=b, y=a} => Q

27

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (9/14)


Asertiuni
Prelucrari secventiale Regula implicatiei
Obs: Utila in cazul functiilor care urmeaza a fi apelate in conditii mai tari decat
pentru cele care au fost deja testate.
Def: O proprietate P este mai tare decat proprietatea Q daca este adevarata
implicatia P -> Q
Regula se descrie astfel:
Daca assert(P); A(); assert(Q); este program corect,
Iar P1 -> P si Q1 -> Q sunt implicatii valide
Atunci assert(P1); A(); assert(Q1); este program corect.

28

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (10/14)


Asertiuni
Prelucrari conditionale - Regula instructiunilor if (IF si IFR)
Daca c este o expresie booleana, iar A() si B() sunt secvente de program,
pentru cele doua forme ale instructiunii if sunt valabile urmatoarele reguli:
IF: Daca assert(P && c); A(); assert(Q); si assert(P && !c); B(); assert(Q);
sunt secvente corecte, iar P -> Def(c) este implicatie valida,
Atunci assert(P); if (c) A(); else B(); assert(Q); este instructiune corecta.
IF redusa: Daca assert(P && c); A(); assert(Q); este secventa corecta,
Iar P && !c -> Q si P -> Def(c) sunt implicatii valide,
Atunci assert(P); if (c) A(); assert(Q); este instructiune corecta.
Notatie: Def(c) = proprietatea satisfacuta de acele elemente pentru care
evaluarea expresiei c este corecta
29

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (11/14)


Asertiuni
Prelucrari conditionale - Regula instructiunilor if (IF si IFR)
Exemple ([1])

[1] Albeanu G Programare procedurala (note de curs 2013)

30

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (12/14)


Asertiuni
Prelucrari repetitive - Regula instructiunii WHILE
Trebuie sa precizeze daca nu apare fenomenul de ciclare infinita, iar prelucrarile
sunt corecte.

O bucla este corecta daca are proprietile:


Daca se termina conduce la satisfacerea postconditiilor
- corectitudine partiala poate fi demonstrata folosind
inductia matematica sau asa numitele proprietati
invariante
Se termina dupa un numar finit de pasi.

31

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (13/14)


Asertiuni
Prelucrari repetitive - Regula instructiunii WHILE
Fie o secventa assert(P); A(); while(c) S(); assert(Q);. Presupunem ca exista o
proprietate invarianta I si o functie de terminare t cu valori numere intregi astfel
incat:
-Daca I este adevarata, atunci c este bine definita: I -> Def(c)
-I rezulta prin executia secventei A: assert(P); A(); assert(I); - instr. corecta
- La terminarea while, Q poate fi dedusa: I && !c -> Q - formula valida
- I este proprietate invarianta la executarea unei iteratii: assert(I && c); S();
assert(I); - secventa corecta
- c si I sunt adevarate => exista cel putin o iteratie de efectuat: I && c -> (t>=1)
- valoarea lui t descreste dupa executarea unei iteratii:
assert((I && c) && (t == a)); S(); assert(t<a);
In aceste conditii, secventa considerata initial este corecta.
32

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Corectitudinea algoritmilor (14/14)


Asertiuni
Prelucrari repetitive - Regula instructiunii WHILE
Exemplu ([1])

[1] Albeanu G Programare procedurala (note de curs 2013)

33

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Concluzii
1. Complexitatea algoritmilor
-

Timp de executie

Spatiu de memorie

Exemple

Notatii asimptotice

2. Corectitudinea algoritmilor
- preconditii si postconditii
- asertiuni
- etapele verificarii corectitudinii unui algoritm
34

Facultatea de Matematica si Informatica


Universitatea Bucuresti

Perspective

1. Se vor relua si in cadrul Laboratorului o parte din algoritmi si se va


discuta complexitatea si corectitudinea lor.

2. Cursul 3:
- Se va discuta despre Fundamentele Limbajelor de Programare
- Introducerea in Limbajul C

35

S-ar putea să vă placă și