Sunteți pe pagina 1din 11

Problema

Se consideră un vector cu n componente întregi (n≤100) si o


valoare întreagă x. Să se verifice dacă x apare sau nu în vector.

Problema poate fi rezolvată prin parcurgerea succesivă a tuturor


elementelor din vector şi verificarea egalităţii. Această metodă
se numeşte căutare secvenţială, şi este ineficientă pentru un
număr mai mare de elemente, având un timp prea mare de
execuţie.
Căutarea binară într-un vector ordonat
(Binary Search)

Dacă elementele vectorului sunt ordonate crescător/


descrescător, putem găsi un element în vector, fără a fi nevoie să
parcurgem toate elementele acestuia.

Unul dintre algoritmii folosiţi în acest caz, este algoritmul


de căutare binară (binary search), care are la bază principiul
înjumătăţirii repetate a domeniului de valori, printre care se
caută elementul.
Înjumătățirea repetată a domeniului de valori
reprezentă împărţirea vectorului în doi subvectori, la poziția de
mijloc al acestuia, care la rândul lor pot fi împărțite în
continuare, prin pozițiile lor de mijloc, ș.a.m.d.

Acestă tehnică de împărțire a problemei inițiale în


subprobleme de același gen, poartă denumirea de tehnica de
programare Divide Et Impera
Căutarea binară -(Binary Search)
3 4 6 7 9 10 12 15 21 23

început sfârșit
mijloc
Se calculează un nou mijloc pentru acestă jumătate a vectorului,
de această dată pentru intervalul [6, 10], la poziția 8.

12<15 - elementul căutat x=12, este mai mic decât elementul de


pe poziția de mijloc v[8] =15, deci căutarea se continuă în prima
jumătate a vectorului, între pozițiile de început și mijloc-1
10 12

început sfârșit

mijloc
Poziția de început=mijloc+1=7
Poziția de sfârșit=7 => iar noul mijloc se va afla tot pe poziția 7.

12

început sfârșit

mijloc
Elementul căutat va fi găsit pe poziția 7.
Algoritmul că ută rii binare în C++

început=1;
sfârșit =n;
while (început<=sfârșit) {
mijloc=(început+sfârșit)/2;
if (x==v[mijloc]) {cout<< “Am găsit pe pozitia”<<mijloc; break;}
else if (x<v[mijloc]) sfârșit=mijloc-1;
else început=mijloc+1;
}
if (inceput>sfarsit) cout<<“Elementul căutat nu se găsește în vector”;
Observaţii

-căutarea are sens doar dacă început<=sfârșit;


-raţionamentul descris are sens doar dacă
valoarea căutată se află printre elementele
vectorului.
“Există momente în viață când orice problemă îți
pare mare, când ea este ușor de rezolvat”

Mike Leavitt

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