Sunteți pe pagina 1din 25

Tehnici de programare 2012

ovidiu.banias@aut.upt.ro

Cuprins
Prezentare general

Cum se scrie un program?

Complexitatea algoritmilor

Curs Introductiv

Scurt prezentare curs


Curs - 14 sptmni Lurcri practice - 14 sptmni Test n primele sptmni pentru recunoaterea cursului Evaluare: Curs (tem pe parcurs + examen final) Laborator

Prezentare general

Metode de programare
Complexitatea algoritmilor Pointeri. Lucru pe biti Stiva Backtracking Recursivitate Divide at Impera Greedy Programare dinamic
Prezentare general

Bibliografie
Tudor Sorin, Tehnici de programare, Teora, 1995 Cormen T.H., Leiserson C.E., Rivest R.R., Introducere n algoritmi, Agora, 2000 Ivac C., Prun M., Bazele informaticii, Petrion, 1995 Atanasiu. A, Pintea R., Culegere de probleme pascal, Petrion, 1996 Manz. D, et. al., Informatica. Culegere de probleme rezolvate i propuse, Mirton, 2005 Ionescu C., et. al., Informatica pentru grupele de performan, Dacia Educaional, 2004 Ciocrlie H., Ciocrlie R., Tehnici de programare i structuri de date, Eurostampa, 2010

Prezentare general

Pai implementare
Analiz
nelegerea corect a cerinei problemei Verificarea constrngerilor (timp de execuie, memorie, ...)

Proiectare
n funcie de timpul alocat rezolvrii problemei (contratimp -> fr proiectare n detaliu, lucru cu compilatorul)

Implementare
Scriere cod Depanare Testare Cum se scrie un program?

Exemplu implementare
Problem: Se d un numr natural cu numr impar de cifre. Afiai numrul format dup eliminarea cifrei din mijloc multiplicat cu 37. Numrul trebuie s conin minim 3 cifre.

Pas 1. Problema impune validarea datelor de intrare? - dac da, atunci se fac toate validrile imaginate n limita timpului disponibil

Pas 2. Problema impune constrngeri de date i timp? - dac nu exist informaii ntrebm sau presupunem (alegem cazul cel mai defavorabil posibil a fi implementat n timpul alocat) - presupunem long/unsigned long suficient ca tip de dat

Cum se scrie un program?

Exemplu implementare (cont.)


Pas 3. O implementare rapid Se d un numr natural cu numr impar de cifre. Afiai numrul format dup eliminarea cifrei din mijloc multiplicat cu 37. Numrul trebuie s conin minim 3 cifre.
unsigned long n,m,x, cifre=0; cout<<"n=";cin>>n; m=n;

