Sunteți pe pagina 1din 66

Căutare secvenţială Căutare binară Diverse sortări

Curs Algoritmi Fundamentali


Căutări şi sortări

Lect. dr. Alexandra Băicoianu

Universitatea Transilvania din Braşov


Facultatea de Matematică şi Informatică

2018
Căutare secvenţială Căutare binară Diverse sortări

Contents

1 Căutare secvenţială

2 Căutare binară

3 Diverse sortări
Căutare secvenţială Căutare binară Diverse sortări

Căutare secvenţială

Cât este complexitatea algoritmului de căutare pentru un


tablou de dimensiune n?
Căutare secvenţială Căutare binară Diverse sortări

Căutare secvenţială

Cât este complexitatea algoritmului de căutare pentru un


tablou de dimensiune n?
Caz favorabil Θ(1)
Căutare secvenţială Căutare binară Diverse sortări

Căutare secvenţială

Cât este complexitatea algoritmului de căutare pentru un


tablou de dimensiune n?
Caz favorabil Θ(1)
Caz defavorabil Θ(n)
Căutare secvenţială Căutare binară Diverse sortări

Căutare secvenţială

Cât este complexitatea algoritmului de căutare pentru un


tablou de dimensiune n?
Caz favorabil Θ(1)
Caz defavorabil Θ(n)
Caz mediu
1 1 1 1
n+1 ∗ 1 + n+1 ∗ 2 + ... n+1 ∗ n + n+1 ∗ n = ... ≈ Θ(n)
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (I)

Cât este complexitatea algoritmului de căutare pentru un


tablou de dimensiune n?
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (I)

Cât este complexitatea algoritmului de căutare pentru un


tablou de dimensiune n?
Caz favorabil Θ(1)
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (I)

Cât este complexitatea algoritmului de căutare pentru un


tablou de dimensiune n?
Caz favorabil Θ(1)
Caz defavorabil Θ(log2 n)
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (II)

Caz mediu, presupunem n = 2k (log2 n = k )


Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (II)

Caz mediu, presupunem n = 2k (log2 n = k )


Găsim elementul la prima comparaţie, probabilitate n1 ,
număr de operaţii 1
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (II)

Caz mediu, presupunem n = 2k (log2 n = k )


Găsim elementul la prima comparaţie, probabilitate n1 ,
număr de operaţii 1
Găsim elementul la a doua comparaţie, probabilitate n2 ,
număr de operaţii 2
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (II)

Caz mediu, presupunem n = 2k (log2 n = k )


Găsim elementul la prima comparaţie, probabilitate n1 ,
număr de operaţii 1
Găsim elementul la a doua comparaţie, probabilitate n2 ,
număr de operaţii 2
...
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (II)

Caz mediu, presupunem n = 2k (log2 n = k )


Găsim elementul la prima comparaţie, probabilitate n1 ,
număr de operaţii 1
Găsim elementul la a doua comparaţie, probabilitate n2 ,
număr de operaţii 2
...
k −1
Găsim elementul la a k-a comparaţie, probabilitate 2 n ,
număr de operaţii k
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (II)

Caz mediu, presupunem n = 2k (log2 n = k )


Găsim elementul la prima comparaţie, probabilitate n1 ,
număr de operaţii 1
Găsim elementul la a doua comparaţie, probabilitate n2 ,
număr de operaţii 2
...
k −1
Găsim elementul la a k-a comparaţie, probabilitate 2 n ,
număr de operaţii k
Dac
Pk ă luăm suma: P
2i−1 1 k i−1 = ... < log n
i=1 n ∗ i = n ∗ i=1 i ∗ 2 2
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (II)

Caz mediu, presupunem n = 2k (log2 n = k )


Găsim elementul la prima comparaţie, probabilitate n1 ,
număr de operaţii 1
Găsim elementul la a doua comparaţie, probabilitate n2 ,
număr de operaţii 2
...
k −1
Găsim elementul la a k-a comparaţie, probabilitate 2 n ,
număr de operaţii k
Dac
Pk ă luăm suma: P
2i−1 1 k i−1 = ... < log n
i=1 n ∗ i = n ∗ i=1 i ∗ 2 2
Complexitate medie este O(log2 n)
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară (II)

Caz mediu, presupunem n = 2k (log2 n = k )


Găsim elementul la prima comparaţie, probabilitate n1 ,
număr de operaţii 1
Găsim elementul la a doua comparaţie, probabilitate n2 ,
număr de operaţii 2
...
k −1
Găsim elementul la a k-a comparaţie, probabilitate 2 n ,
număr de operaţii k
Dac
Pk ă luăm suma: P
2i−1 1 k i−1 = ... < log n
i=1 n ∗ i = n ∗ i=1 i ∗ 2 2
Complexitate medie este O(log2 n)
Complexitate totală este O(log2 n)
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară - varianta recursivă(III)

