Sunteți pe pagina 1din 29

C7 / 16.11.

2012

8. Analiza Algoritmilor
Corectitudine Eficien Posibilitate de mbuntire Alte caliti

Complexitatea algoritmilor Documentarea programelor Inspectare Testare si depanare Verificare si validare Stil in programare
1/29

Complexitatea Algoritmilor
Ne intereseaz s comparm ntre ei mai muli algoritmi care rezolv aceeai problem, despre care tim c sunt coreci, preciznd care dintre acetia este mai bun. Putem compara doi algoritmi n funcie de : - cantitatea de memorie necesar; - viteza de lucru, deci timpul necesar rezolvrii problemei. Timpul necesar execuiei unui program depinde de numrul operaiilor ce trebuiesc executate, care depinde de datele de intrare, deci se schimb de la o execuie la alta. Exist ns un cel mai ru caz, pentru acele date de intrare pentru care numrul operaiilor efectuate este maxim. n acest caz vorbim de complexitate n cel mai ru caz. De asemenea, putem vorbi de numrul mediu de operaii efectuate ntr-o execuie. Dac numrul execuiilor posibile este finit atunci acest numr mediu este egal cu numrul operaiilor efectuate n toate execuiile, mprit la numrul execuiilor complexitate medie.
2/29

Calculul complexitatii
Complexitatea msoar eficiena unui algoritm din punct de vedere al vitezei de lucru, deci a timpului necesar rezolvrii unei probleme, care depinde de numrul operaiilor necesare, iar acesta depinde de volumul datelor de intrare. Putem determina complexitatea a) n cel mai ru caz (numrul operaiilor este maxim), sau b) medie (nr. operaiilor pentru toate variantele posibile / nr. total de posibiliti). Pentru un algoritm care are domeniul D i datele de intrare dD, dac notm cu nd numrul de operaii efectuate, i cu pd probabilitatea de a alege setul d, vom defini complexitatea Cr = Max nd a) n cel mai ru caz : b) medie :
Cm = pd . nd dD dD

n general este suficient s determinm ordinul de mrime al complexitii n funcie de numrul datelor de intrare (n). Se spune c o complexitate C este de ordinul nk i se noteaz aceasta cu O(nk), dac exist dou constante c1, c2 pentru care: c1 . nk < C < c2 . nk .
3/29

Cutare, Sortare, Interclasare


Cutarea i Sortarea sunt dou dintre cele mai des ntlnite subprobleme n programare. Ele constituie o parte esenial din numeroasele procese de prelucrare a datelor. Operaiile de cutare i sortare sunt executate frecvent de ctre oameni n viaa de zi cu zi, ca de exemplu cutarea unui cuvnt n dicionar sau cutarea unui numr n cartea de telefon. Cutarea este mult simplificat dac datele n care efectum aceast operaie sunt sortate (ordonate, aranjate) ntr-o anumit ordine (cuvintele n ordine alfabetic, numerele n ordine cresctoare sau descresctoare). Sortarea datelor const n rearanjarea coleciei de date astfel nct un cmp al elementelor coleciei s respecte o anumit ordine. De exemplu n cartea de telefon fiecare element (abonat) are un cmp de nume, unul de adres i unul pentru numrul de telefon. Colecia aceasta respect ordinea alfabetic dup cmpul de nume. Dac datele pe care dorim s le ordonm, adic s le sortm, sunt n memoria intern, atunci procesul de rearanjare a coleciei l vom numi sortare intern, iar dac datele se afl ntr-un fiier (colecie de date de acelai fel aflate pe suport extern), atunci procesul l vom numi sortare extern. Fiecare element al coleciei de date se numete articol iar acesta la rndul su este compus din unul sau mai multe componente. O cheie C este asociat fiecrui articol i este de obicei una dintre componente. Spunem c o colecie de n articole este ordonat cresctor dup cheia C dac C(i) C(j) pentru 1i<jn, iar dac C(i) C(j) atunci este ordonat descresctor.
4/29

Cutare
Vom prezenta cteva tehnici elementare de cutare i vom presupune c datele se afl n memoria intern, ntr-un ir de articole. Vom cuta un articol dup un cmp al acestuia pe care l vom considera cheia de cutare. n urma procesului de cutare va rezulta poziia elementului cutat (dac acesta exist). Notnd cu k1, k2, ...., kn cheile corespunztoare articolelor i cu a cheia pe care o cutm, problema revine la a gsi (dac exist) poziia p cu proprietatea a = k p. De obicei articolele sunt pstrate n ordinea cresctoare a cheilor, deci vom presupune k1 < k2 < .... < kn . Uneori este util s aflm nu numai dac exist un articol cu cheia dorit ci i s gsim n caz contrar locul n care ar trebui inserat un nou articol avnd cheia specificat, astfel nct s se pstreze ordinea existent.
5/29

