Tematică științifică · 1.8
Algoritmi de căutare
Căutarea secvențială și căutarea binară, cu pașii fiecărui algoritm, implementarea iterativă și recursivă, greșelile care opresc algoritmul și criteriul de alegere între metode.
Căutarea stabilește dacă o valoare dată se află printre elementele unui vector și, în caz afirmativ, pe ce poziție. Programa prevede două metode: căutarea secvențială și căutarea binară.
Deosebirea dintre ele este de ordin de mărime. Într-un vector cu un milion de elemente, prima efectuează în cazul cel mai defavorabil un milion de comparații, a doua douăzeci. Căutarea binară cere însă o condiție: vectorul trebuie să fie ordonat.
Căutarea secvențială
Descrierea. Elementele vectorului se testează succesiv, de la primul spre ultimul, până la găsirea valorii căutate sau până la epuizarea vectorului.
Pașii algoritmului
| Pasul | Ce se execută |
|---|---|
| Pas 1. | Se inițializează i ← 1 și gasit ← fals. |
| Pas 2. | Dacă i ≤ n și gasit = fals, se merge la Pas 3; altfel, se merge la Pas 5. |
| Pas 3. | Dacă v[i] = x, valoarea a fost găsită: gasit ← adevărat și poz ← i. Se revine la Pas 2. |
| Pas 4. | Altfel, i ← i + 1. Se revine la Pas 2. |
| Pas 5. | Dacă gasit = adevărat, valoarea căutată se află pe poziția poz; altfel, ea nu apare în vector. |
i ← 1; gasit ← fals
cât timp i ≤ n și gasit = fals execută
dacă v[i] = x atunci
gasit ← adevărat; poz ← i
altfel
i ← i + 1
sfdacă
sfcât timp
/* Întoarce poziția lui x în v[0..n-1], sau -1 dacă valoarea nu apare. */
int secventiala(int v[], int n, int x) {
for (int i = 0; i < n; i++)
if (v[i] == x) return i;
return -1;
}
Observație. Metoda nu impune nicio condiție vectorului. Se aplică pe date neordonate, pe orice tip de elemente între care este definită egalitatea și pe structuri care se pot parcurge numai element cu element, cum sunt listele înlănțuite.
| Cazul | Numărul de comparații |
|---|---|
| favorabil | 1, valoarea se află pe prima poziție |
| mediu | aproximativ n/2 |
| defavorabil | n, valoarea se află pe ultima poziție sau lipsește |
Ordinul de complexitate este O(n).
Căutarea binară
Descrierea. Vectorul fiind ordonat crescător, mulțimea indicilor [s, d] se împarte în două submulțimi prin indicele din mijloc, m. Se compară valoarea căutată cu elementul v[m]:
- dacă v[m] este egal cu valoarea căutată, poziția este m și căutarea se încheie;
- dacă v[m] este mai mic, valoarea căutată, dacă apare, se află printre elementele cu indici din [m+1, d];
- dacă v[m] este mai mare, valoarea căutată, dacă apare, se află printre elementele cu indici din [s, m−1].
La fiecare pas, mulțimea în care se mai caută se înjumătățește.
Pașii algoritmului
Se folosesc: s pentru primul indice al zonei în care se caută, d pentru ultimul, m pentru
indicele elementului din mijloc și poz pentru poziția pe care s-a găsit valoarea. Cât timp
valoarea nu a fost găsită, poz are valoarea 0.
| Pasul | Ce se execută |
|---|---|
| Pas 1. | Se inițializează indicii s ← 1 și d ← n, iar poz ← 0. |
| Pas 2. | Dacă zona se mai poate împărți, adică s ≤ d, și valoarea nu a fost încă găsită, adică poz = 0, se merge la Pas 3; altfel, se merge la Pas 6. |
| Pas 3. | Se calculează indicele elementului din mijlocul zonei: m ← [(s + d) / 2]. |
| Pas 4. | Dacă v[m] = x, valoarea a fost găsită: poz ← m. Se revine la Pas 2. |
| Pas 5. | Dacă v[m] < x, căutarea continuă în subvectorul din dreapta și s ← m + 1; altfel, căutarea continuă în subvectorul din stânga și d ← m - 1. Se revine la Pas 2. |
| Pas 6. | Dacă poz > 0, valoarea căutată se află pe poziția poz; altfel, s a trecut de d, zona în care se mai putea căuta este vidă, iar valoarea nu apare în vector. |
Materialul acesta se citește pe educamp.ro și nu se tipărește.
S-a încheiat minutul de citit liber.
Ce cuprinde subcapitolul
- Căutarea secvențială
- Căutarea binară
- Numărul de pași
- Când se ordonează vectorul înainte de căutare
- Alte întrebuințări ale căutării binare
Continuă lectura ca și cursant
Cel puțin un subcapitol din fiecare capitol este disponibil gratuit și integral. Pentru a citi toate celelalte subcapitole ale disciplinei, te înscrii la cursul de pregătire.
Cursul cuprinde suportul de curs publicat până acum, care se completează capitol cu capitol, și două întâlniri de câte două ore în fiecare lună. Prima săptămână este gratuită, fără plată și fără card. Dacă vrei să vezi mai întâi cum este prezentată materia, poți reveni la primul subcapitol al capitolului.
Începe săptămâna gratuită Sunt cursant — login
Află când publicăm materiale noi
Materia este publicată treptat, capitol cu capitol. Înscrie-te pentru a primi un e-mail atunci când apare un capitol nou de informatică.
Nu am putut înregistra adresa. Verifică e-mailul și materia aleasă, apoi încearcă din nou.
Surse
- Cerchez, E., Șerban, M., „Programarea în limbajul C/C++ pentru liceu”, Editura Polirom, Iași, 2005
- „Informatică. Manual pentru clasa a XI-a”, Editura Didactică și Pedagogică, București
- „Metode și tehnici clasice de programare”, suport de curs