while (m){ //numarul de cifre cifre++; } x=pow(10,cifre/2); m=n%x; //ultimele cifre n/=10*x; //primele cifre n=n*x+m; //n fara cifra din mijloc cout<<n*37; m/=10;

Cum se scrie un program?

Exemplu implementare (cont.)


Pas 4. Testare/Depanare/Refactorizare - Programul compileaz ? - Testarea rezultatelor pentru cteva numere. Testarea valorilor la limit. Reimplementare dac e nevoie. - Se pot aduce mbuntiri? (mai e timp?) - Se poate crete domeniul de valori (unsigned long)? Crete complexitatea ? - Codul arat bine? E comentat?

Cum se scrie un program?

Identare/Notaii cod/Comentare
Identare (K&R, KNF, GNU)
+ exemple

Notaii cod
+ exemple Camel Case + exemple Hungarian

Comentare
+ exemple

Cum se scrie un program?

Stil de programare
+ aspect general + claritate/lizibilitate + modularitate + robustee

Cum se scrie un program?

Analiza algoritmilor
Problem: Se d o list de n elemente, A[1..n] i un element auxiliar x. S se gseasc indexul i, cu proprietatea c A[i]=x, 1 i n. + exemple + 2 metode

Complexitatea algoritmilor

Cutare liniar
Algoritm: LINEARSEARCH Input: vector A[1..n] de n elemente i un element x. Output: i dac x = A[i], 1 i n, i 0 n caz contrar.

1. i 1 2. while (i < n) and (x A[i]) 3. i i+1

4. end while 5. if (x = A[i]) then return i else return 0

+ cte compara ii minim? + cte compara ii maxim? Complexitatea algoritmilor

Cutare binar
Algoritm: BINARYSEARCH Input: vector A[1..n] de n elemente sortate cresctor i un element x. Output: j if x = A[j], 1 j n, i 0 n caz contrar. Observa ie: fie li i lf doi indexi ai vectorului A[1..n], reprezentnd limita ini ial i respectiv limita superioar a unui subvector A[li..lf]. Se observ c A[li] A[(li+lf)/2] A[lf] Rezolvare: la fiecare pas se va mpr i intervalul n jumtate i elementul x se va cuta n doar unul din cele dou intervale de indexi A[li..(li+lf)/2] i A[(li+lf)/2+1..lf], n func ie de valoarea A[(li+lf)/2] . + cte compara ii minim? cte compara ii maxim? Complexitatea algoritmilor

Cutare binar (cont.)


Algoritm: BINARYSEARCH exemplificare (element cutat x=37)

Index (i) A[1..10]


+ li=1, lf=10

1 3

2 7

3 12

4 21

5 25

6 26

7 27

8 29

9 37

10 39

+ pas 1: k=[(li+lf)/2] = 5 + pas 2: se ob in 2 intervale [1..5] i [6..10] + pas 3: pt. c A[k]=25 < 37 se alege intervalul A[6..10] + pas 4: li=6, lf=10, repeta pasul 1 pn (li==lf) sau A[k]=x Complexitatea algoritmilor

Cutare binar (cont.)


Algoritm: BINARYSEARCH exemplificare (element cutat x=37)

Index (i) A[6..10]

6 26

7 27

8 29

9 37

10
k=8, (A[k]=29)<37 A[8..10]

39

Index (i) A[8..10]

6 26

7 27

8 29

9 37

10
k=9, A[k]=37 OK

39

Complexitatea algoritmilor

Cutare binar (cont.)


Algoritm: BINARYSEARCH pseudocod

1. li 1; lf n; 2. while (li lf) 3. 4. 5. 6. 7. end while 8. return 0 k [(li + lf) / 2] if (x = A[k]) then return 1 else if (x < A[k]) then lf k-1 else li k+1

+ dup fiecare pas i, numrul de elemente se njumtete: pas i + la ultimul pas,

n = 1 i = log 2 n + 1 2i 1
Complexitatea algoritmilor

n elemente i 1 2

Ordinul/rata de cretere a unui algoritm


+ timpul de execuie a unui algoritm este o funcie de dimensiunea datelor de intrare

Rata de cretere
100 90 80 70 timp (ms) 60 50 40 30 20 10 0 0 5 10 15 20 25 30 date de intrare (n) log n cn nlog n cn^2 cn^3

+ +

f (n) = n3 + n2

f (n) = n logn + n + 3

+ cu ct n crete cu att scade importana termenilor de grad inferior

Complexitatea algoritmilor

Ordinul/rata de cretere a unui algoritm


n
O( log n ) O( n ) O( n log n ) O( n )
2

O( n )

O (2 )

27 = 128 28 = 256 210 = 1024 212 = 4096

0.007 s 0.008s

0.128s 0.256s 1s

0.89s 2s 10s

16s
65s

2ms
16ms

1031 ani
1069 ani

0.01s
0.012s 0.02s

1ms 16ms 18.3 min

1sec 68 sec 37ani

10300 ani
101221 ani

4s 1ms

49s
20 sec

2 20

10314565 ani

Operaii elementare:

(i) adunare, scadere, nmulire i mprire (ii) comparaii i operatori logici (iii) atribuiri Complexitatea algoritmilor

Notaii asimptotice

Notaii

- limita superioar - lim. inf. = lim. sup. - limita inferioar

Complexitatea algoritmilor

Notaii asimptotice O
Definiie:

f (n), g (n) : R
( not )

spunem c f (n) = O( g (n)) dac n0 i c = const. a.. n n0 , f (n) cg (n).

Fie f ( n ) = 2 n 3 + 10 n 2 + 2 , n 1 f ( n ) 12 n 3 f ( n ) = O ( n 3 ), pt. c n 0 = 1 i c = 12 a.. n n 0 , f ( n ) cg ( n ).


Complexitatea algoritmilor

Notaii asimptotice O

Complexitatea algoritmilor

Notaii asimptotice O
( 1 ) O(log n) O ( n) O(n ) O(n c ) O (c n ) O(n!)
2

= constant = logaritmic = liniar = patratic = polinomial = expontial = factorial

O(n log n) = supraliniar

c - constanta
Complexitatea algoritmilor

Notaii asimptotice

Definiie: Fie f (n), g (n) : R

( not )

spunem c f (n) = ( g (n)) dac n0 i c = const. a.. n n0 , f (n) cg (n).


( not )

spunem c f (n) = ( g (n)) dac n0 i c1 , c2 = const. a.. n n0 , c1 g (n) f (n) c2 g (n).


Complexitatea algoritmilor

Complexitate P/NP/NP-complet
Algoritmi deterministici Algoritmi nondeterministici P = Polinomial NP = Nondeterministic Polinomial NP-complet NP complet NP P

P NP
Complexitatea algoritmilor