Problema Cutrii
Problema cutrii are urmtoarea specificaie: Date a,n,(ki, i=1,n); Rezultate p; unde: p= 1 i n+1 { nN, n 1 i k1 < k2 < .... < kn } dac dac dac a k1 , i{2, 3, ... , n} : ki-1 < a ki , a > kn . { p = poziia de inserare }

Pentru rezolvarea acestei probleme vom descrie mai muli subalgoritmi. O prim metod este cutarea secvenial: Subalgoritmul CautSecv(a,n,K,p) este: CautSecv Fie p:=1; Cttimp pn i a>kp execut p:=p+1 sfct sf-CautSecv.
6/29

O alt metod, numit cutare binar, care este mult mai eficient, utilizeaz metoda divide et impera. Se determin n ce relaie se afl cheia articolului aflat n mijlocul coleciei cu cheia de cutare. n urma acestei verificri cutarea se continu doar ntr-o jumtate a coleciei. n acest mod, prin njumtiri succesive se micoreaz volumul coleciei rmase pentru cutare. Cutarea binar se poate realiza prin apelul funciei BinarySearch(a,n,K,1,n), descris mai jos, folosit n subalgoritmul dat n continuare. Subalgoritmul CautBin(a,n,K,p) Este: CautBin Dac ak1 Atunci p:=1 Altfel Dac a>kn Atunci p:=n+1 Altfel {ki-1<a ki} p:=BinarySearch(a,K,1,n) Sfdac Sfdac Sf-CautBin. Funcia BinarySearch (a,K,St,Dr) Este: Dac StDr Atunci m:=(St+Dr) Div 2; Dac a=Km Atunci BinarySearch:=m Altfel Dac a<Km Atunci BinarySearch:= BinarySearch(a,K,St,m-1) Altfel { a>Km} BinarySearch:= BinarySearch(a,K,m+1,Dr) { St>Dr} Altfel BinarySearch:=St Sf-BinarySearch.
7/29

n funcia BinarySearch descris mai sus, variabilele St i Dr reprezint capetele intervalului de cutare, iar m reprezint mijlocul acestui interval. Prin aceast metod, ntr-o colecie avnd n elemente, rezultatul cutrii se poate furniza dup cel mult log2n comparri. Deci complexitatea n cel mai ru caz este direct proporional cu log2n. Fr a insista asupra demonstraiei, menionm c ordinul de mrime al complexitii medii este acelai. Se observ c funcia BinarySearch se apeleaz recursiv. Se poate nltura uor recursivitatea, aa cum se poate vedea n urmtoarea funcie: Funcia BinarySearch (a,K,St,Dr) Este: Repet m:=(St+Dr) Div 2; Dac a=Km Atunci BinarySarch:=m Altfel Dac a<Km Atunci Dr:=m-1 Altfel { a>Km } St:=m+1 PnCnd (St>Dr) Sau (a=Km); Dac St>Dr Atunci BinarySarch:=St Complexitatea Sf-BinarySearch.
Algoritmul
n cel mai ru caz medie

Complexitatea acestor algoritmi de cutare este dat n tabelul alturat :

CautSecv CautBin

O(n) O(log2n)

O(n) O(log2n)

8/29

Sortare intern
Prin sortare intern vom nelege o rearanjare a unei colecii aflate n memoria intern astfel nct cheile articolelor s fie ordonate cresctor (eventual descresctor). Problema de sortare intern revine la ordonarea (rearanjarea) cheilor K=(k1,k2,...,kn) astfel nct k1k2... kn .

Selection Sort
O prim tehnic numit "Selecie" se bazeaz pe urmtoarea idee: se determin poziia elementului cu cheie de valoare minim (respectiv maxim), dup care acesta se va interschimba cu primul element. Acest procedeu se repet pentru subcolecia rmas, pn cnd mai rmne doar elementul maxim. Deci la fiecare pas i = 2, 3, ... , n-1 se va obine subirul k1 , k2 , ... , ki corect aranjat (aa cum aa cum trebuie s fie n poziia final) punnd pe poziia i elementul minim km (respectiv maxim) din subirul ki , ki+1 , ... , kn. Dup ce i elementul kn-1 este completat corect irul va fi ordonat (implicit i ultima poziie va fi corect).
9/29