Cum calculăm complexitatea pentru un algoritm recursiv?


Căutare secvenţială Căutare binară Diverse sortări

Căutare binară - varianta recursivă(III)

Cum calculăm complexitatea pentru un algoritm recursiv?


Primul pas: stabilirea formulei de recurenţă. Presupunem
că : end-start=n, atunci T (n) = 1, n <= 1 şi
T (n) = T ( n2 ) + 1, altfel
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară - varianta recursivă(III)

Cum calculăm complexitatea pentru un algoritm recursiv?


Primul pas: stabilirea formulei de recurenţă. Presupunem
că : end-start=n, atunci T (n) = 1, n <= 1 şi
T (n) = T ( n2 ) + 1, altfel
La algoritmii recursivi e important să avem şi termenul
constant
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară - varianta recursivă(III)

Cum calculăm complexitatea pentru un algoritm recursiv?


Primul pas: stabilirea formulei de recurenţă. Presupunem
că : end-start=n, atunci T (n) = 1, n <= 1 şi
T (n) = T ( n2 ) + 1, altfel
La algoritmii recursivi e important să avem şi termenul
constant
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară - varianta recursivă(IV)

Cum calculăm complexitatea, caz mediu?


Căutare secvenţială Căutare binară Diverse sortări

Căutare binară - varianta recursivă(IV)

Cum calculăm complexitatea, caz mediu?


Notăm n = 2k şi calculăm toate valorile
T (2k ) = T (2k −1 ) + 1, ..., T (21 ) = T (20 ) + 1
Căutare secvenţială Căutare binară Diverse sortări

Căutare binară - varianta recursivă(IV)

Cum calculăm complexitatea, caz mediu?


Notăm n = 2k şi calculăm toate valorile
T (2k ) = T (2k −1 ) + 1, ..., T (21 ) = T (20 ) + 1
Adunăm toate aceste valori si obţinem T (2k ) = k + 1,
unde k = log2 n deci complexitatea se obţine O(log2 n)
Căutare secvenţială Căutare binară Diverse sortări

Sortări?
Căutare secvenţială Căutare binară Diverse sortări

Sortare prin selecţie. Exemplu


Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin selecţie

Cum calculăm complexitatea?


Pn Pn Pn n∗(n+1)
i=1 j=i+1 1 = i=1 (n − i) = n ∗ n − 2
Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin selecţie

Cum calculăm complexitatea?


Pn Pn Pn n∗(n+1)
i=1 j=i+1 1 = i=1 (n − i) = n ∗ n − 2
T (n) ∈ Θ(n2 )
Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin selecţie

Cum calculăm complexitatea?


Pn Pn Pn n∗(n+1)
i=1 j=i+1 1 = i=1 (n − i) = n ∗ n − 2
T (n) ∈ Θ(n2 )
Cazul favorabil pentru sortări: când tabloul e deja sortat.
Dar la sortarea prin selecţie?
Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin metoda bulelor. Exemplu


Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin metoda bulelor

Cum calculăm complexitatea?


Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin metoda bulelor

Cum calculăm complexitatea?


Caz favorabil Θ(n)
Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin metoda bulelor

Cum calculăm complexitatea?


Caz favorabil Θ(n)
Caz defavorabil Θ(n2 )
Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin metoda bulelor

Cum calculăm complexitatea?


Caz favorabil Θ(n)
Caz defavorabil Θ(n2 )
Caz mediu Θ(n2 )
Căutare secvenţială Căutare binară Diverse sortări

Interclasare

Ce înseamnă "a interclasa"?


Interclasarea clasică (2 şiruri sortate, rezultă interclasarea lor
într-un al treilea şir, tot sortat)
Complexitatea este...?
Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin interclasare. Exemplu


Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin interclasare. Pseudocod


Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin interclasare. Complexitate

Este vorba despre un algoritm recursiv, deci stabilim relaţia


de recurenţă T (n) = 1, n <= 1 şi T (n) = 2 ∗ T ( n2 ) + n, altfel
Căutare secvenţială Căutare binară Diverse sortări

Sortarea prin interclasare. Complexitate

Este vorba despre un algoritm recursiv, deci stabilim relaţia


