Metoda Divide et Impera

Post on 16-Aug-2015

211 views 1 download

Transcript of Metoda Divide et Impera

  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