Selection Sort Subalgoritmul de ordonare prin selecie este urmtorul: Subalgoritmul Selectie (n,K) este: Pentru i:=1, n-1 execut { Completeaz corect fiecare poziie i = 1, 2 ,... , n-1 } Fie m:=i; { m = poziia elementului minim din subirul ki , ki+1 , ... , kn } Pentru j:=i+1; n execut Dac kj < km atunci m:=j sfdac sfpentru Dac i<m atunci v:=ki; ki:=km; km:=v sfdac {Interschimb ki cu km } sfpentru sf-Selectie. Se observ c numrul de comparri este : (n-1)+(n-2)+...+2+1 = n(n-1)/2 indiferent de natura datelor. Deci complexitatea medie, dar i n cel mai ru caz este O(n2).
10/29

Insertion Sort
O alt posibilitate const n parcurgerea cheilor cu ordonare parial: ntotdeauna poriunea parcurs rmne ordonat. Deci cheia la care am ajuns va fi inserat n secvena parcurs astfel ca aceasta s-i pstreze proprietatea de ordonare. Deci la fiecare pas i = 2, 3, ... , n se va obine subirul k1 , k2 , ... , ki ordonat cresctor insernd elementul de pe poziia i n subirul k1 , k2 , ... , ki-1 (care este ordonat cresctor de la pasul precedent) astfel nct i acest subir s rmn ordonat cresctor. Elementul ki care trebuie pus pe poziia corect p se reine ntr-o variabil temporar v pentru a putea muta spre dreapta (cu o poziie) toate elementele mai mari dect el. Pe locul rmas liber (p=poziia cutat) se va depune v obinnd astfel ordinea dorit n subirul k1,k2,...,kn adic k1k2... kn. Evident c la ultimul pas (i=n), dup ce i kn va fi inserat corect se va obine k1k2... kn deci tot irul va fi ordonat.
11/29

Insertion Sort Obinem un al doilea algoritm de sortare, numit Inserie: Subalgoritmul Insertie (n,K) este: Pentru i:=2, n execut Fie v:=ki; p:=i-1; Cttimp p>0 i kp >v execut kp+1 := kp ; p:=p-1 sfct ; kp+1:=v sfpentru sf-Inserie. Algoritmul prezentat mai sus va executa n cel mai nefavorabil caz n(n-1)/2 comparri i mutri, iar n cazul cel mai favorabil, cnd irul este ordonat va executa 2(n-1) mutri i n-1 comparri, ceea ce nseamn c acest algoritm are complexitatea O(n2).
12/29

Bubble Sort
A treia metod care va fi prezentat, numit "BubbleSort", compar dou cte dou elemente consecutive iar n cazul n care acestea nu se afl n relaia dorit, ele vor fi interschimbate. Procesul de comparare se va ncheia n momentul n care toate perechile de elemente consecutive sunt n relaia de ordine dorit. Subalgoritmul BubbleSort (n,K) este: t:=1; {Traversarea t =1 (urmeaz prima traversare) } Repet Fie Sortat:=True; {Ipoteza "este sortat"} Pentru i:=1, n-t execut Dac ki-1 > ki atunci v := ki; ki := ki+1; ki+1:=v; { Interschimb ki cu ki+1 : kiki+1 } Sortat:=False {Nu a fost sortat } sfdac sfpentru; t:=t+1 pncnd Sortat {Este sortat} sf-BubbleSort. Acest algoritm execut n cel mai nefavorabil caz (n-1)+(n-2)+ ... +2+1 = n(n-1)/2 comparri, deci complexitatea lui este O(n2).
13/29

Quick Sort
O metod mai performant de ordonare, prezentat n continuare, se numete QuickSort i se bazeaz pe tehnica divide et impera. Metoda este prezentat sub forma unei proceduri care realizeaz ordonarea unui subir precizat prin limita inferioar (St) i limita superioar (Dr) a indicilor acestuia. Apelul procedurii pentru ordonarea ntregului ir este : QuickSort(K,1,n), unde n reprezint numrul de articole ale coleciei date este: Cheam QuickSort(K,1,n); ,n Procedura QuickSort (K,St,Dr) va realiza ordonarea subirului kSt,kSt+1,...,kDr. Acest subir va fi rearanjat astfel nct kSt s ocupe poziia lui final (cnd irul este ordonat). Dac p este aceast poziie, irul va fi rearanjat astfel nct urmtoarea condiie s fie ndeplinit: ki kp kj, pentru: St i < p < j Dr. Odat realizat acest lucru (adic toate elementele mai mici dect kp se afl n stnga i cele mai mari n dreapta), n continuare va trebui doar s ordonm subirul kSt,kSt+1,...,kp-1 prin apelul recursiv al procedurii QuickSort(K,St,p-1) i apoi subirul kp+1,...,kDr prin apelul QuickSort(K,p+1,Dr) ,Dr . Ordonarea efectiv a acestui subir este necesar doar dac acesta conine cel puin dou elemente (un subir avnd mai puin de doua elemente este deja ordonat).
14/29

Quick Sort Procedura QuickSort este prezentat n continuare : Subalgoritmul QuickSort (K,St,Dr) Este: { Pune KSt pe poziia final p } Dac St<Dr Atunci p:=Split (K,St,Dr); Cheam QuickSort(K,St,p-1); Cheam QuickSort(K,p+1,Dr) Sfdac Sf-QuickSort. Funcia Split (K,St,Dr) Este: Fie i:=St; j:=Dr; v:=ki; Cttimp i<j Execut Cttimp i<j i v kj Execut j:=j-1 Sfct ; {Elelentele mai mari rmn n dreapta} ki:= kj; {Elementul mai mic se mut n stnga} Cttimp i<j i ki v Execut i:=i+1 Sfct ; {Elementele mici rmn n stnga} kj:= ki {El. mai mare se mut n dreapta} Sfct; {i=p=j} Fie ki := v; Split:=i; Sf-Split. Complexitatea algoritmului prezentat este O(n2) n cel mai nefavorabil caz, dar complexitatea medie este de ordinul O(nLog2n).
15/29

Tree Sort
Un alt algoritm performant pentru sortare intern este "Tree Sort" (sortare arborescent) care se bazeaz pe construirea unui arbore binar ordonat. Arborele binar ordonat are proprietatea c n orice subarbore, subarborele stng al acestuia conine articole cu chei mai mici dect cheia coninut n rdcin, iar subarborele drept conine chei mai mari dect rdcina. Prin parcurgerea n inordine a arborelui astfel construit elementele vor fi n ordine cresctoare. Construirea unui astfel de arbore se va realiza prin adugri succesive ale elementelor de sortat n subarborele stng sau drept dup cum cheia articolului care se adaug este mai mic respectiv mai mare dect cheia aflat n rdcina subarborelui n care se efectueaz adugarea. Complexitatea acestor algoritmi de sortare este dat n tabelul care alturat:
Complexitatea Algoritmul Selecie Inserie Bubblesort QuickSort n cel mai ru caz O(n2) O(n2) O(n2) O(n2) medie O(n2) O(n2) O(n2) O(n*log2n) 16/29

Counting Sort
Algoritmul Sortare prin Numrare realizeaz ordonarea unui ir x1, x2, ..., xn avnd termenii dintr-o mulime finit {0, 1, ... ,M} ( 0 xi M, i=1,n ). Acest algoritm pstreaz ordinea dat pentru elementele nedistincte (Dac xi reprezint chei de ordonare neunice, de exemplu notele unor studenti {1, 2, ... , 10} ). Algoritmul calculeaz poziia pe care se va afla fiecare element prin numrarea valorilor mai mici sau egale dect acesta. Subalgoritmul este urmtorul:
Subalgoritmul Sort_Num (X,n) este: Pentru j:=0, m Execut Pj := 0 Sf_Pentru; { Iniializeaz Pj = frecvena valorii j } Pentru i:=0, n Execut Pxi := Pxi + 1 Sf_Pentru; { Det. Pxi = frecv. Val. xi (*)} Pentru j:=1, m Execut Pj := Pj + Pj-1 Sf_Pentru;{ Recalc. Pj=frecv. Val. j (**)} Pentru i:= n,1,-1 Execut { Se trav. invers pentru a pstra ord. elem. egale} yPxi := xi ; { Depune elementul xi n irul Y pe poziia corect Pxi } Pxi := Pxi - 1 { Pregtete urmtoarea poziie pentru un element egal cu xi } Sf_Pentru; { Depune n irul X irul ordonat din vectorul temporar Y } X:=Y Sf- Sort_Num. 17/29

Counting Sort Calitatea acestui algoritm const n complexitatea lui: O(Max(m,n)), deci pentru noi este important volumul de date, deci practic complexitatea este O(n). Evident c nu putem ordona astfel orice ir ci doar iruri pentru care mulimea valorilor cheilor este finit. De exemplu, pentru o ordonare dup medii vom avea limita M=1000 (media a.bc se va numra la abc). Pentru a renuna la irul temporar Y se va interschimba fiecare element cu elementul de pe poziia corect (final). Elementul xi este completat corect dac i=Pxi (i este poziia iniial iar Pxi este poziia final, egal cu numrul de elemente mai mici sau egale dect xi (**)). n tabelul urmtor se poate vedea modificarea direct a vectorului X (prin interschimbri succesive pn se ajunge la forma final ordonat):
i 1 X 2 2 2 2 2 2 7 7 7 3 3 3 3 3 3 3 3 4 9 5 5 5 5 5 3 3 3 7 7 6 5 9 9 9 9 18/29

