Sunteți pe pagina 1din 9

Metoda trierii: Metoda trierii presupune c soluia unei probleme poate fi gsit analiznd consecutiv elementele i ale unei

mulimi finite: S = { S1, S2 , Si, , Sk }, Denumit mulimea soluiilor posibile. n cele mai simple cazuri elementele Si, Si S, pot fi reprezentate prin valori aparinind unor tipuri ordinale de date: integer, Boolean, char, enumerare sau subdomeniu. n problemele mai complicate sntem nevoii s reprezentm aceste elemente prin tablouri, articole sau mulimi. Menionm c n majoritatea problemelor soluiile posibile S1, S2, , Sk nu sunt indicate explicit n enunul problemei i elaborarea algoritmilor pentru calcularea lor cade n sarcina programatorului. Schema general a unui algoritm bazat pe metoda trierii poate fi redat cu ajutorul unui ciclu:
For i:=1 to k do If SolutiePosibila(Si) then PrelucrareaSolutiei(Si)

Unde SoluiaPosibil este o funcie boolean care returneaz valoarea true dac elementul Si satisface condiiile problemei i false n caz contrar, iar PrelucrareaSolutiei este o procedura care efectueaz prelucrarea elementului selectat. De obicei, aceast procedura soluia Si este afiat pe ecran. n continuare vom analiza doua exemple care pun n eviden avantajele i dezavantajele algoritmilor bazai pe metoda trierii. Exemplul 1. Se consider numerele naturale din mulimea {0, 1, 2, , n}. Elaborai un program care determin pentru cte numere K din aceast mulime suma cifrelor fiecrui numr este egal cu m. n particular, pentru n=100 si m=2, n mulimea {0, 1, 2, , 100} exist 3 numere care satisfac condiiile problemei: 2, 11 si 20. Prin urmare, K=3. Rezolvare. Evident, mulimea soluiilor posibile S = {0, 1, 2, , n}. n programul ce urmeaz suma cifrelor oricrui numr natural i, i S, se calculeaz cu ajutorul funciei SumaCifrelor. Separarea cifrelor zecimale din scrierea numrului natural i se efectueaz de la dreapta la stinga prin mprirea numrului i si a cturilor respective la baza 10.
Program P151; Type Natural=0..MaxInt; Var I, k, m, n : Natural; Function SumaCifrelor(i:Natural): Natural; 1

Var suma: Natural; Begin Suma:=0; Repeat Suma:=suma+(I mod 10); i:=i div 10; until i=0; SumaCifrelor:=suma; End; Function SolutiePosibila(i:Natural):Boolean; Begin If SumaCifrelor(i)=m then SolutiaPosibila:=true Else SolutiePosibila:=false; End; Procedure PrelucrareaSolutiei(i:Natural); Begin Writeln(i=, i); K:=k+1; End; Begin Write(Dati n=); readln(n); Write(Dati m=); readln(m); K:=0; For i:=0 to n do If SolutiePosibila(i) then PrelucrareaSolutiei(i); Writeln(K=, K); Readln; End.

Exemplul 2. Se consider mulimea P={ P1, P2, , Pn} format din n puncte (2 n 30) pe un plan Euclidian. Fiecare punct Pj este definit prin coordonatele sale Xj, Yj. Elaborai un program care afieaz la ecran coordonatele punctelor Pa, Pb distana dintre care este maxim. Rezolvare. Mulimea soluiilor posibile S=PP. Elementele (Pj, Pm) ale produsului cartezian PP pot fi generate cu ajutorul a doua cicluri imbricate:
For j:=1 to n do For m:=1 to n do If SolutiePosibila(Pj, Pm) then PrelucrareaSolutiei( Pj, Pm)

Distana dintre punctele Pj, Pm se calculeaz cu ajutorul formulei:


Djm = (Xj-Xm)2+ (Yj- Ym)2. Program P152; Const nmax=30; Type Punct = record 2

