ALGORITMI DE CAUTARE



Algoritmi de cautare


Cautare secventiala


Algoritmul de cautare secventiala rezolva urmatoarea problema: daca x[n] este un vector cu valori oarecare sa se decida daca o valoare oarecare a se afla printre elementele vectorului x. Cautarea se numeste secvential 9; deoarece, pentru aflarea raspunsului, vectorul x este parcurs secvential incepand cu prima componenta pana cand este intalnita prima aparitie a valorii a (cautarea a avut succes) sau pana cand vectorul x a fost epuizat (cautarea nu a avut succes).




Implementare in limbajul C


# include 'stdio.h'

# include 'conio.h'


int x[20],n,i,a;


int CautSecv(int n,int x[],int a)



void main(void)


printf('nafisare vector: ');

for (i=1;i<=n;i++)

printf('%d ',x[i]);

printf('na=');

scanf('%d',&a);

if (CautSecv(n,x,a))

printf('Valoarea se afla printre elementele sirului');

else printf('Valoarea nu se afla printre elementele sirului');

getch();


Cautare secvential 9; rapida


Cautarea secvential 9; poate deveni « rapida » daca modificam putin algoritmul deja prezentat. Modificarea consta in completarea vectorului x pe componenta x[n+1] cu valoarea a pe care dorim sa o cautam in x[n]. Asa cum se poate constata in implementare de mai jos, numarul de comparatii se reduce substantial : adaugarea valorii a pe pozitia x[n+1] a permis eliminarea comparatiei i<=n care depisteaza sfarsitul sirului x.


Implementare in limbajul C


# include 'stdio.h'

# include 'conio.h'


int x[20],n,i,a;


int CautSecv(int n,int x[],int a)



void main(void)


printf('nafisare vector: ');

for (i=1;i<=n;i++)

printf('%d ',x[i]);

printf('na=');

scanf('%d',&a);

if (CautSecv(n,x,a))

printf('Valoarea se afla printre elementele sirului');

else printf('Valoarea nu se afla printre elementele sirului');

getch();


Cautare secvential 9; in tabel ordonat


In situatia in care elementele vectorului sunt ordonate cautarea se poate face mult mai eficient. Astfel, daca sirul este ordonat crescator este suficient sa cautam valoarea a in vectorul x doar cat timp a>x[i], i=1,2,.. Daca exista o valoare i astfel incat a<x[i] nu are rost sa cautam mai departe deoarece sirul fiind ordonat crescator, toate valorile x[j] cu j>i vor fi strict mai mari decat a.


Implementare in limbajul C


# include 'stdio.h'

# include 'conio.h'


int x[20],n,i,a;


int CautSecvTabOrd(int n,int x[],int a)



void main(void)


printf('nafisare vector: ');

for (i=1;i<=n;i++)

printf('%d ',x[i]);

printf('na=');

scanf('%d',&a);

if (CautSecvTabOrd(n,x,a))

printf('Valoarea se afla printre elementele sirului');

else printf('Valoarea nu se afla printre elementele sirului');

getch();


Cautare binara


efectueaza atribuirile inc=1, sf=n, gasit=0

cat timp inc<=sf si gasit = 0 executa

gaseste pozitia m=(inc+sf)/2care marcheaza mijlocul subvectorului cu elementele x[inc], x[inc+1],., x[sf]

daca x[m] este egal cu a atunci gasit=1, altfel

daca x[m]>aux atunci cautarea se continua in zona cuprinsa intre pozitia inc si m-1, in caz contrar cautarea se continua in zona cuprinsa intre m+1 si sf


Implementare in limbajul C


# include 'stdio.h'

# include 'conio.h'


int x[20],n,i,a;


int CautBin(int x[],int a)


return gasit;



void main(void)


printf('nafisare vector: ');

for (i=1;i<=n;i++)

printf('%d ',x[i]);

printf('na=');

scanf('%d',&a);

if (CautBin(x,a))

printf('Valoarea se afla printre elementele sirului');

else printf('Valoarea nu se afla printre elementele sirului');

getch();