Merge Sort
Un ultim algoritm care va fi prezentat se numete "Merge Sort" (sortare prin interclasare) i se bazeaz pe tehnica "divide et impera". irul ce urmeaz a fi ordonat se mparte n dou subiruri care se ordoneaz, dup care acestea se vor interclasa obinndu-se ntregul ir ordonat. Fiecare subir se va ordona tot prin desprirea lui n dou subiruri urmat de interclasare i aa mai departe pn cnd ordonarea unui subir se poate rezolva elementar fr a mai fi necesar desprirea lui n alte dou subiruri (lungimea subirului este cel mult 2). Algoritmul corespunztor este prezentat n paragraful urmtor apelnd o procedur recursiv care ordoneaz un subir preciznd limitele acestuia astfel: : Subalgoritmul MergeSort (A,St,Dr) este: {Sort. prin intercl. intercl a elem. ASt,ASt+1,...,ADr} Dac St < Dr atunci Fie m:=(St+Dr) Div 2; { m:=Split(A,St,Dr)} Cheam MergeSort (A,St,m); {OrdoneazASt,...,Am } Cheam MergeSort (A,m+1,Dr); {OrdoneazAm+1,...,ADr } Cheam Interclasare (A,St,m, A,m+1,Dr, A,St,Dr); {Combin rezultatele} sfdac sf- MergeSort .
19/29

Interclasare
Fiind date dou colecii de date, ordonate cresctor (sau descresctor) dup o cheie, se cere s se obin o colecie care s fie de asemenea ordonat cresctor (respectiv descresctor) dup aceeai cheie i care s fie format din articolele coleciilor date. Acest lucru se poate obine direct (fr o sortare a coleciei finale) prin parcurgerea secvenial a celor dou colecii, simultan cu generarea coleciei cerute. Prin compararea a dou elemente din listele de intrare se va decide care element va fi adugat n lista de ieire. Deci ne intereseaz un algoritm de rezolvare a urmtoarei probleme: Se d un ir X ordonat cresctor (x1x2...xm ) i un ir Y de asemenea ordonat cresctor (y1y2... xn). Se cere irul Z ordonat cresctor (z1z2....zm+n) format din termenii irului X i Y. O soluie posibil ar fi depunerea componentelor vectorului X i a componentelor vectorului Y n vectorul Z, urmat de ordonarea vectorului Z obinnd rezultatul dorit. Acest algoritm este ineficient deoarece la o singur traversare a vectorilor X i Y se poate obine vectorul Z aa cum se poate vedea n urmtorul algoritm (de interclasare).
20/29

Subalgoritmul Interclasare(m,X,n,Y,k,Z) este: {X are m componente ord. cresctor}


{La fel Y cu n componente. } Fie i:=1; j:=1; k:=0; { Cele m+n valori se depun n Z ordonate cresctor } Cttimp (im) i (jn) execut {Exist comp. n X i n Y } Dac xiyj Atunci Cheam Pune(i,xi,k,Z) { xi zk } Altfel Cheam Pune(j,yj,k,Z) { yj zk }

