1 / 10

Metoda divide et impera

Download Presentation

Metoda divide et impera

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Metoda Divide et Impera (Imparte si Stapaneste) este o metoda de programare care se aplica problemelor care pot fi descompuse in subprobleme independente, similare problemei initiale, de dimensiuni mai mici si care pot fi rezolvate foarte usor.  Procesul se reia pana cand (in urma descompunerilor repetate) se ajunge la probleme care admit rezolvare imediata. Metodadivide et impera

  2. Sortareaprininterclasare (Merge Sort) • #include<iostream.h>int a[20],n; • void mergesort(inti,intm,int j) • {int b[20],x=i,k=1,y=m+1;  while(x<=m && y<=j)      if (a[x]<a[y])            b[k++]=a[x++];      else            b[k++]=a[y++];  while (x<=m)         b[k++]=a[x++];  while (y<=j)        b[k++]=a[y++]; int t=i;         for (k=1;k<=(j-i)+1;k++)         a[t++]=b[k];      }   • void divimp(inti,int j) {if (i<j)     {int m=(i+j)/2; divimp(i,m);   divimp(m+1,j); mergesort(i,m,j);}}   • void main(){          cout<<"n=";cin>>n;    for(inti=1;i<=n;i++)        {cout<<"a["<<i<<"]="; cin>>a[i];         }           divimp(1,n);cout<<"vectorulsortateste: "<<endl;for(i=1;i<=n;i++) cout<<a[i]<<' '; }

  3. Suma elementelorunui vector • #include<iostream>int v[20],n;intsuma(intli,intls) {int m, d1 ,d2;  if(li!=ls)                 {m=(li+ls)/2;      d1=suma(li,m);        d2=suma(m+1,ls);       return d1+d2;       }  else   return v[li]; }void main()  {            cout<<"n="; cin>>n;      for(inti=1;i<=n;i++)    {cout<<"v["<<i<<"]=";cin>>v[i];} cout<<"sumacelor "<<n<<" elemente ale vectorului "<<suma(1,n);}

  4. Maximulunuinumar. • #include<iostream>int v[100],n; • int max(inti,int j){inta,b;if(i==j) return v[i];else{a=max(i,(i+j)/2);b=max((i+j)/2+1,j);if(a>b) return a;else return b;}} • void main(){cout<<"n=";cin>>n;for(inti=0;i<n;i++){cout<<"v["<<i<<"]=";cin>>v[i];}cout<<"maximuleste:"<<max(0,n-1);}

  5. C.m.m.c • #include<iostream>intcmmdc(int a[20], intli, intls){ if(li==ls) return a[li];  else   { intx,y;    x=cmmdc(a,li,(li+ls)/2);    y=cmmdc(a,(li+ls)/2+1,ls);    while(x!=y)       if(x>y) x=x-y;       else y=y-x;    return x;     }    }void main(){int a[20],n,i;cout<<"n=";cin>>n;for(i=1;i<=n;i++) cin>>a[i];cout<<"cmmdceste: "<<cmmdc(a,1,n);}

  6. Problematurnurilor din Hannoi • #include<iostream>char a,b,c;int n;void h(intn,chara,char b, char c){if(n==1) cout<<a<<b<<" ";else{h(n-1,a,c,b);cout<<a<<b<<" ";h(n-1,c,b,a);}}void main(){cout<<"n=";cin>>n;h(n,'a','b','c');}

  7. Căutarea binară a unui element într-un vector • #include<iostream.h>int v[100],n,x; • void cautare(inti,int j){if(x==v[(i+j)/2])cout<<"gasit"<<" "<<"indice "<<(i+j)/2;elseif(i<j)if(x<v[(i+j)/2])cautare(i,(i+j)/2 -1);else cautare((i+j)/2+1,j);else cout<<"nu s-a gasit";} • void main(){cout<<"n=";cin>>n;for(inti=0;i<n;i++){cout<<"v["<<i<<"]=";cin>>v[i];}cout<<"numarulcautat:";cin>>x;cautare(0,n-1);}

  8. Sortarearapida (Quick sort) • #include<iostream.h>int v[100],n,x; • void caut(inti,int j){if(x==v[(i+j)/2])cout<<"gasit"<<" "<<"indice "<<(i+j)/2;elseif(i<j)if(x<v[(i+j)/2])caut(i,(i+j)/2 -1);else caut((i+j)/2+1,j);else cout<<"nu s-a gasit";} • void main(){cout<<"n=";cin>>n;for(inti=0;i<n;i++){cout<<"v["<<i<<"]=";cin>>v[i];}cout<<"numarulcautat:";cin>>x;caut(0,n-1);}

  9. Problemataieturilor • Problema taieturilor • 7. Se da o bucata dreptungiulara de tabla avand lungimea L si inaltimea h. Pe suprafata ei se gasesc n gauri, de coordonate intregi, stiute, cu diametre neglijabile. Sa se decupeze o bucata de tabla de arie maxima, fara gauri, facand numai taieturi paralele cu laturile placii ( verticale sau orizontale ). • Coordonatele gaurilor sunt retinute in doi vectori vx[i] pentru abscisele gaurilor si vy[i] pentru ordonate ( acesti vectori nu sunt neaparat sortati, gaurile putand fi memorate in ordine cronologica, de exemplu ). Dreptunghiul initial si apoi dreptunghiurile care apar in procesul de taiere sunt memorate prin coordonatele coltului din stanga jos ( x, y ), prin lungime L si prin inaltime h ( fiecare dreptunghi se identifica printr-un set de 4 variabile : x, y, L, h, cu ajutorul carora se formeaza coordonatele celor 4 colturi ). • Pentru fiecare dreptunghi, incepand cu cel initial, cautam daca exista gaura ( existenta gaurii este semnalizata de variabila logica gasit ). Conditiile pentru ca o gaura sa se gaseasca intr-un dreptunghi dat de coordonate ( x, y, L, h ) sunt : • a)                      vx[i] > x • b)                     vx[i] < x+L • c)                     vy[i] > y • d)                     vy[i] < y+h • In situatia cand avem o gaura, vom face prin ea doua taieturi, una orizontala si alta verticala, ceea ce face ca dreptunghiul curent sa se divida in alte patru, deci problema admite o descompunere in alte patru de acelasi tip ( conform strategiei " DIVIDE ET IMPERA " ). Aria maxima se memoreaza prin coordonatele dreptunghiului de arie maxima ( xM, yM, LM, hM ). Daca nu avem gaura in dreptunghiul curent, acesta ar putea fi solutia problemei, deci aria acestuia se compara cu aria maxima retinuta pana la momentul respectiv si daca este cazul, se va retine ca arie maxima.

  10. Fractali: Curbalui Koch • Un fractal este o figurageometricafragmentatasaufranta care poatefidivizata in partiastfelincatfiecaredintreacesteasa fie o copieminiaturala a intregului. • Termenul a fostintrodus de Benoit Mandelbrot in 1975 siestederivat din latinescul “fractus” insemnandspartsaufracturat.

More Related