Referat Metoda Divide Et Impera
Mai jos puteti citi fragmente din
Referat Metoda Divide Et Impera si de asemenea puteti face
Download Referat Metoda Divide et ImperaCiteste fragmente din Referat Metoda Divide Et Impera
METODA DIVIDE ET IMPERA
TABLA DE MATERII
NOTIUNI INTRODUCTIVE APLICATII DIVIDE ET IMPERA:
(“Turnurilor din Hanoiâ€Â;
( Sortare rapida ;
( Sortare prin interclasare;
( Sortare prin insertie binara;
CONCLUZII
BIBLIOGRAFIE
NOTIUNI INTRODUCTIVE
Metoda de programare DIVIDE ET IMPERA consta in impartirea
problemei initiale de dimensiuni [n] in doua sau mai multe probleme de
dimensiuni reduse .In general se executa impartirea in doua subprobleme
de dimensiuni aproximativ egale si anume [n/2] . Impartirea in
subprobleme are loc pana cand dimensiunea acestora devine suficient de
mica pentru a fi rezolvate in mod direct(cazul de baza).Dupa rezolvarea
celor doua subprobleme se executa faza de combinare a rezultatelor in
vederea rezolvarii intregii probleme .
Metoda DIVIDE ET IMPERA se poate aplica in rezolvarea unei
probleme care indeplineste urmatoarele conditii :
(se poate descompune in ( doua sau mai multe) suprobleme ;
(aceste suprobleme sunt independente una fata de alta (o
subproblema nu se rezolva pe baza alteia si nu se foloseste rezultate
celeilalte);
(aceste subprobleme sunt similare cu problema initiala;
( la randul lor subproblemele se pot descompune (daca este
necesar) in alte subprobleme mai simple;
(aceste subprobleme simple se pot solutiona imediat prin
algoritmul simplificat.
Deoarece putine probleme indeplinesc conditiile de mai sus
,aplicarea metodei este destul de rara.
Dupa cum sugereaza si numele "desparte si stapaneste "etapele
rezolvarii unei probleme (numita problema initiala) in
DIVIDE ET IMPERA sunt :
- descompunerea problemei initiale in subprobleme independente
,smilare problemei de baza ,de dimensiuni mai mici ;
(descompunerea treptata a subproblemelor in alte subprobleme din
ce in ce mai simple ,pana cand se pot rezolva imediata ,prin algoritmul
simplificat ;
(rezolvarea subproblemelor simple ;
(combinarea solutiilor gasite pentru construirea solutiilor
subproblemelor de dimensiuni din ce in ce mai mari ;
( combinarea ultimelor solutii determina obtinerea solutiei
problemei initiale .
Metoda DIVIDE ET IMPERA admite o implementare recursiva
,deorece subproblemele sunt similare problemei initiale, dar de
dimensiuni mai mici .
Principiul fundamental al recursivitatii este autoapelarea
unui subprogram cand acesta este activ;ceea ce se intampla la un nivel
,se intampla la orice nivel ,avand grija sa asiguram conditia de
terminare ale apelurilor repetate .Asemanator se intampla si in cazul
metodei DIVITE ET IMPERA ; la un anumit nivel sunt doua posibilitati :
s-a ajuns la o (sub)problema simpla ce admite o rezolvare imediata caz
in care se rezolva (sub)problema si se revine din apel (la subproblema
anterioara,de dimensiuni mai mari);
s-a ajuns la o (sub)problema care nu admite o rezolvare imediata ,caz
in care o descompunem in doua sau mai multe subprobleme si pentru
fiecare din ele se continua apelurile recursive(ale procedurii sau
functiei).
In etapa finala a metodei DIVIDE ET IMPERA se produce
combinarea subproblemelor (rezolvate deja) prin secventele de revenire
din apelurile recursive.
Etapele metodei DIVIDE ET IMPERA (prezentate anterior)se
pot reprezenta prin urmatorul subprogram general (procedura sau functie
)recursiv exprimat in limbaj natural:
Subprogram DIVIMP (PROB);
Daca PROBLEMA PROB este simpla
Atunci se rezolva si se obtine solutia SOL
Altfel pentru i=1,k executa DIVIMP(PROB) si se obtine SOL1;
Se combina solutiile SOL 1,... ,SOL K si se obtine SOL;
Sfarsit _subprogram;
Deci ,subprogramul DIVIMP se apeleaza pentru problema
initiala PROB;aceasta admite descompunerea in K subprobleme simple
;pentru acestea se reapeleaza recursiv subprogramul ;in final se combina
solutiile acestor K subprobleme.
De obicei problema initiala se descompune in doua
subprobleme mai simple ; in acest caz etapele generale ale metodei
DIVIDE ET IMPERA se pot reprezenta concret,in limbaj pseudocod ,printr-o
procedura recursiva astfel :
Procedura DIVIMP(li,ls,sol);
Daca ((ls-li)<=eps)
Atunci REZOLVA (li,ls,sol);
Altfel
DIVIDE (li,m,ls);
DIVIMP(li,msol1);
DIVIMP(m,ls,sol2);
COMBINA(sol1,sol2,sol);
Sfarsit_ procedura;
Procedura DIVIMP se apeleaza pentru problema initiala care
are dimensiunea intre limita inferioara (li) si limita
inferioara(ls);daca (sub)problema este simpla (ls-li<=eps),atunci
procedura REZOLVA ii afla solutia imediat si se produce intoarcerea din
apelul recursiv;daca (sub)problema este (inca) complexa ,atunci
procedura DIVIDE o imparte in doua subprobleme ,alegand pozitia m
intre limitele li si ls ;pentru fiecare din cele doua subprobleme se
reapeleaza recursiv procedura DIVIMP; in final ,la intoarcerile din
apeluri se produce combinarea celor doua soluitii sol1 si sol2 prin
apelul procedurii COMBINA.
PROBLEMA TURNURILOR DIN HANOI
Prezentarea algoritmului rezolvarii
Fie trei tije verticale notate A,B,C .Pe tija A se gasesc
asezate n discuri de diametre diferite ,in ordinea crescatoare a
diametrelor,privind de sus in jos . Initial ,tijele B si C sunt goale
.Sa se afiseze toate mutarile prin care discurile de pe tija A se muta
pe tija B , in aceeasi ordine ,folosind ca tija de manevra C si
resspectand urmatoarele reguli:
(la fiecare pas se muta un singur disc;
(un disc se poate aseza numai peste un disc cu diametrul mai mare .
Rezolvarea acestei probleme se bazeaza pe urmatoarele
considerente logice :
-daca n=1 ,atunci mutarea este immediata A(B(mut discul de pe
A pe B);
(daca n=2,atunci sirul mutarilor este : A(C,A(B,C(B;
(daca n>2 procedam astfel :
-mut (n-1)discuri A(C;
-mut un disc A(B ;
-mut cele (n-1)discuri C(B.
Observam ca problema initiala se descompune in trei subprobleme
mai simple ,similare problemei initiale: mut (n-1)discuri A(C ,mut
ultimul disc pe B ,mut cele (n-1)discuri C-->B.Dimensiunile acestor
subprobleme sunt : n-1,1,n-1.
Aceste subprobleme sunt independente ,deoarece tijele initial (pe
care sunt dispuse discurile ),tijele finale si tijele intermediare sunt
diferite.Notam H(n,A,B,C)=sirul mutarilor a n discuri de pe A pe B,
folosind C.
PENTRU
n=1 A(B
n>1 H(n,A,B,C)= H(n-1,A,C,B),AB, H(n-1,C,B,A)
program turnurile _hanoi;
var n:byte;
procedure hanoi(n:byte;a,b,c:char);
begin
if n=1 then writeln(a,’(’,b)
else begin
hanoi(n-1,a,c,b);
writeln(a,’(’,b);
hanoi(n-1,c,b,a);
end;
end;
begin
write(‘nr discuri pe tija A =’);readln(n);
writeln(‘mutarile sunt urmatoarele :’);
hanoi(n,’A’,’B’,’C’);
readln;readln;
end.
Sortare rapida(quicksort)
Un tablou V se completeaza cu n elemente numere reale .Sa se
ordoneze crescator folosind metoda de sortare rapida .
Solutia problemei se bazeaza pe urmatoarele etape
implementate in programul principal:
(se apeleaza procedura “quick†cu limita inferioara li=1
si limita superioara ls=n;
(functiaâ€Âpoz†realizeaza mutarea elementului v[i] exact pe
pozitia ce o va ocupa acesta in vectorul
final ordonat ; functiaâ€Âpoz†intoarce (in k ) pozitia ocupata de
acest element;
(in acest fel ,vectorul V se imparte in doua parti : li …k-1
si k+1…ls;
(pentru fiecare din aceste parti se reapeleaza
procedura“quickâ€Â,cu limitele modificate corespunzator ;
(in acest fel ,primul element din fiecare parte va fi
pozitionat exact pe pozitia finala ce o va ocupa in vectorul final
ordonat (functia“pozâ€Â);
(fiecare din cele doua parti va fi ,astfel ,inpartita in alte
doua parti ;procesul continua pana cand limitele partilor ajung sa se
suprapuna ,ceea ce indica ca toate elementele vectorului au fost mutate
exact pe pozitiile ce le vor ocupa in vectorul final ;deci vectorul este
ordonat ;
(in acest moment se produc intoarcerile din apelurile
recursive si programul isi termina executia .
program quicksort;
type vector= array [1..50] of real ;
var v:vector;
i,n,k:integer;
function poz(li,ls:integer):integer;
var i,j,modi,modj,m:integer;
man:real;
begin
i:=li; j:=ls;
modi:=0; modj:=-1;
while i
v[j] then
begin
man:=v[i];
v[i]:=v[j];
v[j]:=man;
m:=modi ;
modi:=-modj;
modj:=-m;
end;
i:=i+modi;
j:=j+modj;
end;
poz:=i;
end;
procedure quick(li,ls:integer);
begin
if lia[ls] then begin
man:=a[li];
a[li]:=a[ls];
a[ls]:=man;
end;
end;
procedure interclas(li,m,ls:word;var a:vector);
var b:vector:i,k,p,j:word;
begin
i:=li; j:=m+1; k:=0;
while (i<=m)and(j<=ls) do
begin
inc(k);
if a[i] =v[li]
then poz:=ls
else poz:=li
else poz:=i
else begin
m:=(li+ls)div 2;
if v[i]