Sfdac Sfct; Cttimp (im) Execut Cheam Pune(i,xi,k,Z) Sfct; {Mai exist comp. n X } Cttimp (jn) Execut Cheam Pune(j,yj,k,Z) Sfct; {Mai exist comp. n Y } Sf-Interclasare. Aici s-a folosit subalgoritmul Pune(ind,val,k,Z) care pune n vectorul Z valoarea v i mrete indicele i cu 1, subalgortim dat n continuare. {Adaug val n vectorul Z cu k componente } Subalgoritmul Pune(i,v,k,Z) Pune(i,v,k,Z este: k:=k+1; { i mrete ind cu 1 } zk:=v; i:=i+1 Sf-Pune.
21/29

Subalgoritmul de sortare bazat pe interclasare se poate vedea n continuare . Subalgoritmul Sortare_Prin_Interclasare(n,K) este: {Sortare prin interclasare} Cheam MergeSort (K,St,Dr); sf-SortInter.
Subalgoritmul MergeSort (A,St,Dr) este: {Sortare prin interclasare a elementelor ASt,ASt+1,...,ADr} Dac St < Dr atunci Fie m:=(St+Dr) Div 2; { m:=Split(A,St,Dr)} Cheam MergeSort (A,St,m); {OrdoneazASt,...,Am } Cheam MergeSort (A,m+1,Dr); {OrdoneazAm+1,...,ADr } Cheam Interclasare (A,St,m, A,m+1,Dr, A,St,Dr); {Combin rezultatele} sfdac sf- MergeSort. Subalgoritmul Interclasare (X,i,m, Y,j,n, Z,p,k) este: { Interclasare } Fie k:=p-1; Cttimp (im) i (jn) execut {Exist comp. n X i n Y} Dac xiyj Atunci Cheam Pune(i,xi,k,Z) { xi zk } Altfel Cheam Pune(j,yj,k,Z) { yj zk } Sfdac Sfct; Cttimp (im) Execut Cheam Pune(i,xi,k,Z) Sfct {Mai exist componente n X } {Mai exist componente n Y } Cttimp (jn) Execut Cheam Pune(j,yj,k,Z) Sfct sf-Inter . 22/29

Sortare extern
O problem cu care ne confruntm adesea este sortarea unei colecii de date aflate pe un suport extern, extern de volum relativ mare fa de memoria intern disponibil. n aceast seciune o astfel de colecie de date o vom numi fiier. n acest caz nu este posibil transferul ntregii colecii n memoria intern pentru a fi ordonat i apoi din nou transferul pe suport extern. Dac datele ce urmeaz a fi sortate ocup un volum de n ori mai mare dect spaiul de memorie intern de care dispunem, atunci colecia se va mpri n n subcolecii ce vor fi transferate succesiv n memoria intern, se vor sorta pe rnd i vor fi stocate din nou pe suportul extern sortate. Din acest moment prin operaii de interclasare dou cte dou se pot obine colecii de dimensiuni superioare pn se obine toat colecia ordonat. La aceste interclasri, pentru a efectua un numr ct mai mic de operaii de transfer se recomand interclasarea coleciilor de dimensiuni minime, apoi din datele obinute din nou vor fi alese dou colecii de dimensiuni minime i aa mai departe pn se obine o singur colecie care va fi colecia cerut, adic sortat. Sortarea extern presupune parcurgerea a dou etape importante: a) mprirea fiierului de sortat F, n n fiiere H1,H2,...,Hn i sortarea intern a acestora; b) Interclasarea fiierelor de dimensiuni minime rezultnd un alt fiier ordonat, operaie care se repet de n-1 ori pentru a ajunge la fiierul dorit G.
23/29

Documentarea programelor
n paralel cu elaborarea programului trebuie elaborat i o documentaie. Aceasta va conine toate deciziile luate n crearea programului. Documentarea este activitatea de prezentare a programului celor care vor fi interesai s obin informaii despre el. Acetia sunt n primul rnd persoanele care au realizat programul, apoi persoanele care-l vor folosi i persoanele solicitate s fac ntreinerea acestuia. Rezult de aici c avem dou tipuri de documentaie: - documentaie de realizare, - documentaie de utilizare . Documentaia de realizare trebuie s redea n cele mai mici detalii modul n care a fost realizat programul. Adeseori se ntlnesc programe fr nici o alt documentaie n afara textului propriu-zis al programului. n graba de a termina ct mai repede, programul nu este nsoit de nici o documentaie i frecvent nu sunt folosite nici comentarii n textul programului.
24/29

Documentarea programelor Sigur c nsi textul programului constituie o autodocumentare. Iar comentariile prezente n program dau explicaii suplimentare despre program. Este ns necesar o documentaie complet, scris, care va conine documentaia de realizare, ce const din: - enunul iniial al problemei; - specificaia; - documentaia de proiectare (metoda de rezolvare aleas i proiectarea algoritmilor folosii. Pentru fiecare algoritm va fi prezentat subproblema corespunztoare, cu specificaia ei i rolul fiecrei variabile); - documentaia de programare, care va include textul programului; - datele de test folosite; - modificri fcute n timpul ntreinerii programului, i documentaia privind exploatarea programului. O prim documentaie a oricrui program este textul surs propriu-zis. Este bine ca acest text s poat fi citit ct mai uor, iar comentariile dau informaii suplimentare despre program, constituie o autodocumentare a programului. Referitor la autodocumentare, folosirea comentariilor, alegerea cu grij a denumirii variabilelor, ct i claritatea textului, obinut prin indentare i grij asupra structurii programului, este util nu numai pe timpul elaborrii programului, dar mai ales pe timpul ntreinerii i modificrilor ulterioare.
25/29

Documentarea programelor

