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.
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,
caz pentru acele date de intrare pentru care numrul
operaiilor efectuate este maxim. n acest caz vorbim de complexitate n cel mai ru
caz.
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.
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=

{ nN, n 1 i k1 < k2 < .... < kn }

{ p = poziia de inserare }
1

dac

a k1 ,

i
n+1

dac
dac

i{2, 3, ... , n} : ki-1 < a ki ,


a > kn .

Pentru rezolvarea acestei probleme vom descrie mai muli subalgoritmi. O prim
metod este cutarea secvenial:
ial
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,


binar care este mult mai eficient, utilizeaz
metoda divide et impera.
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.
Complexitatea acestor algoritmi de
cutare este dat n tabelul alturat :

Algoritmul

n cel mai
ru caz

medie

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:
ie
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"
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

n cel mai ru caz

medie

Selecie

O(n2)

O(n2)

Inserie

O(n2)

O(n2)

Bubblesort

O(n2)

O(n2)

QuickSort

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).
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,
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

soluie
(2,1)::
OOsolu
ie (2,1)

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

Contraexemplu:
Contraexemplu:
22 66 66 55
55 55 11 33
44 99 77 88
22 22 66 22
11 20
20 14
14 16
16
11
||

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

Suma max.=
max.= 50!
50!
Suma
00 66 66 55
00 55 11 33
00 99 77 88
00 00 00 00
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
for(int
(inti=1;
j=1;i<=n;
j<=n;i++)
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();
{
randomize();
Mat a,b,c; int n,Sa,Sb,clrscr();
Nt=10000, Ce=0;
Mat
int n,Sa,Sb,
Nt=10000,
Ce=0;
fora,b,c;
(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);
g g<<<<endl <<" "Matricea
A:"<<
endl; Tipf(a,n);
Suma Max.=
"<<Sa<<endl;
Tipf(b,n);
g g<<<<
" "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)
dupa
" << Nt << "<<Ce<<"
" teste."din
<< "<<Nt<<endl;
endl;
else cout
cout<<<<" "OkSee
ContraEx.Txt
else cout << " See ContraEx.Txt "<<Ce<<" din "<<Nt<<endl;
g.close();
g.close();
getche();
}getche();
}

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;
X[10],Y[10];
s=Sum(a,n);
SumCol(a,n,X);int
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
fors=0;
(int i=1; i<=n; i++)
for
for(int
(inti=1;
j=1;i<=n;
j<=n;i++)
j++) s+=a[i][j];
for
(int s;
j=1; j<=n; j++) s+=a[i][j];
return
}return s;
}

void SumLin(Mat a, int n, int* Y)


void
{ SumLin(Mat a, int n, int* Y)
{ for (int i=1; i<=n; i++) {
for (intY[i]=0;
i=1; i<=n; i++) {
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 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];
}}
}}

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
for(int
(inti=1;
j=1;i<=n;
j<=n;i++)
j++){ g << endl;
for g(int
j=1; j<=n; j++)
<< setw(3)<<setfill('
')<<a[i][j];
}g << gsetw(3)<<setfill('
<< endl << endl; ')<<a[i][j];
g << endl << endl;
} }
}

int Pm(int* X, int n)


int
{ Pm(int* X, int n)
{
int m=1;
for int
(intm=1;
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 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 Mut(Mat a, Mat b, int n)


void
{ Mut(Mat a, Mat b, int n)
{
for (int i=1; i<=n; i++)
for
for(int
(inti=1;
j=1;i<=n;
j<=n;i++)
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

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