Sunteți pe pagina 1din 6

Prezentare generală

Divide et impera se bazează pe principiul descompunerii problemei în două sau mai multe subprobleme
(mai uşoare), care se rezolvă, iar soluţia pentru problema iniţială se obţine combinând soluţiile
subproblemelor. De multe ori, subproblemele sunt de acelaşi tip şi pentru fiecare din ele se poate aplica
aceeaşi tactică a descompunerii în (alte) subprobleme, până când (în urma descompunerilor repetate) se
ajunge la probleme care admit rezolvare imediată.

Nu toate problemele pot fi rezolvate prin utilizarea acestei tehnici. Se poate afirma că numărul celor
rezolvabile prin "divide et impera" este relativ mic, tocmai datorită cerinţei ca problema să admită o
descompunere repetată.

Divide et impera este o tehnică ce admite o implementare recursivă. Principiul general prin care se
elaborează algoritmi recursivi este: "ce se întâmplă la un nivel, se întâmplă la orice nivel" (având grijă să
asigurăm condiţiile de terminare). Aşadar, un algoritm prin divide et impera se elaborează astfel: la un
anumit nivel avem două posibilităţi:

1. s-a ajuns la o problemă care admite o rezolvare imediată (condiţia de terminare), caz în care se
rezolvă şi se revine din apel;
2. nu s-a ajuns în situaţia de la punctul 1, caz în care problema curentă este descompusă în (două
sau mai multe) subprobleme, pentru fiecare din ele urmează un apel recursiv al funcţiei, după
care combinarea rezultatelor are loc fie pentru fiecare subproblemă, fie la final, înaintea revenirii
din apel.
[modifică]Aplicaţii

[modifică]Maximul dintr-un vector


Se citeşte un vector cu n componente, numere naturale. Se cere să se tipărească valoarea maximă.

