|
Politica de confidentialitate |
|
• domnisoara hus • legume • istoria unui galban • metanol • recapitulare • profitul • caract • comentariu liric • radiolocatia • praslea cel voinic si merele da aur | |
METODA DIVIDE ET IMPERA | ||||||
|
||||||
TABLA DE MATERII NOTIUNI INTRODUCTIVE APLICATII DIVIDE ET IMPERA: b“Turnurilor din Hanoi”; b Sortare rapida ; b Sortare prin interclasare; b Sortare prin insertie binara; e2s24sm Metoda de programare DIVIDE ET IMPERA consta in impartirea problemei initiale
de dimensiuni ani in doua sau mai multe probleme de dimensiuni reduse .In general
se executa impartirea in doua subprobleme de dimensiuni aproximativ egale si
anume an/2i . 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 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 Observam ca problema initiala se descompune in trei subprobleme mai simple
,similare problemei initiale: mut (n-1)discuri AaC ,mut ultimul disc
pe B ,mut cele (n-1)discuri C-->B.Dimensiunile acestor subprobleme sunt :
n-1,1,n-1. PENTRU n=1 AaB 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,’a’,b) else begin hanoi(n-1,a,c,b); writeln(a,’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 . 4pentru fiecare din aceste parti se reapeleaza procedura“quick”,cu
limitele modificate corespunzator ; 4fiecare 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 ; program quicksort; type vector= array a1..50i 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; procedure quick(li,ls:integer); begin if li<ls then begin k::=poz(li,ls); quick(li,k-1); quick(k+1,ls); end; end; begin Tabloul unidimensional V se completeaza cu n numere reale. Sa se ordoneze crescator folosind sortare prin interclasare. Sortarea prin interclasare se bazeaza pe urmatoarea logica : vectorul V se imparte ,prin injumatatiri succesive ,in vectori din ce in ce mai mici ;cand se ating vectorii de maxim doua elemente ,fiecare dintre acestia se ordoneaza printr-o simpla comparare a elementelor ;cate doi astfel de mini- vectori ordonati se interclaseaza succesiv pana se ajunge iar la vectorul V. program mergesort; type vector=arraya1..50i of real ; var v:vector ;n,i:word; procedure schimba(li,ls:word;var a:vector); var man:real; begin if aalii>aalsi then begin man:=aalii; aalii:=aalsi; aalsi:=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; end; k:=0; for p:=li to ls do begin inc(k); aapi:=baki; end; end; procedure divi(li,ls:word; var a:vector); var m:word; begin if (ls-li)<=1 then schimba(li,ls,a); else begin m:=(li+ls)div 2; divi(li,m,a); divi(m+1,ls,a); interclas(li,m,ls,a); end; end; begin OBSERVATII Sortare prin insertie binara program sortare _binara; type vector =arraya1..50i of real ; var n,k,i:integer; v:vector; function poz(li,ls,i:integer):integer; var m:integer; begin if li=ls then if vaii<vaji then poz:=li else poz:=i else if ls-li=1 then if vaii<valsi then if vaii>=valii then poz:=ls else poz:=li else poz:=i else begin m:=(li+ls)div 2; if vaii<vami then poz:=poz(li,m,i) else poz :=poz(m,ls,i); end; end; procedure deplasare(k,i:integer); var man:real; j:integer; begin if k<i then begin man:=vaii; for j:=I downto k+1 do vaji:=vaj-1i; vaki:=man; end; end; begin CONCLUZII Livia Toca,Cristian Opincaru,AdrianSindile , MANUAL DE INFORMATICA PENTRU CLS.a-X a, Editura Niculescu ; Radu Visinescu,BAZELE PROGRAMARII , Cristian Udrea,TEORIE SI APLICATII, |
||||||
|
||||||
|
||||||
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite |
|