Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
DIVIDE ET IMPERA
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 
1. Prezentare generala

Divide et impera este o tehnica speciala prin care se pot rezolva anumite probleme. s1n14nt
Divide et impera se bazeaza pe un principiu extrem de simplu:descompunem problema in doua sau mai multe subprobleme (mai usoare),care se rezolva, iar solutia pentru problema initiala se obtine combinand solutiile problemelor in care a fost descompusa. Se presupune ca fiecare din probleme in care a fost descompusa problema initiala, se poate descompune in alte subprobleme, la fel cum a fost descompusa problema initiala. Procedeul se reia pana cand (in urma descompunerilor repetate) se ajunge la probleme care admit rezolvare imediata.

Evident nu toate problemele pot fi rezolvate prin utilizarea acestei tehnici. Fara teama de a gresi, putem afirma ca numarul lor este relativ mic, tocmai datorita cerintei ca problema sa admita o descompunere repetata.

Divide et impera este o tehnica ce admite o implementare recursiva. Am invatat principiul general prin care se elaboreaza algoritmi recursivi: ce se intampla la un nivel, se intampla la un nivel, se intampla la orice nivel (avand grija sa asiguram conditiile de terminare). Tot asa, se elaboreaza un algoritm prin divide et imoera: la un anumit nivel avem doua posibilitati:
1) am ajuns la o problema care admite o rezolvare imediata, caz in care se rezolva si se revine din apel(conditia de terminare);
2) nu am ajuns in situatia de la punctul 1, caz in care sdescompunem problema in doua sau mai multe subprobleme, pentru fiecare din ele reapelam functia, combinam rezultatele si revnim din apel.

2. Aplicatii

1) Maximul dintr-un vector
Se citeste un vector cu n componente, numere naturale. Se cere sa se tipareasca valoare maxima.

Trebuie tiparita valoarea maxima dintre numerele retinute in vector de la i la j(initial i= 1, j=n). Pentru aceasta procedam astfel :
· daca i=j, valoare maxima va fi vaii ;
· contrar vom imparti vectorul in doi vectori (primul vector va contine componentele de la i la (i+j) div 2, al doilea va contine componentele de la ((i+j) div 2 +1 la j ) , rezolvam subproblemele (aflam maximul pentru fiecare din ele) iar solutia problemei va fi data de valoarea maxima dintre rezultatele celor doua subprobleme.
#include<iostream.h> int va10i,n;




int max(int i ,int j)
A int a,b; if (i==j) return vaii ; else
A a=max(i, (i+j)/2); b=max((i+j)/2+1,j); if (a>b) return a; else return b;
S
S

main( )
A cout<<”n=”;cin>>n; for (int i=1;i<=n;i++)
Acout<<”va“<<i<<”i=”;cin>>vaii; S cout<<”max=”<<max(1,n);
S

2) Cautare binara

Se citeste un vector cu n componente numere intregi, unde nemerele se presupun ordonate crescator si o valoare intreaga (nr). Sa se decida daca nr se gaseste sau nu printre numerele citite, iar in caz afirmativ sa se tipareasca indicele componentei care contine acea valoare .
O rezolvare in care nr se compara pe rand cu cele n valori, este lipsita de valoare (nu exploateaza faptul ca cele n valori sunt in secventa crescatoare). Algoritmul care va fi propus este mult mai performant si face parte, asa cum am invatat, dintre algoritmii clasici.
Problema este de a decide daca valoarea cautata se gaseste printre numerele de indice cuprins intre i si j (intial i=1, j=n ). Pentru aceasta vom proceda astfel:
· daca nr coincide cu vloarea de indice (i+j)/2 ( valoarea de la mijloc ) , se tipaeste indicele si se revine din apel (problema a fost rezolvata).
· Contrar, daca i<j (nu s-a cautat peste tot) problema se descompune astfel:
- daca numaul este mai mic decat valoarea testata (din mijloc), inseamna ca avem sanse sa-l gasim intre componentele cu indicele intre i si (i+j)/2-1 , caz in care reapelam functia cu acesti parametri
- daca numarul este mai mare decat valoarea testata (din mijloc), inseamna ca avem sanse sa-l gasim intre componentele cu indicele intre (i + j)/2+1 si j , caz in care reapelam functia cu acesti parametri.
Problema nu se descompune in altele care se rezolva, dupa care nu se compara solutia, ci se reduce la o subproblema. In linii mari , acest rationament este de tip Divide et impera.

#include<iostream.h> int va100i,n,nr;

void caut(int i, int j)
A if (nr==va(i+j)/2i) cout<<”gasit”<<’ ‘<<”indice”<<(i+j)/2; else if (i<j) if (nr<va(i+j)/2i) caut (i , (i+j)/2-1; else caut ((i+j)/2+1,j);
S;

main ( )
A cout<<”n=”;cin>>n; for (int i=1;i<=n;i++)
A cout<<”va“<<i<<”i=”;cin>>vaii;S cout<<”nr=”;cin>>nr; caut (1,n);
S

3) Sortarea prin interclasare
Se considera vectorul a cu n componente numere intregi ( sau reale ). Sa se sorteze crescator, utilizand sortarea prin interclasare.

