Cautare binara

Lecții de algoritmică, tips & tricks

Cautare binara

Postby cata45 » 23 Jul 2011, 23:59

Cautarea binara, cunoscuta si sub numele de Binary search se foloseste in general pentru a cauta o valoare intr-un vector ordonat(crescator sau descrescator).

Sa presupunem ca avem vectorul V cu n componente si cautam o valoare in acesta:
V (1, 3, 5, 6, 70, 71, 100, 101, 102, 106) cu 10 componente si cautam valoarea 3.

Stim ca vectorul este ordonat crescator, ceea ce ne permite urmatoarea deductie: Daca termenul din mijloc este mai mare decat cel cautat, cautarea se restrange in partea stanga a vectorului. Daca este mai mic atunci cautarea se restrange in partea dreapta, iar daca termenul din mijloc este egal cu cel cautat... inseamna ca l-am gasit. Acesti 3 pasi se vor aplica pana valoarea din mijloc este egala cu val sau pana cand se constata ca val nu se gaseste in acel vector.

Sa vedem cum arata intr-un limbaj de programare:
  1.  
  2. #include<fstream>
  3. using namespace std;
  4. #define InFile "BS.in"
  5. #define OutFile "BS.out"
  6. fstream f(InFile, ios::in), g(OutFile, ios::out);
  7. int v[100], i, n, val, x;
  8. int BinarySearch(int v[100], int stanga, int dreapta, int val)//parametrii sunt: v-vectorul, stanga-initial este 1, dreapta-initial este n, val-valoarea cautata
  9. {
  10.     //stanga - dreapta reprezinta intervalul in care cautam valoarea.
  11.     // initial cautam valoarea in intervalul 1-n  unde n este numarul de componente al vectorului.
  12.     int mijloc;
  13.     mijloc=stanga+(dreapta-stanga)/2; // mijloc este mijlocul intervalului stanga dreapta pentru care vom face cele 3 verificari
  14.     if(stanga>dreapta) //daca am ajuns ca stanga>dreapta inseamna ca nu avem solutie
  15.         return -1;
  16.     if(v[mijloc]==val)//daca numarul din mijlocul intervalului stanga dreapta este val am gasit solutia
  17.         return mijloc;//si vom returna pozitia
  18.     else//daca nici nu am gasit solutie si nici nu am constatat ca nu exista micsoram din nou intervalul de cautare
  19.     {
  20.         if(v[mijloc]>val)//daca valoarea din mijlocul intervalului stanga-dreapta este mai mare decat val
  21.             return BinarySearch(v,stanga,mijloc-1,val);//atunci val este in partea stanga a intervalului stanga dreapta, prin urmare dreapta devine mijloc-1, restrangand din nou intervalul de cautare
  22.         if(v[mijloc]<val)//daca este mai mica, atunci valoarea trebuie sa fie in jumatatea dreapta a intervalului stanga-dreapta
  23.             return BinarySearch(v,mijloc+1,dreapta,val);//deci stanga devine mijloc+1 si cautarile au fost restranse pe noul interval
  24.     }
  25. }
  26. int main()
  27. {
  28.     f>>n>>val;//citire numar de componente vector si valoarea cautata
  29.     for(i=1; i<=n; ++i)//citire componente vector
  30.         f>>v[i];
  31.     f.close();
  32.     x=BinarySearch(v,1,n,val);//aplicam cautarea binara pe tot vectorul (intervalul 1-n)
  33.    
  34.     if(x==-1)//daca valoarea returnata de BinarySearch este -1 inseamna ca val nu se afla in v
  35.         g<<"Valoarea nu exista in vector.\n";
  36.     else//altfel se afla pe pozitia x
  37.         g<<"Valoarea se gaseste in vector pe pozitia "<<x<<".\n";
  38.    
  39.     g.close();
  40.     return 0;
  41. }
  42.  

Algoritmul de mai sus este pentru cazul cand vectorul este sortat crescator.
Nu este recomandat sa folositi Binary Search pentru a vedea daca o valoare exista intr-un vector nesortat deoarece se consuma extrem de mult timp sortandu-l.

Probleme propuse:
1) Se citeste un vector cu n componente numere intregi,ordonate descrescator si o valoare intreaga x.Sa se decida daca x se gaseste sau nu printre componentele vectorului, iar in cazul in care se gaseste sa se specifice pozitia lui in vector.

Sper ca va este de folos. Good luck %%-
0,0p / 0 votes
Last edited by cata45 on 24 Jul 2011, 11:55, edited 1 time in total.
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: Cautare binara

Postby Mihai » 24 Jul 2011, 00:45

Subiectul este unul foarte interesant și folositor pentru cei care se află la început de drum :). Îi poți crește însă calitatea (făcându-l și mai ușor de urmărit în același timp) urmărind următoarele idei:

  • Nu folosi prescurtări decât dacă sunt absolut necesare. Exemplu:
    cata45 wrote:pana cand se constata ca val nu se gaseste in acel vector
  • Ține comentariile cât mai scurte - codul este foarte greu de urmărit când ai comentarii care țin linii întregi, în special pe forum. Dacă este nevoie, poți explica mai întâi algoritmul în pseudocod și apoi să dai varianta implementată într-un limbaj de programare.
  • Nu inventa cuvinte - dacă nu stăpânești limba engleză, este mai bine să nu te aventurezi să folosești cuvinte din ea în tutoriale. Mă refer la cuvântul binary, care în tutorialul tău apare de fiecare dată scris bynary.
  • Dacă poți, este foarte bine ca la sfârșit să-i dai cititorului șansa să aprofundeze tema prezentată - asta înseamnă că poți propune niște exerciții, poți să-i dai site-uri pe care poate găsi mai multe informații sau chiar cărți care tratează subiectul.

În rest, toate bune. Felicitări pentru subiectul tratat, cu siguranță va ajuta mulți începători care se chinuie să înțeleagă cum stă treaba cu căutarea asta binară de care vorbește toată lumea :).
0,0p / 0 votes
User avatar
Mihai
Byte
 
Joined: 29 Dec 2009
Status: 25

Re: Cautare binara

Postby cata45 » 24 Jul 2011, 11:10

^ Am pus comentarii pentru a ma asigura ca se intelege ideea... cat despre "Bynary "...my big mistake .
Multumesc pentru comentarii le voi lua in considerare.
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: Cautare binara

Postby morpheus » 24 Jul 2011, 16:18

Ar fi util sa prezinti si o analiza a complexitatii algoritmului.
0,0p / 0 votes
User avatar
morpheus
Word
 
Joined: 30 Dec 2009
Location: Bucharest, Romania
Status: 54.84

Re: Cautare binara

Postby cata45 » 24 Jul 2011, 16:26

Algoritmul de cautare binara are o complexitate de O(log2(n) ) in medie.
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9


Return to Tutoriale

Who is online

Users browsing this forum: No registered users and 0 guests

cron