de recurenţă T (n) = 1, n <= 1 şi T (n) = 2 ∗ T ( n2 ) + n, altfel
T (n) = 2 ∗ T ( n2 ) + n, presupunem n = 2k şi obţinem
T (n) ∈ Θ(n ∗ log2 n)
Căutare secvenţială Căutare binară Diverse sortări

Discuţii despre complexităţi şi sortări

Sortarea prin interclasare are complexitatea cea mai bună,


Θ(n ∗ log2 n)
Căutare secvenţială Căutare binară Diverse sortări

Discuţii despre complexităţi şi sortări

Sortarea prin interclasare are complexitatea cea mai bună,


Θ(n ∗ log2 n)
Θ(n ∗ log2 n) este cea mai bună complexitate posibilă
pentru un algoritm de sortare. Există şi algoritmi cu
complexitate mai mică, dar ei funcţionează pentru date
care îndeplinesc diferite condiţii.
Căutare secvenţială Căutare binară Diverse sortări

Discuţii despre complexităţi şi sortări

Sortarea prin interclasare are complexitatea cea mai bună,


Θ(n ∗ log2 n)
Θ(n ∗ log2 n) este cea mai bună complexitate posibilă
pentru un algoritm de sortare. Există şi algoritmi cu
complexitate mai mică, dar ei funcţionează pentru date
care îndeplinesc diferite condiţii.
Obţinerea unei complexităţi mai bune are un cost. Care?
Căutare secvenţială Căutare binară Diverse sortări

Discuţii despre complexităţi şi sortări

Sortarea prin interclasare are complexitatea cea mai bună,


Θ(n ∗ log2 n)
Θ(n ∗ log2 n) este cea mai bună complexitate posibilă
pentru un algoritm de sortare. Există şi algoritmi cu
complexitate mai mică, dar ei funcţionează pentru date
care îndeplinesc diferite condiţii.
Obţinerea unei complexităţi mai bune are un cost. Care?
Un alt algoritm cu această complexitate este QuickSort -
sortare cu partiţionare (Discuţii. Complexitate)
Căutare secvenţială Căutare binară Diverse sortări

QuickSort - Pseudocod
Căutare secvenţială Căutare binară Diverse sortări

QuickSort - Implementare
Căutare secvenţială Căutare binară Diverse sortări

QuickSort - Exemplu

log15
2 ≈4

4 treceri prin toate elementele tabloului sau 4 paşi de


partiţionare integrală a tabloului
Dezavantaje?
Căutare secvenţială Căutare binară Diverse sortări

Bucket Sort - Altfel de sortare

Este un algoritm de sortare util pentru situaţia de numere


pozitive întregi care nu depăşesc o anumită limită
superioară.
Căutare secvenţială Căutare binară Diverse sortări

Bucket Sort - Altfel de sortare

Este un algoritm de sortare util pentru situaţia de numere


pozitive întregi care nu depăşesc o anumită limită
superioară.
Cel mai bun caz de a utiliza acest algoritm: avem multe
valori de sortat care se repetă/sunt uniform distribuite
peste un rang dat.
Căutare secvenţială Căutare binară Diverse sortări

Bucket Sort. Exemple (I)

Avem un tablou cu lunile de naştere pentru mai multe


persoane, dorim să ordonăm acest tablou.
*************
Sortaţi un tablou mare de numere între 0.0 şi 1.0 uniform
distribuite. Cum sortăm numerele eficient?
Căutare secvenţială Căutare binară Diverse sortări

Bucket Sort. Exemple (II)


Căutare secvenţială Căutare binară Diverse sortări

Bucket Sort. Pseudocod


Căutare secvenţială Căutare binară Diverse sortări

Bucket Sort. Complexitate

Complexitatea pentru BucketSort este: Θ(n + max) -


Discuţii
Căutare secvenţială Căutare binară Diverse sortări

Bucket Sort. Complexitate

Complexitatea pentru BucketSort este: Θ(n + max) -


Discuţii
Ce se întâmplă dacă avem numere negative uniform
distribuite şi vrem să se sortăm cu BucketSort? Cum
facem?
Căutare secvenţială Căutare binară Diverse sortări

Tipuri de sortări. Când folosim/Ce folosim?

Metoda selecţiei: + cel mai intuitiv mod de sortare, - chiar


şi cel mai perfect sortat input, necesită minim o parcurgere,
+ se foloseşte când faci ceva rapid şi "dirty", + in-place
Căutare secvenţială Căutare binară Diverse sortări

Tipuri de sortări. Când folosim/Ce folosim?

Metoda selecţiei: + cel mai intuitiv mod de sortare, - chiar


