SlideShare a Scribd company logo
1 of 12
““Divide et ImperaDivide et Impera””
NoNo iuni introductivețiuni introductiveț
 Divide et Impera (Împarte şi Stăpâneşte) este o metodă de programare care
se aplică problemelor care pot fi descompuse în subprobleme
independente, similare problemei iniţiale, de dimensiuni mai mici şi care pot
fi rezolvate foarte uşor.
 Metoda presupune:
◦ Descompunerea problemei iniţiale în subprobleme independente;
◦ Rezolvarea subproblemelor;
◦ Construirea rezultatului prin compunerea soluţiilor problemelor de
dimensiuni mici.
Metoda DIVIDE ET IMPERA se poate aplica în rezolvarea unei
probleme care îndeplineşte următoarele condiţii :
 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 foloseşte
rezultatele celeilalte);
 aceste subprobleme sunt similare cu problema iniţială;
 la rândul lor subproblemele se pot descompune (dacă este
necesar) în alte subprobleme mai simple;
 aceste subprobleme simple se pot soluţiona imediat prin
algoritmul simplificat.
Căutarea binarăCăutarea binară
 Algoritmul de căutare binară este un algoritm de
căutare folosit pentru a găsi un element într-o listă
ordonată.
 Algoritmul funcţionează pe baza tehnicii divide et
impera. Valoarea căutată este comparată cu cea a
elementului din mijlocul listei. Dacă e egală cu cea a
acelui element, algoritmul se termină. Dacă e mai mare
decât acea valoare, algoritmul se reia, de la mijlocul
listei până la sfârşit, iar dacă e mai mică, algoritmul se
reia pentru elementele de la începutul listei până la
mijloc.
 Întrucât la fiecare pas cardinalul mulţimii de elemente în
care se efectuează căutarea se înjumătăţeşte,
algoritmul are complexitate logaritmică.
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;
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.
AplicaţiiAplicaţii
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 subşir oarecare de cel mult 2 elemente vom avea
următoarele etape:
Împărţim şirul iniţial x [ p . . q ] în două subşiruri x [ p . . m] şi x [
m+1 . . q], unde m este mijlocul şirului: m=[(p+q)/2]. Cele două
subşiruri pot fi împărţite la rândul lor în alte două şiruri până se
ajunge la un subşir de dimensiune 1. Notăm cu x [p . . q] subşirul
format din toate elementele şirului dintre x[p] şi x[q].
Se determină recursiv elementul maxim pentru cele două subşiruri
(a şi b).
Se combină cele două maxime obţinute pentru aflarea maximului
din şirul iniţial.
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
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;
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.
Aplicaţii grilăAplicaţii grilă
1. Ce va afişa programul următor?
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
Aplicaţii grilăAplicaţii grilă
2. Ce va afişa programul pentru n = 10 ?
var n : integer;
function s ( a , b : integer ) : longint ;
var m : byte;
begin
if a <= b then
begin
m := ( a + b ) div 2;
s := m + s ( a , m-1 ) + s ( m+1 , b );
end
else s := 0;
end;
begin readln(n);
writeln ( s ( 1 , n ) );
end. a) 29 b) 35 c) 41 d) 45

More Related Content

Similar to Metoda Divide et Impera

Tehnici de programare triere
Tehnici de programare triereTehnici de programare triere
Tehnici de programare trierecboldisor
 
Informatica metoda trierii
Informatica metoda trieriiInformatica metoda trierii
Informatica metoda trieriiBalan Veronica
 
Instructiuni in c si c++
Instructiuni in c si c++Instructiuni in c si c++
Instructiuni in c si c++Serghei Urban
 
Tehnici de programare_triere_1522
Tehnici de programare_triere_1522Tehnici de programare_triere_1522
Tehnici de programare_triere_1522miklleee
 

Similar to Metoda Divide et Impera (8)

Informat
InformatInformat
Informat
 
Metoda backtracking
Metoda backtrackingMetoda backtracking
Metoda backtracking
 
Tehnici de programare triere
Tehnici de programare triereTehnici de programare triere
Tehnici de programare triere
 
Informatica metoda trierii
Informatica metoda trieriiInformatica metoda trierii
Informatica metoda trierii
 
