Documente Academic
Documente Profesional
Documente Cultură
Scheme de algoritmi
DIVIDE ET IMPERA
DIVIDE ET IMPERA
Divide et impera
Avantaje i dezavantaje
Complexitatea algoritmului de
sortare prin inserie
Se
{
if(inf>sup) return -1;
// interval gresit
int k=(inf+sup)/2;
// se ia indicele de la mijlocul zonei
if(val==tab[k]) return k;
// s-a gasit elementul cautat
if(val<tab[k]) return cautrec(tab, val, inf, k-1);
//se cauta valoarea val in jumatatea din stanga a zonei
else return cautrec(tab, val, k+1, sup);
// se cauta valoarea val in jumatatea din dreapta a zonei
}
void main()
{
CautBinRec a;
double t[]={-1.35,2.146,7.258,12.9,21.43};
cout<<"-1.35 se afla pe pozitia << a.cautrec(t,1.35,0,4)
<<'\n';
cout<<"7.258 se afla pe pozitia "<<a.cautrec(t,7.258,0,4)
<<'\n';
cout<<"3.055 se afla pe pozitia "<<a.cautrec(t,3.055,0,4)
<<'\n';
}
Algoritmul de interclasare
17
18
-se
Fie vectorul
8 7 9 3 6
4 17 16
Se mparte n 2 secvene:
8 7 9 3 6 4 17 16
n
8 7
8 7
Rezult 7 8
9 3
La fel i pentru secvana
3 9
Rezult:
Ceea ce nseamn c cele dou secvene
determin obinerea urmtorului subir din
vector:
Care
4
6
16
17
la:
Cele 2 secvene iniiale din vector au devenit:
7 8
4 6
Mergesort.cpp
23
24
25
26
Algoritmul naiv
27
Problem propus
Se d o multime M de numere ntregi
i un numr x. Se cere s se determine
dac exist a,b M, a..
a+b=x
Algoritmul propus trebuie s aib
complexitatea (n*log n)
28
Cutarea cu revenire
(backtracking)
Tehnica
Cutarea cu revenire
(backtracking)
Fie
Cutarea cu revenire
(backtracking)
Cazul determinist este cel al structurii de decizie
if <condiie>
then <aciune 1>
else <aciune 2>
n care se consider ca expresia <condiie> poate fi
evaluat nainte de a se executa aciunea 1 sau 2.
n cazul nedeterminist discutat aici, se consider c
la luarea deciziei nu exist informaia necesar pentru a
determina cu siguran pe ce cale trebuie s se continuie executarea programului.
Remarcm c, n cazul problemelor
deterministe soluia este unic, n timp ce
problemele nedeter- ministe pot avea mai multe
soluii, sau niciuna.
Cutarea cu revenire
(backtracking)
Cutarea cu revenire
(backtracking)
Dac i subproblemele P1, P2, ..., Pn sunt tot
nedeterministe, pentru rezolva-rea lor se procedeaz
n acelai mod, astfel c rezolvarea devine recursiv.
Cutarea cu revenire
(backtracking)
La
Cutarea cu revenire
(backtracking)
Aceasta nseamn c, la parcurgerea n
adncime, dup un anumit numr de pai
(posibil mare), se va ajunge la o stare fr
succesor (la o "frunz" a arborelui strilor),
ceea ce face posibil ca, dac nu s-a gsit
soluia, s se revin la o stare anterioar i
s se continue cutarea pe alt cale.
Dac nlimea arborelui ar fi infinit, sar merge mereu n adncime pe o
singur cale, iar revenirea nu ar mai fi
posibil.
Cutarea cu revenire
(backtracking)
Avnd n vedere cele expuse mai sus, la
fel ca la parcurgerea arborilor n adncime,
pentru realizarea cutrii cu revenire
(backtracking) se folosete o stiv.
n fiecare punct de ramificaie (din care
pornesc mai multe ci posibile), starea
curent se pune n stiv pentru a se putea
reveni la ea ulterior, dac pe calea aleas
nu s-a gasit soluia sau dac se caut i
alte soluii.
c se d tabloul tuturor caracterelor folosite ca cifre ale unui sistem de numeraie poziional i se cere s se genereze toate
numerele de n cifre ale sistemului respectiv.
De exemplu, dac cifrele sunt 0 i 1, numerele
de 4 cifre vor fi 0000, 0001, 0010, 0011, 0100,
0101, 0110, 0111, 1000, 1001, 1010, 1011,
1100, 1101, 1110, 1111.
Dac se genereaz toate numerele de n cifre
n baza m, se obin mn numere.
Produsul cartezian
Funcia
Soluia a doua
Condiia