Căutarea secvenţială. Căutarea binară. Enunţarea problemei de căutare Se caută o valoare (citită de exemplu de la tastatură), într-un tablou unidimensional (citit anterior de la tastatură sau dintr-un fişier). Căutarea secvenţială Presupune parcurgerea secvenţiala a unui tablou unidimensional şi compararea fiecărui element din tablou cu elementul căutat până când acesta este găsit sau se ajunge la sfârşitul tabloului. Căutarea binară Presupune căutarea unei valori într-un tablou unidimensional, al cărui elemente sunt ordonate.
Valoarea căutată este comparată cu cea a elementului din mijlocul listei. Dacă e egală cu cea a acelui element, algoritmul se termină. Dacă e mai mare decât acea valoare, algoritmul se reia, de la mijlocul listei până la sfârşit, iar dacă e mai mică, algoritmul se reia pentru elementele de la începutul listei până la mijloc.
Algoritm: -
-
Considerăm un tablou unidimensional v de n elemente deja sortat, şi trei variabile: i=inceput, s=sfârşit şi m=mijloc. Metoda verifică de mai multe ori dacă mijlocul vectorului/tabloului unidimensional este egal cu elementul căutat: o în cazul în care este egală, variabila m reprezintă poziţia elementului în vector. o dacă nu se îndeplineşte condiţia de egalitate se trece la verificarea poziţiei elementului căutat în vector astfel: dacă elementul căutat este mai mic decât elementul din mijlocul vectorului, variabila s ia valuarea lui m iar dacă nu variabila i ia valuarea lui m. Totul se repetă cât timp i este mai mic decât s. 1
Ex: x
13
i 0
1
2
3
4
5
6
7
8
9
3
5
7
8
10
13
19
29
30
55
v
13 > v[4]=10 i
v
s
5
6
7
8
9
13
19
29
30
55
m i
i=0 s=9 m=[ (i+j) / 2 ] = 4
deci se cauta in a doua jumatate a tabloului v m
13 < v[7]=29
V
s
m
i=5 s=9 m=[ (i+j) / 2 ] = 7
deci se cauta in prima jumatate a tabloului v
s
5
6
13
19
i=5 s=6 m=[ (i+j) / 2 ] = 5
13 = v[5]
Program cautare secventiala: #include <iostream.h> int v[100], i, n; // v – tabloul unidimensional de nr. intregi cu maxim 100 void main(){ // elemente cout<<”n=”; //n-numarul de elemente al tabloului cin>>n; for(i=0; i<n; i++){ // se citesc pe rand elementele tabloului cout<<”v[”<<i<<”]=”; cin>>v[i]; } cout<<”x=”; // x- elemental cautat cin>>x; i=0; do{ // se repeat cat timp elemetul x nu este gasit if(v[i] == x ) // sau pana se ajunge la sfarsitul tabloului cout<<”Elementul ”<<x<<” a fost gasit pe pozitia ”<<i; }while( v[i] != x || i<n); if(i==n) cout<<”Elementul ”<<x<<” nu a fost gasit”; } 2
Program pentru cautarea binara: #include <iostream.h> int v[100], i, n, s; // v – tabloul unidimensional de nr. intregi cu maxim 100 void main() { cout<<”n=”; // n – numarul de elemente din tablou cin>>n; for(i=0; i<n; i++){ // se citesc pe rand elementele tabloului cout<<”v[”<<i<<”]=”; cin>>v[i]; } cout<<”x=”; // x- elemental cautat cin>>x; i=0; s=n-1; do { m = (i+s) / 2 ; if(x==v[m] ) cout<<”Valoarea ”<<x<<” a fost gasita pe pozitia ”<<m; else if(x<v[m]) s = m; else i = m; }while(i<s || x==v[m]); if(i<s) cout<<”Valoarea ”<<x<<”nu a fost gasita”; }
Tema: 1) Sa se scrie un program care citeste din fisierul tablou.txt volorile unui vector v de numere intregi. (Valorile vectorului nu sunt ordonate). Sa se caute in tablou o valoare citita de la tastatura in variabila intreaga x. Sa se afiseze un mesaj corespunzator situatiei intalnite. 2) Sa se scrie un program care citeste din fisierul tablou.txt volorile unui vector v de numere intregi. (Valorile vectorului sunt ordonate). Sa se caute in tablou o valoare citita de la tastatura in variabila intreaga x utilizand algoritmul de cautare binara. Sa se afiseze un mesaj corespunzator situatiei intalnite.
3