X, y: real; End; Indice = 1..nmax; Var P:array[Indice] of Punct; J, m, n:Indice; Dmax:real; PA, PA: Punct; Function Distanta(A, B: Punct): real; Begin Ditanta:=sqrt(sqr(A.x-B.x)+sqr(A.y-B.y)); End; Function SolutiePosibila(j, m:Indice):Boolean; Begin If j<>m then SolutiePosibila:=true Else SolutiePosibila:=false; End; Procedure PrelucrareaSolutiei(A, B: Punct); Begin If Distanta(A,B)>dmax then Begin PA:=A; PB:=B; Dmax:=Distanta(A,B); End; End; Begin Write(Dati n=); readln(n); Writeln(Dati coordonatele x, y ale punctelor); For j:=1 to n do Begin Write(P[, j,]: ); readln(P[j].x, P[j].y); End; Dmax:=0; For j:=1 to n do For m:=1 to n do If SolutiePosibila(j, m) then PrelucrareaSolutiei(P[j], P[m]); Writeln(Solutia: PA=(, PA.x:5:2, ,, PA.y:5:2, )); Wtieln(Solutia: PB=(, PB.x:5:2, ,, PB.y:5:2, )); Readln; End.

START

x s1

satisface

condiia problemei d Includem x n soluie

n S exist elemente necercetate d x un element necercetat din S

STOP

Avantajul principal al algortmilor bazai pe metoda trierii const n faptul c programele respective snt relative simple, iar depanarea lor nu necesita teste sophisticate. Complexitatea temporal a acestor algoritmi este determinat de numrul de elemente k din mulimea soluiilor posibile S. n majoritatea problemelor de o reala importan practica metoda trierii conduce la algoritmii exponeniali. ntrucit algoritmii exponeniali snt inacceptabili in cazul datelor de intrare foarte mari, metoda trierii este aplicat numai n scopuri didactice sau pentru elaborarea unor programe al cror timp de execuie nu este critic. Problema 6.
Program P1; const nmax=30; type Punct= record x,y:real; end; Indice=1..nmax; var P:array[Indice] of Punct; j,m,k,n:Indice; max:real; PA, PB, PC : Punct; function Dis(A, B :Punct):real; begin 4

Dis:=sqrt(sqr(A.x-B.x)+sqr(A.y-B.y)); end; function Aria(L1,L2,L3:real):real; var sp:real; begin sp:=(L1+L2+L3)/2; Aria:=sqrt(sp*(sp-L1)*(sp-L2)*(sp-L3)); end; function SolutiePosibila(j,m,k:Indice):boolean; begin if (j<>m) and (m<>k) then SolutiePosibila:=true else SolutiePosibila:=false; end; procedure PrelucrareaSolutiei(A,B,C:Punct); begin if Aria(Dis(A,B),Dis(B,C),Dis(A,C))>max then begin max:=Aria(Dis(A,B),Dis(B,C),Dis(A,C)); PA:=A; PB:=B; PC:=C; end; end; begin write('Dati n= '); readln(n); writeln('Dati coordonatele x,y ale punctelor'); for j:=1 to n do begin write('P[',j,']: '); readln(P[j].x, P[j].y); end; max:=0; for j:=1 to n do for m:=1 to n do for k:=1 to n do if SolutiePosibila(j,m,k) then PrelucrareaSolutiei(P[j],P[m],P[k]); writeln('Aria max: ',max:0:2); writeln('1: ',PA.x:5:2,' ',PA.y:5:2); writeln('1: ',PB.x:5:2,' ',PB.y:5:2); writeln('1: ',PC.x:5:2,' ',PC.y:5:2); readln; end.

Tehnica Greedy Aceast metoda presupune ca problemele pe care trebuie s le rezolvam au urmtoarea structura: - se da o mulime A = {a1, a2, ,an} format din n elemente; - se cere s determinm o submulime B, BA, care ndeplinete anumite condiii pentru a fi acceptat ca soluie. n principiu, problemele de acest tip pot fi rezolvate prin metoda trierii, genernd consecutiv cele 2(n) submulimi Ai ale mulimii A. Dezavantajul metodei trierii const n faptul c timpul cerut de algoritmii respectivi este foarte mare. Pentru a evita trierea tuturor submulimilor Ai, Ai A, n metoda Greedy se utilizeaz un criteriu (o regula) care asigur alegerea direct a elementelor necesare n mulimea A. De obicei, criteriile sau regulile de selecie nu snt indicate explicit n enunul problemei i formularea lor cade n sarcina programatorului. Evident, n absena unor astfel de criterii metoda Greedy nu poate fi aplicat. Schema general a unui algoritm bazat pe metoda Greedy poate fi redat cu ajutorul unui ciclu:
While ExistaElemente do Begin AlegeUnElement (x); IncludeElementul (x); End.

