240 likes | 346 Views
Grup Scolar Industrial Sarmasag. Disciplina.Informatica Clasa a XI-a B Grupa 2:-Kocsis Jacint -Kocsis Szabolcs -Kovacs Arnold -Mesesan Gabriel -Nagy Zoltan Metoda Divide et Impera Profesor coordonator: Boti Sandor.
E N D
Grup Scolar Industrial Sarmasag Disciplina.Informatica Clasa a XI-a B Grupa 2:-Kocsis Jacint -Kocsis Szabolcs -Kovacs Arnold -Mesesan Gabriel -Nagy Zoltan Metoda Divide et Impera Profesor coordonator: Boti Sandor
Informatica. Clasa a 11-a Metoda desparte şi stăpîneşte
Ideia metodei desparte şi stăpîneşte • Împărţirea repetată a unei probleme de dimensiuni mari în două sau mai multe subprobleme de acelaşi tip, dar de dimensiuni mai mici. • Rezolvarea subproblemelor în mod direct, dacă dimensiunea lor permite aceasta, sau împărţirea lor în alte subprobleme de dimensiuni şi mai mici. • Combinarea soluţiilor subproblemelor rezolvate pentru a obţine soluţia problemei iniţiale.
Schema generală a algoritmului bazat pe metoda desparte şi stăpîneşte procedure DesparteSiStapineste(i,j : integer; var x : tip); var m : integer; x1, x2 : tip; begin if SolutieDirecta(i, j) then Prelucrare(i, j, x) else begin m:=(j-i)div 2; DesparteSiStapineste(i, i+m, x1); DesparteSiStapineste(i+m+1, j, x2); Combina(x1, x2, x); end; end;
Exemplul 1. Determinarea numărului maximal(pag. 44) Se consideră mulţimea A={a1, a2, ..., an}, formată din n numere reale. Elaboraţi un program care determină numărul maximal din această mulţime.
Reprezentarea datelor { numarul de elemente in multimea A } const nmax=100; { multimea A } var A : array[1..nmax] of real;
FuncţiaSolutieDirecta function SolutieDirecta(i, j : integer):boolean; { returneaza true daca multimea curenta contine cel } { mult doua elemente } begin SolutieDirecta:=false; if (j-i<2) then SolutieDirecta:=true; end; { SolutieDirecta }
ProceduraPrelucrare procedure Prelucrare(i, j : integer; var x : real); { returneaza elementul maximal din A[i], A[j] } begin x:=A[i]; if A[i]<A[j] then x:=A[j]; end; { Prelucrare }
Procedura Combina procedure Combina(x1, x2 : real; var x : real); { combina solutiile partiale - returneaza elementul } { maximal din x1 si x2 } begin x:=x1; if x1<x2 then x:=x2; end; { Combina }
Procedura DesparteSiStapineste procedure DesparteSiStapineste(i,j : integer; var x : real); var m : integer; x1, x2 : real; begin if SolutieDirecta(i, j) then Prelucrare(i, j, x) else begin m:=(j-i)div 2; DesparteSiStapineste(i, i+m, x1); DesparteSiStapineste(i+m+1, j, x2); Combina(x1, x2, x); end; end;
Exemplul 2. Tăierea unei plăci de arie maximă Se consideră o placă dreptunghiulară de dimensiunile LH. Placa are n găuri punctiforme, fiecare gaură fiind definită prin coordonatele (xi, yi). Elaboraţi un program care decupează din placă o bucată de arie maximă, dreptunghiulară şi fără găuri. Sînt admise doar tăieturi de la o margine la alta pe direcţii paralele cu laturile plăcii - verticale sau orizontale.
Formalizarea metodei (1) 1. Iniţial stabilim aria maximă Smax = 0. 2. Dacă placa curentă nu are găuri, problema poate fi soluţionată direct, comparînd aria curentă cu valoarea Smax. 3. În caz contrar alegem o gaură arbitrară (xi, yi) prin care tăiem placa curentă în plăci mai mici: P1=(a, b, xi, d);P2=( xi, b, c, d); P3=(a, yi, c, d);P4=(a, b, c, yi).
Formalizarea metodei (2) 4. În continuare examinăm în acelaşi mod fiecare din plăcile P1, P2, P3 şi P4, obţinute în rezultatul tăierii, memorînd consecutiv în variabila Smax aria plăcii de suprafaţă maximă. 5. Procesul de calcul se termină atunci, cînd nici una din plăcile curente P1, P2, P3, P4nu mai conţine găuri.
Reprezentarea datelor { numarul maximal de gauri } const nmax=100; var L, H : real;{ dimensiunile placii } n : 1..nmax; { numarul de gauri } { coordonatele gaurilor } X, Y : array[1..nmax] of real; { placa de arie maxima } Smax, amax, bmax, cmax, dmax : real;
FuncţiaSolutieDirecta function SolutieDirecta(a, b, c, d : real; var i : integer) : boolean; { Returneaza true daca placa curenta nu are gauri.} { In caz contrar returneaza false si numarul uneia din gauri } label 1; var j : integer; begin SolutieDirecta:=true; for j:=1 to n do if (X[j]>a) and (X[j]<c) and (Y[j]>b) and (Y[j]<d) then begin SolutieDirecta:=false; i:=j; goto 1; end; 1:end; { SolutieDirecta }
ProceduraPrelucrareaSolutiei procedure PrelucrareaSolutiei(a, b, c, d : real); var S : real; begin S:=(c-a)*(d-b); if S>=Smax then begin Smax:=S; amax:=a; bmax:=b; cmax:=c; dmax:=d; end; end; { PrelucrareaSolutiei }
Procedura DesparteSiStapineste procedure DesparteSiStapineste(a, b, c, d : real); var i : integer; begin if SolutieDirecta(a, b, c, d, i) then PrelucrareaSolutiei(a, b, c, d) else begin DesparteSiStapineste(a, b, X[i], d); DesparteSiStapineste(X[i], b, c, d); DesparteSiStapineste(a, Y[i], c, d); DesparteSiStapineste(a, b, c, Y[i]); end; end; { DesparteSiStapineste }
Probleme recapitulative 1. Utilizînd metoda desparte şi stăpîneşte elaboraţi unprogram care determină suma elementelor mulţimiiA={a1, a2, ..., an} formată din n numere reale. 2. Se consideră mulţimea A={a1, a2,..., an} elementele căreia sînt numere întregi sortate înordine crescătoare. Elaboraţi un program caredetermină dacă mulţimea A conţine numărul dat p.Estimaţi complexitatea temporală a programuluielaborat.