şi cel mai perfect sortat input, necesită minim o parcurgere,
+ se foloseşte când faci ceva rapid şi "dirty", + in-place
Metoda bulelor: + util pentru seturi mici de date, + uşor de
implementat, + in-place, - eficienţă redusă
Căutare secvenţială Căutare binară Diverse sortări

Tipuri de sortări. Când folosim/Ce folosim?

Metoda selecţiei: + cel mai intuitiv mod de sortare, - chiar


şi cel mai perfect sortat input, necesită minim o parcurgere,
+ se foloseşte când faci ceva rapid şi "dirty", + in-place
Metoda bulelor: + util pentru seturi mici de date, + uşor de
implementat, + in-place, - eficienţă redusă
Sortare Interclasare: + poate fi folosit pentru date de orice
mărime, + stable, - nu e in-place, + se foloseşte intens
pentru sortarea de linked list, unde accesul secvenţial este
necesar
Căutare secvenţială Căutare binară Diverse sortări

Tipuri de sortări. Când folosim/Ce folosim?

QuickSort: + rapid în cazuri de date random, + in-place,


chiar daca e recursiv, + rapid (ciclul repetititv din interior
este foarte scurt şi se poate optimiza foarte bine), + are
performanţe deosebite în cazul tablourilor dezordonate, -
foarte nesigur pentru cazul defavorabil (O(n2 )), -
performanţe slabe pentru tablourile banale
Căutare secvenţială Căutare binară Diverse sortări

Tipuri de sortări. Când folosim/Ce folosim?

QuickSort: + rapid în cazuri de date random, + in-place,


chiar daca e recursiv, + rapid (ciclul repetititv din interior
este foarte scurt şi se poate optimiza foarte bine), + are
performanţe deosebite în cazul tablourilor dezordonate, -
foarte nesigur pentru cazul defavorabil (O(n2 )), -
performanţe slabe pentru tablourile banale
BucketSort: + poate fi folosit ca şi un algoritm "extern" de
sortare, + rezultate foarte bune atunci când datele sunt
uniform distribuite, - complexitatea creşte foarte mult atunci
când mărim numărul de inputuri
Căutare secvenţială Căutare binară Diverse sortări

Tipuri de sortări. Când folosim/Ce folosim?

QuickSort: + rapid în cazuri de date random, + in-place,


chiar daca e recursiv, + rapid (ciclul repetititv din interior
este foarte scurt şi se poate optimiza foarte bine), + are
performanţe deosebite în cazul tablourilor dezordonate, -
foarte nesigur pentru cazul defavorabil (O(n2 )), -
performanţe slabe pentru tablourile banale
BucketSort: + poate fi folosit ca şi un algoritm "extern" de
sortare, + rezultate foarte bune atunci când datele sunt
uniform distribuite, - complexitatea creşte foarte mult atunci
când mărim numărul de inputuri
https:
//www.toptal.com/developers/sorting-algorithms/
Căutare secvenţială Căutare binară Diverse sortări

Ce contează în alegerea unui algoritm de sortare?

Cantitatea de date pe care dorim să le sortăm


Căutare secvenţială Căutare binară Diverse sortări

Ce contează în alegerea unui algoritm de sortare?

Cantitatea de date pe care dorim să le sortăm


Cât de sortate sunt deja datele
Căutare secvenţială Căutare binară Diverse sortări

Ce contează în alegerea unui algoritm de sortare?

Cantitatea de date pe care dorim să le sortăm


Cât de sortate sunt deja datele
Complexitatea de timp (diferă de running time)
Căutare secvenţială Căutare binară Diverse sortări

Ce contează în alegerea unui algoritm de sortare?

Cantitatea de date pe care dorim să le sortăm


Cât de sortate sunt deja datele
Complexitatea de timp (diferă de running time)
Complexitatea de spaţiu
Căutare secvenţială Căutare binară Diverse sortări

Good to know:)

Quicksort (qsort in C, std::sort in most cases for C++)


Căutare secvenţială Căutare binară Diverse sortări

Good to know:)

Quicksort (qsort in C, std::sort in most cases for C++)


Timsort (A hybrid stable sort consisting of Insertion sort,
merge sort and selection sort. Rumored to be better than
qsort. Python’s default sort algorithm, Used in Java’s
Arrays.sort())
Căutare secvenţială Căutare binară Diverse sortări

Good to know:)

Quicksort (qsort in C, std::sort in most cases for C++)


Timsort (A hybrid stable sort consisting of Insertion sort,
merge sort and selection sort. Rumored to be better than
qsort. Python’s default sort algorithm, Used in Java’s
Arrays.sort())
Merge sort (The best stable sort. (Oracle) Java’s default
sorting algorithm)

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