Sunteți pe pagina 1din 14

Tehnica Divide Et Impera

Clasa a XI-a H

Prezentare generala
Metoda 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. 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. Nu toate problemele pot fi rezolvate prin utilizarea acestei tehnici.(numrul celor rezolvabile prin "divide et impera" este relativ mic, tocmai datorit cerinei ca problema s admit o descompunere repetat)
Prof. Iordachi Lizeta-Mihaela 2

Divide et Impera

Dezbina si Conduce

Divide et impera este o tehnic ce admite o implementare recursiv( "ce se ntmpl la un nivel, se ntmpl la orice nivel-avnd grij s asigurm condiiile de terminare). un algoritm prin divide et impera se elaboreaz astfel:
s-a ajuns la o problem care admite o rezolvare imediat (condiia de terminare), caz n care se rezolv i se revine din apel; nu s-a ajuns n situaia de la punctul anterior, caz n care problema curent este descompus n (dou sau mai multe) subprobleme, pentru fiecare din ele urmeaz un apel recursiv al funciei, dup care combinarea rezultatelor are loc fie pentru fiecare subproblem, fie la final, naintea revenirii din apel.

Prof. Iordachi Lizeta-Mihaela

Probleme specifice tehnicii


Cautare binara Turnurile din Hanoi Maximul dintr-un vector Cmmdc Suma elem unui vector Nr prime dintr-un sir Quick sort Merge sort

Prof. Iordachi Lizeta-Mihaela

Cutare binar
Enunt: Se citete un vector cu n componente numere ntregi (numerele se presupun ordonate cresctor) i o valoare ntreag ("nr"). S se decid dac nr se gsete sau nu printre numerele citite, iar n caz afirmativ s se tipreasc indicele componentei care conine aceast valoare. Observatie1: Daca nr se compar pe rnd cu toate cele n componente reprezint o pierdere de performan (nu exploateaz faptul c cele n valori sunt n secven cresctoare). Rezolvare: Vom implementa o funcie care va decide dac valoarea cutat se gsete printre numerele aflate pe poziii de indice cuprins ntre li i ls(iniial, li=1, ls=n) procedand astfel: dac nr coincide cu valoarea de la mijloc, aflat pe poziia de indice m=(li+ls)/2, se tiprete

indicele i se revine din apel (problema a fost rezolvat). n caz contrar, dac mai sunt i alte elemente de analizat (adic li<ls, deci nu au fost verificate toate poziiile necesare), problema se descompune astfel: dac nr este mai mic dect valoarea testat (din mijloc), nseamn c nu se poate afla pe poziiile din partea dreapt, ntruct acestea sunt cel puin mai mari dect valoarea testat. Nr se poate gsi doar printre componentele cu indice ntre li i m - 1, caz n care se reapeleaz funcia cu aceti parametri;[li,m-1] dac nr este mai mare dect valoarea testat (din mijloc), nseamn c nu se poate afla n stnga; se poate gsi doar printre componentele cu indicele ntre m +1 i ls, caz n care se reapeleaz funcia cu aceti parametri.[m+1,ls]

dac nu mai sunt alte elemente de analizat (pentru c i=j i valoarea din mijloc, v*i+, nu coincide cu nr), se concluzioneaz c nr nu apare n cadrul vectorului. Observatie2: problema nu necesit analiza tuturor subproblemelor n care se descompune, ea se reduce la o singur subproblem, iar partea de combinare a soluiilor dispare, rezolvare 5 a este tot de tip "divide et impera".Prof. Iordachi Lizeta-Mihaela

Cautare binara

Prof. Iordachi Lizeta-Mihaela

Maximul dintr-un vector


Se citete un vector cu n componente, numere naturale. Se cere s se tipreasc valoarea maxim. Funcia cutat va genera valoarea maxim dintre numerele reinute n vector pe o poziie dintre i i j (iniial, i=1, j=n). Pentru aceasta, se procedeaz astfel: dac i=j, valoarea maxima va fi v*i+; n caz contrar, se imparte vectorul n doi subvectori - presupunem varianta pentru paralelizare pe 2 procesoare. Se calculeaz mijlocul m al intervalului *i, j+: m = (i+j) div 2. Primul subvector va conine componentele de la i la m, al doilea va conine componentele de la (m+1) la j; se rezolv subproblemele (aflndu-se astfel maximul pentru fiecare din subvectori), iar soluia curent va fi dat de valoarea maxim dintre rezultatele celor dou subprobleme.

Prof. Iordachi Lizeta-Mihaela

Maxim dintr-un vector

Prof. Iordachi Lizeta-Mihaela

Cmmdc
Sa se calculeze cmmdc pentru n numere utilizand metoda divide et impera

Prof. Iordachi Lizeta-Mihaela

Legenda turnului din Hanoi


Atunci cand lumea a fost creata preotilor dintr-un templu din Benares(India) le-au fost daruite 3 ace de diamant si 64 discuri de aur. Preotilor li s-a poruncit sa depuna pe acul din stanga toate discurile in ordine descrescatoare a diametrelor, apoi sa mute intregul turn astfel format pe acul din dreapta, folosind acul din mijloc ca intermediar, mutand cate un disc odata si fara a pune un disc mai mare peste un disc mai mic.

In conformitate cu legenda, Dumnezeu le-a zis oamenilor:

"Cand veti termina de mutat turnul atunci lumea se va sfarsi!"

Prof. Iordachi Lizeta-Mihaela

10

Problema Turnului din Hanoi


Problema Turnurilor din Hanoi este o problema-joc propusa de matematicianul Francez Edouard Lucas(1883)dupa legenda unui templu hindus. In functie de numarul de discuri se pot efectua un numar minim de mutari prezentat in urmatorul tabel:

Prof. Iordachi Lizeta-Mihaela

11

Turnurile din Hanoi


Enunt
Se dau 3 tije simbolizate prin a,b,c. Pe tija a se gasesc n discuri de diametre diferite, asezate in ordine descrescatoare a diametrelor. Se cere sa se mute de pe tija a pe b, utilizand ca tija intermediara tija c, toate cele n discuri, 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 se face mutarea , adica se muta discul de pe tija a pe tija b. Daca n=2 se fac mutarile ac,ab,cb. Daca n>2 . 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.

Mutarea celor n discuri de pe tija a pe tija b,utilizand ca tija intermediara tija c, este echivalenta cu: mutarea a n-1 discuri de pe tija a pe tija c , utilizand ca tija intermediara tija b; mutarea discului ramas de pe tija a pe tija b; mutarea a n-1 discuri de pe tija c pe tija b , utilizand ca tija intermediara tija a.

Prof. Iordachi Lizeta-Mihaela

12

Problema turnurile din Hanoi


#include<iostream> char a,b,c; int n; void h(int n,char a,char b, char c) { if(n==1) cout<<a<<-><<b<<" "; else { h(n-1,a,b,c); cout<<a<<-><<b<<" "; h(n-1,c,b,a); } } int main() { cout<<"n=";cin>>n; h(n,a',b',c'); return 0; }

Prof. Iordachi Lizeta-Mihaela

13

Probleme pentru laborator


1. Folosind metoda Divide et impera sa se afiseze produsul numerelor de la 1..n. Nr n se citeste de la tastura. 2. Se citesc de la tastatura n elemente intregi. Folosind metoda Divide et impera gasiti suma numerelor citite. 3. Folosind metoda Divide et impera sa se gaseasca valoare minima dintr-un sir de n numere intregi. 4. Folosind metoda Divide et impera sa se gaseasca suma numerelor pare dintre 1...n. (n se citeste de la tastatura.) 5. Se citesc de la tastatura n elemente si un numar x. Elementele se citesc in ordine crescatoare. Sa se afiseze pozitia pe care se afla x in sirul de elemente citit. De exemplu: 1) n=5, a=(2,5,6,7,8), x=5 => elementul se gaseste pe pozitia 2 2) n=5, a=(2,5,6,7,8),x=4 => elementul nu se gaseste in sir 6. Se citesc de la tastaura n numere. Folosind metoda Divide et impera afisati cate dintre cele n numere citite sunt prime. 7. Se citesc de la tastatura n numere. Sa se afiseze cmmdc-ul celor n numere citite. Sa se foloseasca metoda Divide et impera.

Prof. Iordachi Lizeta-Mihaela

14