Documente Academic
Documente Profesional
Documente Cultură
Aplicație
Ridicarea la putere în timp logarithmic sau exponențierea rapidă , complexitatea sa fiind O(log2n). Ea se
bazează pe următoarea formulă:
Observații
Probleme propuse
https://www.pbinfo.ro/probleme/2404/test (ușoară)
https://www.pbinfo.ro/probleme/2398/moka (dificilă)
Algoritmul Divide et Impera
Împarte problema în subprobleme de acelaşi tip
Rezolvă fiecare subproblemă independent
Combină soluţiile subproblemelor pentru a obţine soluţia problemei iniţiale.
Subproblemele în care se descompun problema dată trebuie să fie:
de același tip cu problema dată; 5
}
int main()
{
int V[101], n;
//citire n si V
cout << Suma(V,1,n);
return 0;
}
void DI(int st, int dr) void Merge(int st, int mid, int dr)
{ // interclasam secventa [st,mid] cu
if(st < dr) secventa [mid+1,dr] in vectorul b
{ {
int mid =(st+dr)/2; int b[100001],i,j,k;
DI(st,mid); i=st; j=mid+1;k=1;
DI(mid+1,dr); while(i<=mid && j<=dr)
Merge(st,mid,dr); if(a[i]<a[j]) b[k++]=a[i++];
} else b[k++]=a[j++];
} while(i<=mid)
b[k++]=a[i++];
while(j<=dr)
b[k++]=a[j++];
k=1;
for(i=st;i<=dr;i++)
a[i]=b[k++];
}
Aplicație
https://www.pbinfo.ro/probleme/1025/mergesort
QuickSort
QuickSort sau Sortarea rapidă este este unul dintre cei mai rapizi şi mai utilizaţi algoritmi de sortare
până în acest moment, bazându-se pe tehnica „Divide et impera“, algoritm descoperit în 1960 de
programatorul britanic C.A.R. Hoare.
Pentru un set de n valori oarecare algoritmul efectuează O(nlogn) comparații, dar în cazul cel mai
nefavorabil se efectuează O(n2) comparații. 8
Algoritmul este de tip divide et impera; el sortează o secvență a tabloului (inițial întreg tabloul), astfel:
se alege un element special al listei, numit pivot;
se ordonează elementele listei, astfel încât toate elementele din stânga pivotului să fie mai mici
sau egale cu acesta, și toate elementele din dreapta pivotului să fie mai mari sau egale cu
acesta;
se continuă recursiv cu secvența din stânga pivotului și cu cea din dreapta lui.
void qsort(int st, int dr)
{
int i, j, m = (st+dr) / 2;
int piv = x[m]; // determinăm pivotul
i=st; j=dr;
while (i <= j){
while(x[i] < piv) i++;
while(piv < x[j]) j--;
if (i <= j){
swap(x[i], x[j]);
i++; j--;
}
}
if (i < dr) qsort(i, dr);
if (st < j) qsort(st, j);
}
https://www.pbinfo.ro/probleme/1024/quicksort (medie)
Observații:
în timpul pivotării:
o la fiecare iterație, doar una dintre variabilele i și j se modifică: sau crește i, sau scade j
9
o pivotul este elementul cu indicele care nu se modifică
algoritmul descris mai sus realizează ordonarea crescătoare a tabloului; pentru ordonarea
descrescătoarea algoritmul este asemănător: prin pivotare, elementele din stânga pivotului
devin mai mari decât acesta, cele din dreapta devin mai mici;
algoritmul este cu atât mai rapid cu cât la fiecare etapă cele două secvențe delimitate de pivot
au lungimi cât mai apropiate (ideal egale);
dacă tabloul este de a început ordonat crescător sau descrescător, complexitatea algoritmului
devine pătratică – O(n2);
Problemă: Se dau trei tije, a, b şi c. Pe tija a se află n discuri de dimensiuni diferite, ordonate în ordinea
diametrelor (discul cel mai mare la bază). Se doreşte mutarea tuturor discurilor de pe tija a pe tija b,
utilizând tija intermediară c, cu condiţia ca un disc c, cu condiţia ca un disc cu diametrul mai mare să nu
fie pus pe vreo tijă peste un disc cu dimensiune mai mică.
Rezolvare:
Exemplu numeric:
H(3,a,b,c) = H(2,a,c,b),ab,H(2,c,b,a) =
H(1,a,b,c),ac,H(1,b,c,a),ab,H(1,c,a,b),cb,H(1,a,b,c)
= ab,ac,bc,ab,ca,cb,ab.
void Hanoi (int n, char a, char b, char c)
{
}
https://www.openbookproject.net/py4fun/hanoi/hanoi3.html
*Isoric:
François Édouard Anatole Lucas (cunoscut ca Édouard Lucas), inventatorul jocului, a fost un
matematician francez care a trăit între anii 1842-1891. În studiul său, "Récréations Mathématiques, Vol.
3, pp. 55–59, Gauthier-Villars, Paris, 1893", a notat faptul că există în templul Kashi Vishwanath,
Varanasi, India, un set de 64 de discuri de aur (foarte fragile) pe 3 tije diamantate numite "Turnurile din
Brahma".
Călugării încearcă să rezolve problema matematică "de la începuturile timpului". Deși aparent o poveste
imaginară, o legendă, problema necesită 1.84 × 1019 mutări pentru a fi rezolvată. La o mutare pe
secundă sunt necesare 5.85 x 1011 ani. Legenda spune că atunci când turnul discurilor de aur va fi
complet transferat pe o altă tijă, templul se va prăbuşi iar lumea va lua sfârşit.
Aplicație
https://www.pbinfo.ro/probleme/2527/hanoi (ușoară)
Probleme propuse
https://www.pbinfo.ro/probleme/1149/existaprimedivimp (ușoară)
https://www.pbinfo.ro/probleme/1157/ksort2 (ușoară)
https://www.pbinfo.ro/probleme/1023/cmmdc3 (ușoară)
https://www.pbinfo.ro/probleme/3165/matrdivimp1 (ușoară)
Problema Matrice_Div_Et_Imp | www.pbinfo.ro (medie)
https://www.pbinfo.ro/probleme/3206/nrinversiuni (medie)
Observație
O analiză interesantă a complexității algoritmilor de sortare găsiți aici, platformă - laborator a Universității
Politehnice din București:
http://elf.cs.pub.ro/sda-ab/wiki/laboratoare/laborator-02 (Bubble sort - interschimbare; Selection sort - selecţie
Insertion sort – inserare; Merge sort – interclasare; Quick sort - partiţionare).
Se descrie un algoritm de sortare prin:
timp mediu - timpul de execuţie la care ne aşteptăm, în medie, pentru sortare 11
timp la limită- timpul de execuţie pentru cel mai rău caz posibil
memorie - memoria maximă de care are nevoie algoritmul pentru sortare(excludem memoria deja
alocată înainte de algoritm → vectorul efectiv ce va fi sortat)
stabilitate - un algoritm stabil păstrează ordinea în care apar două elemente cu aceeaşi cheie(atributul
după care sortăm)
Bubble sort Selection sort Insertion sort
timp mediu: O(N^2) timp mediu: O(N^2) timp mediu: O(N^2)
timp la limită: O(N^2) timp la limită: O(N^2) timp la limită: O(N^2)
memorie: O(1) memorie: O(1) memorie: O(1)
Stabil: DA Stabil: DA Stabil: DA
Merge sort Quick sort Intro sort (STL)
timp mediu: O(N log N) timp mediu: O(N log N) timp mediu : O(N log N)
timp la limită: O(N log N) timp la limită: O(N^2) timp la limită : O(N log N)
memorie: O(N) memorie: O(log N) Memorie folosita : O(log N)
Stabil: DA Stabil: NU Stabil : DA
sort-ul din STL este o combinați
între QuickSort randomizat și
HeapSort, numită IntroSort.