Sunteți pe pagina 1din 25

Metoda de programare

Divide et Impera

Prof:Neciu Ileana
LICEUL
ECONOMIC ADMINISTRATIV

CUPRINS

Prezentare general
Aplicaii
Valoarea maxim dintr-un vector
Sortarea prin interclasare
Sortarea rapid
Tunurile din Hanoi
Fractali-Curba lui Koch

PREZENTARE GENERAL

Divide et impera

Apasa
aic
testul d i pentru
e evalu
are
initial

Divide et impera se bazeaz pe principiul


descompunerii problemei n dou sau mai multe
subprobleme (mai uoare), care se rezolv, iar
soluia pentru problema iniial se obine combinnd
soluiile subproblemelor. De multe ori,
subproblemele sunt de acelai tip i pentru fiecare
din ele se poate aplica aceeai tactic a
descompunerii n (alte) subprobleme, pn cnd (n
urma descompunerilor repetate) se ajunge la
probleme care admit rezolvare imediat.

1. Completai urmtoarele afirmaii:(4p)

. parametrilor transmii prin valoare;


..parametrilor transmii prin referin;
.. variabilelor locale.

recursivitatea reprezint acel mecanism prin care un subprogram se


pentru a putea implementa recursivitatea se folosete structura de date numit...
atunci cnd un subprogram se autoapeleaz se depun n stiv:

Specificai valoarea de adevr a afirmaiei: pentru orice algoritm iterativ exist unul recursiv echivalent. Echivalena este
adevrat?

2. Ce va afia urmtorul program dac se citesc de la tastur numerele13i 17 :(4p)


#include<iostream.h>
int a,b;
int ab(int a)
{
if(a>0) return a%2+ab(a/2);
else
return 0;}
void main()
{ cout << a=; cin>>a;
cout << b=; cin>>b;
cout << ab(a)+ab(b);
}

a) 8

b) 7

c) 5

d)6

APLICATIA 1
VALOAREA MAXIM DINTRUN VECTOR

Apas aici pentru a


vizualiza executabilul

Valoarea maxim dintr-un vector


Se citeste un vector cu n componente, numere naturale. Se
cere s se tipreasc valoarea maxim.
Rezolvare. Trebuie tiprit valoarea maxim dintre numerele
reinute n vector de la i la j (iniial, i=1 i j=n).
Pentru aceasta, procedm astfel:
Dac i=j, valoarea maxim va fi v[i];
Contrar, vom mpri vectorul n doi vectori (primul vector va
conine componentele de la i la (i+j) div 2, al doilea va conine
componentele de la (i+j) div 2+1 la j, rezolvm subproblemele
(aflm maximul pentru fiecare din ele), iar soluia problemei va fi
data de valoarea maxim dintre rezultatele celor dou
subprobleme.
Apas aici
pentru a
vedea un
exemplu

#include<iostream.h>
#include<conio.h>
int v[10], n;
int max (int i, int j)
{int a, 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;}}
main()
{cout<<"n= " ; cin>>n;
for (int i=1; i<=n; i++)
{cout<<"v[" <<i<<"]=";
cin>>v[i];}
cout<<"max="<<max(1,n);
getch();}

EXEMPLU
1
7

2
1

n=5
3
13

4
14

5
2

APLICATIA 2
SORTAREA
PRIN INTERCLASARE

Apas aici pentru a


vizualiza executabilul

Sortarea prin interclasare


Se consider vectorul a cu n componente numere ntregi (sau reale). S
se sorteze cresctor, utiliznd sortarea prin interclasare.
Rezolvare
Algoritmul de sortare prin interclasare se bazeaz pe urmtoarea idee: pentru a
sorta un vector cu n elemente l mprim n doi vectori care, odat sortai, se
interclaseaz.
Conform strategiei generale DIVIDE ET IMPERA, problema este descompus n
alte dou subprobleme de acelai tip i, dup rezolvarea lor rezultatele se combin
(n particular se interclaseaz). Descompunerea unui vector n ali doi vectori care
urmeaz a fi sortai are loc pn cnd avem de sortat vectori de una sau dou
componente.
n aplicaie, funcia sort sortez un vector cu maximum dou elemente; interc
interclaseaz rezultatele; divimp implementeaz strategia general a metodei
studiate.

#include<iostream.h>
int a[10], n;
void sort (int p, int q, int a[10])
{
int m;
if (a[p]>a[q])
{m=a[p];
a[p]=a[q];
a[q]=m;
}
}
void interc (int p, int q, int m, int a[10])
{int b[10], I, j, k;
i=p; j=m+1; k=1;
while (i<=m && j<=q)
if (a[i]<=a[j])
{b[k]=a[i];
i=i+1;
k=k+1;
}
else
{b[k]=a[j];
j=j+1;
k=k+1;
}
if (i<=m)
for(j=I; j<=m; j++)
{b[k]=a[j];
k=k+1;
}
else

for (i=j; j<=q; j++)


{b[k]=a[i];
k=k+1;
}
k=1;
for (i=p; i<=q; i++)
{a[i]=b[k];
k=k+1;
}
}
void divimp (int p, int q, int a[10])
{int m;
if ((q-p)<=1) sort (p, q, a);
else
{m=(p+q)/2;
divimp (p, m, a);
divimp (m+1, q, a);
interc(p, q, m, a);
}
}
main ()
{int i;
cout<<n=; cin>>n;
for (i=1; i<=n; i++)
{cout<<a[<<i<<]=;
cin>>a[i];
}
divimp (1,n, a);
for (i=1; i<=n; i++)
cout<<a[i]<< ;
}