Denumirea variabilei s fie astfel aleas nct s reflecte semnificaia ei. Se recomand i scrierea cuvintelor cheie cu litere mari pentru a le diferenia de celelalte denumiri din program. Comentariile vor fi prezente: - n capul programului, pentru a prezenta titlul i scopul programului, perioada realizrii lui i numele programatorului; - n definiii, pentru a descrie semnificaia notaiilor folosite (a variabilelor, constantelor, subalgoritmilor, etc); - n dreapta unor instruciuni, pentru a descrie rolul acestora, sau cazul n care se atinge acea instruciune; - ntre prile unui modul mai lung, pentru a explica rolul fiecrei pri. Comentariile sunt recomandate, fiind un mijloc de autodocumentare a programului surs. Este ns nevoie i de o documentaie nsoitoare scris, care constituie documentarea propriu-zis a programului. Aceasta trebuie s redea toate deciziile fcute n timpul proiectrii, s prezinte diagrama de structur a ntregului produs i fiecare parte separat. Pentru fiecare modul documentaia va conine: numele acestuia, datele de intrare, datele de ieire, funcia realizat de modulul respectiv, variabilele folosite i semnificaia lor, algoritmul propriu-zis.
26/29

Documentarea programelor

documentaia de Utilizare

Este necesar i o documentaie de folosire a produsului realizat. Beneficiarul nu este interesat de modul n care a fost realizat programul ci de modul n care l poate folosi. Menionm c cele mai recente produse realizate de firmele consacrate au, pe lng documentaia scris, i o autodocumentaie (funcii HELP). O documentare complet a unui program poate fi util nu numai pentru folosirea i ntreinerea programului. Componente ale unui produs existent pot fi utile i n realizarea altor produse. Este ns necesar s se neleag ct mai uor ce funcii realizeaz aceste componente i cu ce performane. Folosirea acestor componente existente, testate i documentate, duce evident la creterea productivitii n realizarea noului produs.

27/29

Tema:

Ce linie i ce coloan se pot tia dintr-o matrice data, astfel nct suma elementelor rmase s fie maxim?

Exemplu: Exemplu: Exemplu


22 66 66 55 55 55 11 33 44 99 77 88 22 22 66 22

Contraexemplu: Contraexemplu:
2 6 6 6 6 5 5 2 5 5 5 1 1 3 3 5 4 9 9 7 7 8 8 4 2 2 2 6 6 2 2 2 11 20 20 14 14 16 16 11
||

Osolu solu ie(2,1) (2,1) :: O ie

19 17 19 17 14 9 14 9 28 24 28 24 12 ---> -12 > -minlc max= max= 50! 50! min lc

SumaMax.= Max.=51 51 Suma 00 66 66 55 00 00 00 00 00 99 77 88 00 22 66 22


MatriceaA: A: Matricea 77 55 55 88 99 11 11 44 44 55 22 11 11 33 77 11

Suma max.= max.= 50! 50! Suma 0 6 6 6 6 5 5 0 0 5 5 1 1 3 3 0 0 9 9 7 7 8 8 0 0 0 0 0 0 0 0 0


SumaMax.= Max.=44 44 Suma 77 55 00 88 99 11 00 44 44 55 00 11 00 00 00 00 Sumamax.= max.=43 43 Suma 77 00 55 88 99 00 11 44 00 00 00 00 11 00 77 11

17% 83%

28/29

Tema:
Ce linie i ce coloan se pot tia dintr-o matrice data, astfel nct suma elementelor rmase s fie maxim?
typedef int Mat[10][10]; typedef int Mat[10][10]; void Gen(Mat a, int& n) void { Gen(Mat a, int& n) { n=random(4)+4; n=random(4)+4; for (int i=1; i<=n; i++) for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) for (int j=1; j<=n; j++) a[i][j]=random(9)+1; a[i][j]=random(9)+1; } }

