P. 1
Metoda Divide et Impera

Metoda Divide et Impera

|Views: 595|Likes:
Published by danyaly

More info:

Published by: danyaly on Feb 14, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

02/14/2014

pdf

text

original

METODA DIVIDE ET IMPERA

........................................ 11 2........................... 3 2 APLICATII DIVIDE ET IMPERA......................................................Cuprins 1 NOTIUNI INTRODUCTIVE........................................... 6 2................4 Sortare prin insertie binara...............1“Turnurile din Hanoi”.......................... 14 3 CONCLUZII......................................................................................................2 Sortare rapida .................... 8 2............... 6 2...... 16 4 BIBLIOGRAFIE........................ 17 2 .....3 Sortare prin interclasare................................................................

de dimensiuni mai mici .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 .  la randul lor subproblemele se pot descompune (daca este necesar) in alte subprobleme mai simple.In general se executa impartirea in doua subprobleme de dimensiuni aproximativ egale si anume [n/2] . 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 . descompunerea treptata a subproblemelor in alte subprobleme din ce in ce mai simple . Impartirea in subprobleme are loc pana cand dimensiunea acestora devine suficient de mica pentru a fi rezolvate in mod direct(cazul de baza).aplicarea metodei este destul de rara.prin algoritmul simplificat . aceste subprobleme simple se pot solutiona imediat prin algoritmul simplificat.smilare problemei de baza . 3 .pana cand se pot rezolva imediata . Deoarece putine probleme indeplinesc conditiile de mai sus . aceste subprobleme sunt similare cu problema initiala. aceste suprobleme sunt independente una fata de alta (o subproblema nu se rezolva pe baza alteia si nu se foloseste rezultate celeilalte).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 .

caz in care o descompunem in doua sau mai multe subprobleme si pentru fiecare din ele se continua apelurile recursive(ale procedurii sau functiei). La un anumit nivel sunt doua posibilitati : .. combinarea solutiilor gasite pentru construirea solutiilor subproblemelor de dimensiuni din ce in ce mai mari . . Se combina solutiile SOL 1. deorece subproblemele sunt similare problemei initiale.de dimensiuni mai mari).se intampla la orice nivel .avand grija sa asiguram conditia de terminare ale apelurilor repetate . In etapa finala a metodei DIVIDE ET IMPERA se produce combinarea subproblemelor (rezolvate deja) prin secventele de revenire din apelurile recursive. Principiul fundamental al recursivitatii este autoapelarea unui subprogram cand acesta este activ.rezolvarea subproblemelor simple .. Metoda DIVIDE ET IMPERA admite o implementare recursiva.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. dar mai mici .SOL K si se obtine SOL. 4 de dimensiuni . Daca PROBLEMA PROB este simpla Atunci se rezolva si se obtine solutia SOL Altfel pentru i=1.  combinarea ultimelor solutii determina obtinerea solutiei problemei initiale . .ceea ce se intampla la un nivel .s-a ajuns la o (sub)problema care nu admite o rezolvare imediata ..k executa DIVIMP(PROB) si se obtine SOL1.Asemanator se intampla si in cazul metodei DIVITE ET IMPERA. 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).