Funcţia căutată va genera valoarea maximă dintre numerele reţinute în vector pe o poziţie dintre i şi j
(iniţial, 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 conţine
componentele de la i la m, al doilea va conţine componentele de la (m+1) la j; se rezolvă
subproblemele (aflându-se astfel maximul pentru fiecare din subvectori), iar soluţia curentă va fi dată
de valoarea maximă dintre rezultatele celor două subprobleme.
#include<iostream.h>
int v[10],n;

int max(int i, int j)


{
int a, b, m;
if (i==j) return v[i];
else
{
m = (i+j)/2;
a = max(i, m);
b = max(m+1, j);
if (a>b) return a;
else return b;
}
}

int main( )
{
cout<<”n=”;cin>>n;
for (int i=1; i<=n; i++)
{
cout<<”v[“<<i<<”]=”; cin>>v[i];
}
cout<<”max=”<<max(1,n);
}
[modifică]Căutare binară

Se citeşte un vector cu n componente numere întregi (numerele se presupun ordonate crescător) şi o


valoare întreagă ("nr"). Să se decidă dacă nr se găseşte sau nu printre numerele citite, iar în caz afirmativ
să se tipărească indicele componentei care conţine această valoare.

O rezolvare în care nr se compară pe rând cu toate cele n componente reperzintă o pierdere de


performanţă (nu exploatează faptul că cele n valori sunt în secvenţă crescătoare). Algoritmul care va fi
propus este optim şi se poate spune că face parte dintre algoritmii "clasici".

Funcţia care va fi implementată va decide dacă valoarea căutată se găseşte printre numerele aflate pe
poziţii de indice cuprins între i şi j (iniţial, i=1, j=n). Pentru aceasta, se va proceda astfel:

 dacă nr coincide cu valoarea de la mijloc, aflată pe poziţia de indice (i+j)/2, se tipăreşte indicele şi se
revine din apel (problema a fost rezolvată).
 în caz contrar, dacă mai sunt şi alte elemente de analizat (adică i<j, deci nu au fost verificate toate
poziţiile necesare), problema se descompune astfel:
 dacă nr este mai mic decât valoarea testată (din mijloc), înseamnă că nu se poate afla pe
poziţiile din partea dreaptă, întrucât acestea sunt cel puţin mai mari decât valoarea testată.
Nr se poate găsi doar printre componentele cu indice între i şi (i+j)/2 - 1, caz în care se
reapelează funcţia cu aceşti parametri;
 dacă nr este mai mare decât valoarea testată (din mijloc), înseamnă că nu se poate afla în
stânga; se poate găsi doar printre componentele cu indicele între (i+j)/2 + 1 şi j, caz în care
se reapelează funcţia cu aceşti parametri.

 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.

Această problemă nu mai necesită analiza tuturor subproblemelor în care se descompune, ea se


reduce la o singură subproblemă, iar partea de combinare a soluţiilor dispare. În linii mari, această
rezolvare este tot de tip "divide et impera".

#include<iostream.h>
int v[100], n, nr;

void caut(int i, int j)


{
int m = (i+j)/2;
if (nr==v[m])
cout<<”gasit, indice=”<<m;
else
if (i<j)
if (nr<v[m])
caut(i, m-1);
else caut(m+1, j);
else cout<<”nu a fost gasit.”;
}

int main( )
{
cout<<”n=”; cin>>n;
for (int i=1; i<=n; i++)
{
cout<<”v[“<<i<<”]=”; cin>>v[i];
}
cout<<”nr=”; cin>>nr;
caut (0,n);
}
[modifică]Bibliografie

 Doina Logofătu: Algoritmi fundamentali in C++. Aplicaţii, Ed. 1, Editura Polirom, Iaşi, 2007, ISBN
9734600939.
 Doina Logofătu: Algoritmi fundamentali in Java. Aplicaţii, Ed. 1, Editura Polirom, Iaşi, 2007, ISBN
9734608157.

Algoritm
De la Wikipedia, enciclopedia liberă

Un algoritm (cuvântul are la origine numele matematicianului persan Al-Khwarizmi) înseamnă


în matematică şi informatică o metodă sau o procedură de calcul, alcătuită din paşii elementari necesari pentru
rezolvarea unei probleme sau categorii de probleme. De obicei algoritmii se implementează în mod concret
prin programarea adecvată a unui calculator, sau a mai multora. Din diverse motive există şi algoritmi încă
neimplementaţi, teoretici.

Algoritmul este noţiunea fundamentală a informaticii. Totul este construit în jurul algoritmilor (şi a structurilor de
date, cum ar fi listele sau grafurile).

Câteva exemple de algoritmi:

 algoritmul de construcţie a unui automobil (urmărind procedeele şi schiţele de fabricaţie);

 algoritmul de folosire a unei maşini-unelte (citind manualul de folosire);

 algoritmul de explorare a unui labirint în vederea găsirii unei ieşiri (una din soluţii: se ţine o mână pe perete
şi se merge fără a o dezlipi de acesta).

 algoritmul (ordinea operaţiilor, sau "check list ") la decolarea unui turbojet. Acest algoritm desigur nu ţine în
mod direct de domeniul matematicii sau informaticii.

 Algoritm pentru Semnături Digitale


Cuprins
[ascunde]

 1 Proprietăţi

 2 Clasificări
 3 Bibliografie

 4 Lectură suplimentară

 5 Legături externe

[modifică]Proprietăţi

Cele mai importante proprietăţi ale unui algoritm, îndeplinite de diverşii algoritmi într-o măsură mai mare sau
mai mică, sunt următoarele:

 Corectitudinea - este proprietatea algoritmului de a furniza o soluţie corectă a problemei date. În acest
sens este de dorit ca algoritmii să se bazeze pe fapte şi relaţii matematice demonstrabile.

 Caracterul univoc sau deterministic - plecând de la un set de date iniţial anume, rezultatul este unic, sau
altfel spus, repetarea execuţiei algoritmului duce întotdeauna la aceleaşi rezultate.

 Generalitatea - este proprietatea unui algoritm de a rezolva o clasă sau categorie de probleme, şi nu doar
o singură problemă particulară. Spre exemplu, un algoritm care rezolvă doarecuaţia x2 + 5x − 6 = 0 este mai
puţin general decât unul care rezolvă ecuaţia ax2 + bx + c = 0, oricare ar fi valorile lui a,b,c.

 Claritatea - proprietatea algoritmului de a descrie cu exactitate şi fără ambiguităţi paşii care trebuiesc
parcurşi în rezolvarea problemei.

 Verificabilitatea - acea proprietate a algoritmelor care permite ca fiecare pas să poată fi verificat într-un
timp rezonabil de către om, folosind mijloace de validare de încredere.

 Optimalitatea - proprietatea unui algoritm de a se termina după un număr minim de paşi. Spre exemplu,
dacă se cere să se calculeze suma primelor 'n' numere naturale, se poate aplica formula de calcul, şi astfel
algoritmul se termină într-un singur pas, pe când dacă am aduna toate numerele de la 1 la n, el s-ar
termina abia în n paşi, şi deci nu ar fi optim. Înteoria complexităţii se foloseşte notaţia O(n).

 Finitudinea - este proprietatea algoritmului de a se termina într-un număr finit de paşi. Există şi algoritmi
care nu se termină într-un număr mărginit de paşi, dar aceştia se numesc "metode algoritmice".

 Eficienţa - este proprietatea unui algoritm de a se termina nu numai într-un număr finit, ci şi "rezonabil" de
paşi, chiar dacă acesta nu este cel mai mic posibil (nu este optim). Algorimul este ineficient şi dacă
rezultatul se obţine într-un timp mai lung decât cel dorit sau permis.

 Existenţa unei intrări (datele de prelucrat). Întrucât operatorii se aplică unui operand (sau şi mai multor
operanzi deodată), este de neconceput un algoritm fără niciun operand. Intrările permise formează
împreună un set (mulţime) specific de obiecte sau valori, care se numeşte "domeniul" algoritmului.

 Existenţa unei ieşiri (rezultatele). Este de neconceput un algoritm care nu are nicio ieşire, deoarece în
acest caz intră în discuţie însăşi utilitatea sa.
[modifică]Clasificări
În funcţie de modul de implementare, un algoritm poate fi:

 recursiv - face uz de sine însuşi, în mod repetat

 iterativ (repetitiv)

 serial sau paralel

 deterministic sau aleatoriu (probabilistic)

 exact sau aproximativ

În funcţie de paradigma utilizată, ei pot fi:

 algoritmi backtracking

 algoritmi de gen divide et impera

 algoritmi de programare dinamică

 algoritmi de tip greedy

 algoritmi probabilistici, genetici, euristici ş.a.


[modifică]Bibliografie

 Donald E. Knuth - Arta Programării Calculatoarelor (ed. 2), Volumul 1: Algoritmi Fundamentali
 en Herbert S. Wilf - Algorithms and Complexity (PDF Document)

 en Martin Davis - The Undecidable: Basic Papers On Undecidable Propostions, Unsolvable Problems and

Computable Functions, Raven Press, New York, 1965

 Doina Logofătu: Algoritmi fundamentali in C++. Aplicaţii, Ed. 1, Editura Polirom, Iaşi, 2007, ISBN
9734600939.

 Doina Logofătu: Algoritmi fundamentali in Java. Aplicaţii, Ed. 1, Editura Polirom, Iaşi, 2007, ISBN
9734608157.

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