Căutarea secvențială
Parcurgi vectorul de la început până găsești elementul sau ajungi la capăt.
- Complexitate: .
- Avantaj: funcționează pe orice vector, sortat sau nu.
Căutarea binară
Condiție obligatorie: vectorul trebuie să fie SORTAT. Pe un vector nesortat dă rezultate greșite, nu eroare, ceea ce e mai periculos.
Ideea: compari cu elementul din mijloc și elimini jumătate din intervalul de căutare la fiecare pas.
st = 0,dr = n - 1;- cât timp
st <= dr:mij = (st + dr) / 2;- dacă
v[mij] == x, ai găsit; - dacă
v[mij] < x, cauți în dreapta:st = mij + 1; - altfel cauți în stânga:
dr = mij - 1;
- dacă bucla se termină, elementul nu există.
Complexitate: . Pentru un milion de elemente, cel mult 20 de pași.
Capcana depășirii
mij = (st + dr) / 2 poate depăși tipul întreg când st și dr sunt mari, pentru că suma lor depășește limita înainte de împărțire.
Varianta sigură:
Matematic e același lucru, dar nu trece niciodată prin suma mare. E un bug celebru, care a stat ascuns ani de zile în biblioteci standard.
Comparație
| Secvențială | Binară | |
|---|---|---|
| Vector sortat | nu e nevoie | obligatoriu |
| Complexitate | ||
| 1.000.000 elemente | până la 1.000.000 pași | cel mult 20 |
Reține
Dacă subiectul spune „vector ordonat crescător", e un semnal clar că se așteaptă căutare binară. Dacă nu spune, folosește secvențială sau sortează întâi.
Greșeli frecvente
- Se aplică binară pe vector nesortat. Rezultatul e greșit, dar programul nu dă eroare.
- Se scrie
st = mijîn loc dest = mij + 1, și bucla nu se mai termină. - Se folosește
st < drîn loc dest <= dr, și se ratează elementul când intervalul are un singur element.