In final se combina solutiile acestor K subprobleme.sol2). Procedura DIVIMP se apeleaza pentru problema initiala care are dimensiunea intre limita inferioara (li) si limita inferioara(ls).ls. 5 . COMBINA(sol1. Daca ((ls-li)<=eps) Atunci REZOLVA (li. printr-o procedura recursiva astfel : Procedura DIVIMP(li. 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. Deci.msol1).daca (sub)problema este (inca) complexa .sol). Altfel DIVIDE (li. DIVIMP(li.m.Sfarsit _subprogram.ls).atunci procedura DIVIDE o imparte in doua subprobleme .alegand pozitia m intre limitele li si ls . DIVIMP(m.daca (sub)problema este simpla (ls-li<=eps).la intoarcerile din apeluri se produce combinarea celor doua solutii sol1 si sol2 prin apelul procedurii COMBINA.sol).sol2. in final . subprogramul DIVIMP se apeleaza pentru problema initiala PROB. in limbaj pseudocod. Pentru acestea se reapeleaza recursiv subprogramul.sol).ls.ls.aceasta admite descompunerea in K subprobleme simple.pentru fiecare din cele doua subprobleme se reapeleaza recursiv procedura DIVIMP. Sfarsit_ procedura.atunci procedura REZOLVA ii afla solutia imediat si se produce intoarcerea din apelul recursiv.

Initial .Notam . folosind C. -mut cele (n-1)discuri CàB. Aceste subprobleme sunt independente . atunci mutarea este imediata AàB(mut discul de pe A pe B).B. atunci sirul mutarilor este : AàC. daca n=2.1.folosind ca tija de manevra C si resspectand urmatoarele reguli: la fiecare pas se muta un singur disc.Pe tija A se gasesc asezate n discuri de diametre diferite .in ordinea crescatoare a diametrelor.privind de sus in jos .CàB.tijele B si C sunt goale . Dimensiunile acestor subprobleme sunt : n-1. -mut un disc AàB .C)=sirul mutarilor a n discuri de pe A pe B.deoarece tijele initial (pe H(n.APLICATII Problema turnurilor din Hanoi Prezentarea rezolvarii algoritmului Fie trei tije verticale notate A.B.A.tijele finale si tijele intermediare sunt diferite. PENTRU n=1 AàB 6 care sunt dispuse discurile ).mut ultimul disc pe B . Rezolvarea acestei probleme se bazeaza pe urmatoarele considerente logice : daca n=1. in aceeasi ordine . un disc se poate aseza numai peste un disc cu diametrul mai mare .AàB.C .Sa se afiseze toate mutarile prin care discurile de pe tija A se muta pe tija B .n-1.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 . daca n>2 procedam astfel : -mut (n-1)discuri AàC.

end.B.’C’).C)= H(n-1. writeln(a. H(n-1. hanoi(n-1.AB. end.A) program turnurile_hanoi. procedure hanoi(n:byte. writeln(‘mutarile sunt urmatoarele :’).A.c.a).’B’. var n:byte.readln.B.A.’A’.b) else begin hanoi(n-1.b).b.b).C. begin write(‘nr discuri pe tija A =’).n>1 H(n.b. begin if n=1 then writeln(a. end. readln.c.a.’à’.a.C.’à’.B).c:char). hanoi(n.readln(n). 7 .

ceea ce indica ca toate elementele vectorului au fost mutate exact pe pozitiile ce le vor ocupa in vectorul final .Sa se ordoneze crescator folosind metoda de sortare rapida . in acest moment se produc intoarcerile din apelurile recursive si programul isi termina executia .vectorul V se imparte in doua parti : li …k-1 si k+1…ls. (in k ) pozitia ocupata de acest element.inpartita in alte doua parti .Sortarea rapida(quicksort) Un tablou V se completeaza cu n elemente numere reale . pentru fiecare din aceste parti se reapeleaza procedura“quick”. fiecare din cele doua parti va fi . 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. in acest fel . 8 . functia”poz” realizeaza mutarea elementului v[i] exact pe functia”poz” intoarce pozitia ce o va ocupa acesta in vectorul final ordonat .procesul continua pana cand limitele partilor ajung sa se suprapuna .cu limitele modificate corespunzator .deci vectorul este ordonat . 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”).astfel .

m:integer. end.. modi:=0. type vector= array [1. modj:=-m. poz:=i. begin i:=li.ls:integer). modj:=-1.modi. m:=modi . var v:vector.k:integer.modj. function poz(li. i:=i+modi. man:real. while i<j do begin if v[i]>v[j] then begin man:=v[i]. 9 . j:=ls. end. procedure quick(li.n. var i. v[i]:=v[j]. i. end.50] of real . modi:=-modj. v[j]:=man.j. j:=j+modj.program quicksort.ls:integer):integer.

k-1). daca elementul se afla in dreapta . for i:=1 to n do writeln(v[i]).ls). readln.atunci se compara cu elemente din stanga lui si se sar (i:=i+1)elementele mai mici decat el. end.atunci se compara cu elementele din dreapta lui si se sar (j:=j-1)elementele mai mari decat el .’=’). begin write(‘cate elemente are vectorul ?=’). readln(v[i]).n). quick(k+1. end.begin if li<ls then begin k::=poz(li. quick(1. 10 .ls). end. writeln(‘vectorul ordonat este :’). for i:=1 to n do begin write(‘tastati elementul ‘. end.i. quick(li. OBSERVATII daca elementul se afla in stanga .readln(n).

end.p.cand se ating vectorii de maxim doua elemente .prin injumatatiri succesive .ls:word.cate doi astfel de mini.in vectori din ce in ce mai mici .50] of real . end. j:=m+1.ls:word. begin i:=li.fiecare dintre acestia se ordoneaza printr-o simpla comparare a elementelor . type vector=array[1.vectori ordonati se interclaseaza succesiv pana se ajunge iar la vectorul V. procedure schimba(li. Sa se ordoneze crescator folosind sortare prin interclasare. a[li]:=a[ls]. Sortarea prin interclasare se bazeaza pe urmatoarea logica : vectorul V se imparte . procedure interclas(li. var v:vector . while (i<=m)and(j<=ls) do begin 11 .i:word.var a:vector).n. a[ls]:=man.var a:vector).Sortarea prin interclasare(mergesort) Tabloul unidimensional V se completeaza cu n numere reale.j:word. var b:vector:i.. program mergesort. k:=0. var man:real. begin if a[li]>a[ls] then begin man:=a[li].m.k.

a[p]:=b[k].a). k:=0. procedure divi(li.inc(k). var a:vector). end.m. inc(i). begin if (ls-li)<=1 then schimba(li. if i<=m then for p:=i to m do begin1 inc(k). end. for p:=li to ls do begin inc(k). divi(li. var m:word. end. end. inc(j). end.b[k]:=a[p]. end.ls. 12 . if j<=ls then for p:=j to ls do begin inc(k) .b[k]:=a[p]. if a[i] <a[j] then begin b[k]:=a[i]. else begin m:=(li+ls)div 2.a). end else begin b[k]:=a[j].ls:word.

13 . for i:=1 to n do writeln(v[i]). end.m.deoarece operatia de interclasare a doi vectori deja ordonati este foarte rapida .vectori) consuma in total aproximativ a doua parte din timpul care ar fi necesar ordonarii vectorului luat ca intreg .’=’). OBSERVATII mecanismul general de tip Divide et Impera se gaseste implementat in procedura “divi” .v). writeln(‘vectorul sortat este:’). for i:=1 to n do begin write(‘tastati elementul’. interclas(li. o astfel de abordare a problemei sortarii unii vector conduce la economie de timp de calcul .ls. divi(1. end.a). readln(v[i]).ls. end.divi(m+1.i.n.readln(n).a).iar ordonarea independenta celor doua jumatati(mini. begin write(‘cate elemente are vectorul?=’). end.

v[i-1](procedura “poz” prin cautare binara).n(procedura “deplasare”). insereaza elementul v[i] in pozitia k (procedura”deplasare”). se cauta pozitia k pe care urmeaza s-o ocupe v[i] intre elementele v[1].i:integer.….i:integer):integer. Pentru fiecare element v[i] se procedeaza in patru pasi:  se considera ordonate elementele v[1]. se obtine o succesiune de k+1 elemente ordonate crescator.…. se deplaseaza spre dreapta elementele din pozitiile k. function poz(li.Sortarea prin insertie binara Sa se ordoneze crescator un tablou unidimensional V de n numere reale .v[2].50] of real . var m:integer. v:vector. …..folosind sortarea prin insertie binara .v[2]. type vector =array[1..k.v[i-1].ls. program sortare _binara. begin if li=ls then if v[i]<v[j] then poz:=li else poz:=i else if ls-li=1 then if v[i]<v[ls] then if v[i]>=v[li] then poz:=ls else poz:=li else poz:=i else begin m:=(li+ls)div 2.k+1. var n. 14 .

end. end. for i:=2 to n do begin k:=poz(1.ls. begin write(‘cate elemente are vectorul?=’). v[k]:=man. end. deplasare(k. begin if k<i then begin man:=v[i]. end.’=’). end. procedure deplasare(k.i) else poz :=poz(m.i.readln(n).if v[i]<v[m] then poz:=poz(li. for i:=1 to n do writeln(v[i]). j:integer. var man:real. for i:=1 to n do begin write(‘tastati elementul ‘. 15 . for j:=I downto k+1 do v[j]:=v[j-1].i). readln.i-1.i).m. writeln(‘vectorul ordonat este :’). end.i).readln(v[i]).i:integer).

CONCLUZII Analiza complexitatii timp pentru algoritmii Divide et Impera Algoritmii de tip Divide et Impera au buna comportare in timp .daca se indeplinesc urmatoarele conditii:  dimensiunile subprogramelor(in care se imparte problema initiala )sunt aproximativ egale(“principiul balansarii”).end. lipsesc fazele de combinare a solutiilor subproblemelor(cautare binara). 16 .

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->