Funcia ExistaElemente returneaz valoarea true dac n mulimea A exist elemente care satisfac criteriul (regula) de selecie. Procedura AlegeUnElement extrage din mulimea A un astfel de element x, iar procedura IncludeElementul nscrie elementul selectat n submulimea B. Iniial B este o mulime vida. Dup cum se vede, n metoda Greedy soluia problemei se caut prin testarea consecutiv a elementelor din mulimea A i prin includerea unora din ele n submulimea B. ntr-un limbaj plastic, submulimea B ncearc s nghit elementele gustoase din mulimea A, de unde provine i denumirea metodei (greedy- lacom, hrpre). Exemplu. Se consider mulimea A = {a1, a2, , ai, , an} elementele creia snt numere reale, iar cel puin unul din ele satisface condiia ai>0. Elaborai un program care determin o submulime B, BA, astfel nct suma elementelor din B s fie maxim. De exemplu, pentru A = {21,5; -3,4; 0; -12,3; 83,6} avem B = {21,5; 83,6}. Rezolvare.

Se observ c dac o submulime B, BA, conine un element b0, atunci suma elementelor submulimii B \ {b} este mai mare sau egal cu cea a elementelor din B. Prin urmare, regula de selecie este foarte simpl: la fiecare pas n submulimea B se include un element pozitiv arbitrar din mulimea A. n programul ce urmeaz mulimile A i B snt reprezentate prin vectorii (tablourile unidimensionale) A i B, iar numrul de elemente ale fiecrei mulimiprin variabilele ntregi, respectiv n i m. Iniial B este o mulime vida, respectiv m=0.
Program P153; Const nmax=1000; Var A : array [1..nmax] of real; N : 1..nmax; B : array [1..nmax] of real; M : 0..nmax; X : real; I : 1..nmax; Function ExistaElemente : Boolean; Var i: integer; Begin ExistaElemente:=false; For i:=1 to n do If A[i]>0 then ExistaElemente:=true; End; Procedure AlegeUnElement(var x:real); Var i: integer; Begin I:=1; While A[i]<=0 do i:=i+1; X:=A[i]; A[i]:=0; End; Procedure IncudeElementul (x:real); Begin M:=m+1; B[m]:=x; End; Begin Write(Dati n=); readln(n); Writeln(Dati elementele multimii A:); For i:=1 to n do read(a[i]); Writeln; M:=0; While ExistaElemente do Begin AlegeUnElement (x); IncludeElementul (x); End; Writeln(Elementele multimii B:); For i:=1 to m do writeln(B[i]); Readln; 7

End.

Menionm c procedura AlegeUnElement zerogrific componena vectorului A ce coninea elementul x, extras din mulimea respectiv. Complexitatea temporal a algoritmilor bazai pe metoda Greedy poate fi evaluat urmnd schema general de calcul prezentat mai sus. De obicei, timpul cerut de procedurile ExistaElemente, AlegeUnElement i IncludeElementul este de ordinal n. n componena ciclului while aceste proceduri se execut cel mult de n ori. Prin urmare, algoritmii bazai pe metoda Greedy snt algoritmi polinominali. Problema 6.
Program Rucsac01; Const max=10; Var CMax, CC, GG: integer; C, G, X, Iau: array [1..max] of integer; N, k, i: integer; cont: Boolean; Function PotContinua( k: integer): Boolean; Var i: 1..max; Greut: integer; Begin Greut:=0; For i:=1 to k do if x[i[=1 then Greut:=Greut+G[i]; PotContinua:=Greut<=GG End; Procedure BackTrack; Begin K:=1; x[k]:=-1; CMax:=0; While k>0 do Begin Cont:=False; While (x[k]<1) and (not cont) do Begin x[k]:=x[k]+1; cont:=PotContinua(k) End; If cont then If k=n then Begin CC:=0; For i:=1 to n do if x[i]=1 then CC:=CC+C[i]; If CC>=Cmax then Begin CMax:=CC; for i:=1 to n do Iau[i]:=x[i] end End Else begin k:=k+1; x[k]:=-1 end Else k:=k-1 End End; Begin Write(n=); readln(n); For i:=1 to n do Begin Write(C[,i,]=); readln(C[i]); write(G[,i,]=); 8

Readln(G[i]); End; Write(GG=); readln(GG); BackTrack; Writeln(O sol. Cu cistig maxim:); For i:=1 to n do if Iau[i]=1 then writeln(Se ia obiectul ,i); Writeln(Cistig = ,Cmax); readln; End.