Daca dispunem de doua siruri de valori, primul cu m elemente, al diolea cu n elemente, ambele sortate, atunci se poate obtine un vector care contine toate valorile soratate. Algoritmul de interclasare este performant, pentru ca efectueaza cel mult m+n-1 comparatii.
Algoritmul de sortare prin interclasare se bazeaza pe urmatoarea idee: pentru a sorta un vector cu n elemente il impatim in doi vectori care, odata sortati, se interclaseaza.

Conform strategiei Divide et impera, problema este descompusa in alte doua subprobleme de acelasi tip si, dupa rezolvarea lor, rezultatele se combina (in particular se interclaseaza). Descompunerea unui vector in alti doi vectori care urmeaza a fi sortati are loc pana cand avem de sortat vectori de una sau doua componente.

In aplicatie, functia sort sorteaza un vector cu maximum doua elemente; interc interclaseaza rezultatele; divimp implementeaza strategia generala a metodei studiate.

#include<iostream.h> int aa10i,n;

void sort (int p,int q, int aa10i )
A int m; if (aapi>aaqi)
A m=aapi; aapi=aaqi; aaqi=m;S
S void interc (int p,int q, int m, int aa10i)
A int ba10i,i,j,k; i=p; j=m+1; k+1;

while ((i<m) && (j<=q)) if (aaii<=baji caki=aai++i else cak++i=baj++i if (i<=m) for (j=1;j<=m;j++) cak++i=aaji else for (i=j;i<=q;i++) cak++i=baii

void divimp (int p, int q, int aa10i)
A int m; if ((q-p)<=1) sort (p,q,a); else
A m=(p+q)/2; divimp(p,m,a); divimp(m+1,q,a); interc(p,q,m,a);
S
S mai ( )
A int i ; cout<<”n=”;cin>>n; for (i=1;i<=n;i++)
A cout<<”aa“<<i<<”i=”;cin>>aaii;S divimp(1,n,a); for (i=1;i<=n;i++) cout<<aaii<<” “;
S

4) Turnurile din Hanoi
Se dau 3 tije simbolizate prin a,b,c. Pe tija a se gasesc discuri de diametre diferite, asezate in ordine descrescatoare a diametrelor privite de jos in sus. Se cere sa se mute de pe tija a pe b, utilizand ca tija intermediara tija c, respectand urmatoarele reguli:
· la fiecare pas se muta un singur disc ;
· nu este permis sa se aseze un disc cu diametrul mai mare peste un disc cu diametrul mai mic.
Rezolvare:

Daca n=1 se face mutarea ab, adica se muta discul de pe tija a pe tija b.

Daca n=2 se fac mutarile ac,ab,cb.

In cazul in care n>2 problema se complica. Notam cu H(n,a,b,c) sirul mutarilor celor n discuri de pe tija a pe tija b , utilizand ca tija intermediara, tija c.

Conform strategiei Divide et impera incercam sa descompunem problema in alte doua subprobleme de acelasi tip, urmand apoi combinarea solutiilor. In acest sens, observam ca mutarea celor n discuri de pe tija a pe tija b,utilizand ca tija intermediara tija c, este echivalenta cu:
· muatrea a n-1 discuri de pe tija a pe tija c , utilizand ca tija intermediara tija b;
· mutarea discului ramas pe tija b;
· mutarea a n-1 discuri de pe tija c pe tija b , utilizand ca tija intermediara tija a.
Parcurgerea celor trei etape permite definirea recursiva a sirului H(n,a,b,c) astfel:

H(n,a,b,c) = A a,b daca n=1
H(n-1,a,c,b),ab,H(n-1,c,b,a), daca n>1

Exemple:

Pentru n=2 avem: H(2,a,b,c)=H(1,a,c,b),ab,H(1,c,b,a)=ac,ab,cb.

Pentru n=3 avem :

H(3,a,b,c)=H(2,a,c,b),ab,H(2,c,b,a)=H(1,a,b,c),ac,H(1,b,c,a),ab,H(1,c,a,b),cb,H(1,a,b,c)=ab,ac,bc,ab,ca,cb,ab.

include <iostream.h> char a,b,c; int n;

void han (int n, char a, char b, char c)
A if (n==1) cout<<a<<b<<endl; else

A han(n-1,a,c,b); cout<<a<<b<<endl; han(n-1,c,b,a);
S
S

main ( )
A cout<<”n=”;cin>>n; a=’a’; b=’b’; c=’c’ ; han(n,a,b,c);
S

Mircea Alexandru


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta