12
Divide et Impera Divide et Impera

Metoda Divide et Impera

Embed Size (px)

Citation preview

  1. 1. Divide et ImperaDivide et Impera
  2. 2. NoNo iuni introductiveiuni introductive Divide et Impera (mparte i Stpnete) este o metod de programare care se aplic problemelor care pot fi descompuse n subprobleme independente, similare problemei iniiale, de dimensiuni mai mici i care pot fi rezolvate foarte uor. Metoda presupune: Descompunerea problemei iniiale n subprobleme independente; Rezolvarea subproblemelor; Construirea rezultatului prin compunerea soluiilor problemelor de dimensiuni mici.
  3. 3. Metoda DIVIDE ET IMPERA se poate aplica n rezolvarea unei probleme care ndeplinete urmtoarele condiii : se poate descompune n( dou sau mai multe) subprobleme; aceste subprobleme sunt independente una fa de alta (o subproblema nu se rezolv pe baza alteia i nu se folosete rezultatele celeilalte); aceste subprobleme sunt similare cu problema iniial; la rndul lor subproblemele se pot descompune (dac este necesar) n alte subprobleme mai simple; aceste subprobleme simple se pot soluiona imediat prin algoritmul simplificat.
  4. 4. Cutarea binarCutarea binar Algoritmul de cutare binar este un algoritm de cutare folosit pentru a gsi un element ntr-o list ordonat. Algoritmul funcioneaz pe baza tehnicii divide et impera. Valoarea cutat este comparat cu cea a elementului din mijlocul listei. Dac e egal cu cea a acelui element, algoritmul se termin. Dac e mai mare dect acea valoare, algoritmul se reia, de la mijlocul listei pn la sfrit, iar dac e mai mic, algoritmul se reia pentru elementele de la nceputul listei pn la mijloc. ntruct la fiecare pas cardinalul mulimii de elemente n care se efectueaz cutarea se njumtete, algoritmul are complexitate logaritmic.
  5. 5. ProgramulProgramul program cautare_binara; var a:array[1..100] of integer; n,x:integer; function cautb(s,d,x:integer):integer; var m:integer; begin if s>d then cautb:=-1 else begin m:=(s+d)div 2; if a[m]=x then cautb:=m else if x>a[m] then cautb:=cautb(m+1,d,x) else cautb:=cautb(s,m-1,x); end; end;
  6. 6. Continuare programContinuare program procedure citire; var f:text; begin assign(f,'cautb.txt');reset(f);n:=0; while not eof(f) do begin n:=n+1; readln(f,a[n]); end; close(f); end; begin citire; readln(x); writeln(cautb(1,n,x)); end.
  7. 7. AplicaiiAplicaii S se determine cea mai mare valoare dintr-un ir de n numere ntregi, folosind metoda Divide et Impera. Rezolvare: Dac irul are un singur element, acesta va fi elementul maxim. Pentru un subir oarecare de cel mult 2 elemente vom avea urmtoarele etape: mprim irul iniial x [ p . . q ] n dou subiruri x [ p . . m] i x [ m+1 . . q], unde m este mijlocul irului: m=[(p+q)/2]. Cele dou subiruri pot fi mprite la rndul lor n alte dou iruri pn se ajunge la un subir de dimensiune 1. Notm cu x [p . . q] subirul format din toate elementele irului dintre x[p] i x[q]. Se determin recursiv elementul maxim pentru cele dou subiruri (a i b). Se combin cele dou maxime obinute pentru aflarea maximului din irul iniial.
  8. 8. Exemplu numericExemplu numeric 5 12 15 7 14 23 9 15 s1 s2 5 12 15 7 14 23 9 15 s11 s12 s21 s22 5 12 15 7 14 23 9 15 r11= 12 r12 = 15 r21 = 23 r11 = 15 r1 = 15 r2 = 23 r = 23
  9. 9. Subprogramul maximSubprogramul maxim Type vector=array[1..100] of integer; Var x:vector; i,n:integer; function maxim ( p , q : integer ) : integer; var m, a, b : integer; begin if p < q then begin m := ( p + q ) div 2; a := maxim ( p , m ); b := maxim ( m + 1 , q ) ; if a > b then maxim := a else maxim := b; end else maxim := x [ p ]; end;
  10. 10. Programul principalProgramul principal begin write(n=); readln(n); for i:=1 to n do begin write(x[, i ,]=); readln ( x[i] ); end; writeln ( maximul=, maxim ( 1, n )); readln; end.
  11. 11. Aplicaii grilAplicaii gril 1. Ce va afia programul urmtor? var v : array [ 1 . . 50 ] of integer ; i : integer; function s ( a , b : byte ): longint; begin if a > b then s := 0 else if a=b then s := v [ a ] else s := s ( a , ( a + b ) div 2 ) + s ( ( a + b ) div 2 + 1 , b ); end; begin for i := 1 to 20 do v [ i ] := i; writeln ( s ( 5 , 9 ) ); readln; end. a) 29 b) 35 c) 45 d) 14
  12. 12. Aplicaii grilAplicaii gril 2. Ce va afia programul pentru n = 10 ? var n : integer; function s ( a , b : integer ) : longint ; var m : byte; begin if a