APLICATIA 3
SORTAREA RAPID

Sortarea rapid
Fie vectorul a cu n componente numere ntregi (sau reale). Se cere ca vectorul s fie sortat
crescator.

Rezolvare. Este necesara o funcie POZ care trateaz o poriune din vector, cuprins ntre
indicii dai de li (limita inferioar) i ls (limita superioar). Rolul acestei funcii este de a
poziiona prima component a [li] pe o poziie k cuprins intre li i ls, astfel nct toate componentele
vectorului cuprinse ntre li i k-1 s fie mai mici sau egale dect a [k] i toate componentele vectorului
cuprinse intre k+1 i ls s fie mai mari sau egale dect a [k].
n aceast funcie exist dou moduri de lucru:

i rmne constant, j scade cu 1;

i crete cu 1, j rmne constant.

Funcia este conceput astfel:

iniial, i va lua valoarea li, iar j va lua valoarea ls (elementul care iniial se afl pe poziia li se va
gasi mereu pe o poziie dat de i sau de j);

se trece n modul de lucru a);

att timp ct i<j, se execut :

dac a[i] este strict mai mare dect a [j], atunci se inverseaz cele dou numere i se
schimb modul de lucru;

i i j se modific corespunztor modului de lucru n care se afl programul;

k ia valoarea comuna a lui i i j.

APLICATIA 4
TUNURILE DIN HANOI

Tunurile din Hanoi


Se dau 3 tije simbolizate prin a, b, c. Pe tija a se gsesc discuri de diametre diferite, aezate n
ordine descresctoare a diametrelor privite de jos n sus. Se cere s se mute discurile de pe tija a pe
tija b, utiliznd ca tij intermediar tija c, respectnd urmtoarele reguli:
- la fiecare pas se mut un singur disc
- nu este permis s se aeze un disc cu diametrul mai mare peste un disc cu diametrul mai mic.

Rezolvare.
Dac n=1, se face mutarea ab, adic se mut discul de pe tija a pe tija b.
Dac n=2, se fac mutrile ac, ab, cb.
n cazul n care n>2, problema se complic. Notam cu H(n, a, b, c) irul mutrilor celor n discuri de pe
tija a pe tija b, utiliznd ca tij intermediara, tija c.
Conform strategiei DIVIDE ET IMPERA, ncercam s descompunem problema n alte dou
subprobleme de acelai tip, urmnd apoi combinarea soluiilor. n acest sens, observm c mutarea
celor n discuri de pe tija a pe tija b, utiliznd ca tij intermediara tija c, este echivalent cu:
mutarea a n-1 discuri de pe tija a pe tija c, utiliynd ca tij intermediar tija b; mutarea discului rmas
pe tija b; mutarea a n-1 discuri de pe tija c pe tija b, utiliznd ca tija intermediara tija a.
Parcurgerea celor trei etape permite definirea recursiv a irului H (n, a, b, c) astfel:

H(n, a, b, c)=

ab, n 1

H n 1, a, c, b , ab, H n 1, c, b, a , n 1

Apas aici
pentru a
vedea un
exemplu

AB

AC

BC

AB

CA

CB

AB

APLICATIA 5
FRACTALI

Fractali

Se consider un triunghi echilateral. Fiecare latur a


sa se transform astfel:

Fiecare latur a acestui poligon se transform din


nou, dup aceeai regul. Se cere s se vizualizeze
figura obinut dup ls pai ( numr citit de la
tastatur).

Programul principal va apela, pentru fiecare segment care


constituie o latur a triunghiului, o procedur numit generator.
Algoritmul care st la baza procedurii generator:
Se pornete de la segmentul AB;
Se determin coordonatele punctului care constituie vrful
triunghiului echilateral( V)
n cazul n care segmentul nu a fost transformat de ls ori, se
apeleaz generator pentru segmentele AC, CV, VD, DB
Contrar, se apeleaz procedura care traseaz linia frnt
ACVDB

INTREBARE..

Se da urmatorul vector:( algoritmul de interclasare)


61 11 92 24 99 80 13 85 7 93 79
a) n=?
b) intre ce indici va fi divizat vectorul prima data?
c) care portiune a vectorului va fi divizata in continuare?
d) ce se va intampla in continuare?
e) in cate grupe va fi impartita ce a de a 2 a jumatate?
f) ce va face programul in continuare?

SITE-URI DE INFORMARE

http://ro.wikipedia.org/wiki
www.didactic.ro
www.subiecte2008.edu.ro
www.ginfo.ro
www.referate.ro
www.edu.ro

BIBLIOGRAFIE

Manual de informatic intensiv, clasa a XI-a- Editura


L&S Soft, Vlad Huanu i Tudor Sorin [64..88]
Probleme rezolvate i algoritmi, Editura Polirom, Doina
Hrinciuc Logoftu[216..222]
Culegere de probleme de informatic, Editura Petrion,
Adrian Atanasiu i Rodica Pintea [168..193]
Materiale educaionale AEL SC SIVECO SA
L. Livovschi, G. Georgescu, Sinteza i analiza
algoritmilor, Ed. Stiinific i Enciclopedic, 1986

RECAPITULARE
1. In ce consta metoda Divide et Impera?
2. Tunurile din Hanoi. Pornind de la definirea recursiva a
sirului
H(n,a,b,c)= ab, ptr. n=1,

H(n-1, a,c,b), ab, H(n-1, c,b,a) ptr. n>1


pentru n=3 care sunt mutarile discurilor?

S-ar putea să vă placă și