Documente Academic
Documente Profesional
Documente Cultură
Prezentare Generală
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
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:
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ă
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.
#include<iostream.h>
int v[100], n, nr;
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ă
Algoritmul este noţiunea fundamentală a informaticii. Totul este construit în jurul algoritmilor (şi a structurilor de
date, cum ar fi listele sau grafurile).
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.
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:
iterativ (repetitiv)
algoritmi backtracking
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
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.