void main () void main () { clrscr(); randomize(); { clrscr(); randomize(); Mat a,b,c; int n,Sa,Sb, Nt=10000, Ce=0; Mat a,b,c; int n,Sa,Sb, Nt=10000, Ce=0; for (int t=1; t<=Nt; t++) { for (int t=1; t<=Nt; t++) { Gen(a,n); Gen(a,n); Sa=Alb(a,b,n); Sa=Alb(a,b,n); Sb=L_c(a,c,n); Sb=L_c(a,c,n); if (Sa!=Sb) { Ce++; if (Sa!=Sb) { Ce++; g << endl <<" Matricea A:"<< endl; Tipf(a,n); gg <<<< endl <<" " Matricea A:"<< endl; Tipf(a,n); Suma Max.= "<<Sa<<endl; Tipf(b,n); gg <<<< "" Suma Max.= "<<Sa<<endl; Suma max.= "<<Sb<<endl; Tipf(b,n); Tipf(c,n); g << " Suma max.= "<<Sb<<endl; Tipf(c,n); } }} } if (!Ce) cout << " Ok dupa " << Nt << " teste." << endl; if (!Ce) <<<< "" Ok dupa " << Nt << "<<Ce<<" " teste." << "<<Nt<<endl; endl; else cout cout See ContraEx.Txt din else cout << " See ContraEx.Txt "<<Ce<<" din "<<Nt<<endl; g.close(); g.close(); getche(); getche(); } } ofstream g("ContraEx.Txt"); ofstream g("ContraEx.Txt"); void Tipf(Mat a, int n) void { Tipf(Mat a, int n) { for (int i=1; i<=n; i++) { g << endl; for (int i=1; i<=n; i++) { g << endl; for (int j=1; j<=n; j++) for g (int j=1; j<=n; j++) << setw(3)<<setfill(' ')<<a[i][j]; g << g setw(3)<<setfill(' } << endl << endl; ')<<a[i][j]; g << endl << endl; } } }

int Alb (Mat a, Mat b, int n) int { Alb (Mat a, Mat b, int n) { int s,sij, sm=0,im=0,jm=0; int X[10],Y[10]; int s,sij, sm=0,im=0,jm=0; int X[10],Y[10]; s=Sum(a,n); SumCol(a,n,X); SumLin(a,n,Y); s=Sum(a,n); SumCol(a,n,X); for (int i=1; i<=n; i++) SumLin(a,n,Y); for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) { for (int j=1; j<=n; j++) { sij=s-Y[i]-X[j]+a[i][j]; sij=s-Y[i]-X[j]+a[i][j]; if (sij>sm) { sm=sij; im=i; jm=j; } } if (sij>sm) { sm=sij; im=i; jm=j; } } Mut(a,b,n); Mut(a,b,n); Lin(b,n,im);Col(b,n,jm); Lin(b,n,im);Col(b,n,jm); return sm; return sm; } }

int L_c (Mat a, Mat c, int n) int { L_c (Mat a, Mat c, int n) { int im, jm, Sl[10], Sc[10]; int im, jm, Sl[10], Sc[10]; Mut(a,c,n); Mut(a,c,n); SumLin(c,n,Sl); Lin(c,n,Pm(Sl,n)); SumLin(c,n,Sl); SumCol(c,n,Sc); Lin(c,n,Pm(Sl,n)); Col(c,n,Pm(Sc,n)); SumCol(c,n,Sc); return Sum(c,n); Col(c,n,Pm(Sc,n)); return Sum(c,n); } }

int Sum(Mat a, int n) int { Sum(Mat a, int n) { int s=0; int s=0; for (int i=1; i<=n; i++) for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) s+=a[i][j]; for (int s; j=1; j<=n; j++) s+=a[i][j]; return return s; } }

int Pm(int* X, int n) int { Pm(int* X, int n) { int m=1; m=1; for int (int i=2; i<=n; i++) if (X[i]<X[m]) m=i; for (int i=2; i<=n; i++) if (X[i]<X[m]) m=i; return m; return m; } }

void Lin(Mat a, int n, int i) void { Lin(Mat a, int n, int i) { for (int j=1; j<=n; j++) a[i][j]=0; } for (int j=1; j<=n; j++) a[i][j]=0; }

void SumLin(Mat a, int n, int* Y) void { SumLin(Mat a, int n, int* Y) { for (int i=1; i<=n; i++) { for (int i=1; i<=n; i++) { Y[i]=0; Y[i]=0; for (int j=1; j<=n; j++) Y[i]+=a[i][j]; for (int j=1; j<=n; j++) Y[i]+=a[i][j]; }} }}

void Col(Mat a, int n, int j) void { Col(Mat a, int n, int j) { for (int i=1; i<=n; i++) a[i][j]=0; } for (int i=1; i<=n; i++) a[i][j]=0; }

void SumCol(Mat a, int n, int* X) void { SumCol(Mat a, int n, int* X) { for (int j=1; j<=n; j++) { for (int j=1; j<=n; j++) { X[j]=0; X[j]=0; for (int i=1; i<=n; i++) X[j]+=a[i][j]; for (int i=1; i<=n; i++) X[j]+=a[i][j]; }} }}

void Mut(Mat a, Mat b, int n) void { Mut(Mat a, Mat b, int n) { for (int i=1; i<=n; i++) for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) b[i][j]=a[i][j]; for (int j=1; j<=n; j++) b[i][j]=a[i][j]; } }

...

C7 / 16.11.2012

29/29