Instructiuni in c si c++
Instructiuni in c si c++Instructiuni in c si c++
Instructiuni in c si c++
 
Tehnici de programare_triere_1522
Tehnici de programare_triere_1522Tehnici de programare_triere_1522
Tehnici de programare_triere_1522
 
Inform
InformInform
Inform
 
Metoda reluării(1)
Metoda reluării(1)Metoda reluării(1)
Metoda reluării(1)
 

More from Luminița Mihailov

More from Luminița Mihailov (6)

Metoda Greedy
Metoda GreedyMetoda Greedy
Metoda Greedy
 
Metoda Divide et Impera
Metoda Divide et ImperaMetoda Divide et Impera
Metoda Divide et Impera
 
Metoda greedy
Metoda greedyMetoda greedy
Metoda greedy
 
Metoda programarii dinamice
Metoda programarii dinamiceMetoda programarii dinamice
Metoda programarii dinamice
 
Metoda back
Metoda backMetoda back
Metoda back
 
Metoda backtracking
Metoda backtrackingMetoda backtracking
Metoda backtracking
 

Metoda Divide et Impera

  • 2. NoNo iuni introductivețiuni introductiveț  Divide et Impera (Împarte şi Stăpâneşte) este o metodă de programare care se aplică problemelor care pot fi descompuse în subprobleme independente, similare problemei iniţiale, de dimensiuni mai mici şi care pot fi rezolvate foarte uşor.  Metoda presupune: ◦ Descompunerea problemei iniţiale în subprobleme independente; ◦ Rezolvarea subproblemelor; ◦ Construirea rezultatului prin compunerea soluţiilor problemelor de dimensiuni mici.
  • 3. Metoda DIVIDE ET IMPERA se poate aplica în rezolvarea unei probleme care îndeplineşte următoarele condiţii :  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 foloseşte rezultatele celeilalte);  aceste subprobleme sunt similare cu problema iniţială;  la rândul lor subproblemele se pot descompune (dacă este necesar) în alte subprobleme mai simple;  aceste subprobleme simple se pot soluţiona imediat prin algoritmul simplificat.
  • 4. Căutarea binarăCăutarea binară  Algoritmul de căutare binară este un algoritm de căutare folosit pentru a găsi un element într-o listă ordonată.  Algoritmul funcţionează pe baza tehnicii divide et impera. Valoarea căutată este comparată cu cea a elementului din mijlocul listei. Dacă e egală cu cea a acelui element, algoritmul se termină. Dacă e mai mare decât acea valoare, algoritmul se reia, de la mijlocul listei până la sfârşit, iar dacă e mai mică, algoritmul se reia pentru elementele de la începutul listei până la mijloc.  Întrucât la fiecare pas cardinalul mulţimii de elemente în care se efectuează căutarea se înjumătăţeşte, algoritmul are complexitate logaritmică.
  • 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. 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. AplicaţiiAplicaţii 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 subşir oarecare de cel mult 2 elemente vom avea următoarele etape: Împărţim şirul iniţial x [ p . . q ] în două subşiruri x [ p . . m] şi x [ m+1 . . q], unde m este mijlocul şirului: m=[(p+q)/2]. Cele două subşiruri pot fi împărţite la rândul lor în alte două şiruri până se ajunge la un subşir de dimensiune 1. Notăm cu x [p . . q] subşirul format din toate elementele şirului dintre x[p] şi x[q]. Se determină recursiv elementul maxim pentru cele două subşiruri (a şi b). Se combină cele două maxime obţinute pentru aflarea maximului din şirul iniţial.
  • 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. 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. 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. Aplicaţii grilăAplicaţii grilă 1. Ce va afişa programul următor? 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. Aplicaţii grilăAplicaţii grilă 2. Ce va afişa programul pentru n = 10 ? var n : integer; function s ( a , b : integer ) : longint ; var m : byte; begin if a <= b then begin m := ( a + b ) div 2; s := m + s ( a , m-1 ) + s ( m+1 , b ); end else s := 0; end; begin readln(n); writeln ( s ( 1 , n ) ); end. a) 29 b) 35 c) 41 d) 45