Sunteți pe pagina 1din 12

Tablouri - Tehnici de cutare.

1. Cutarea liniara
2. Tehnica fanionului
3. Cutarea binar (logaritmic)

1. Cutarea liniar
Principiul de functionare:

Se compara pe rind elementele tabloului cu x pina cind, fie se


gaseste egalitatea a[i]=x, fie s-a ajuns la sfirsitul tabloului.
Exemplul 1:
Elementul cutat: x=62
Vectorul in care se face cautarea : int a [12];

1. Cutarea liniar cu succes


#include <iostream.h>
void main()

62!=4
62!=4

int a[100], n, x, ok;


cout<<Dati nr. de elemente: ;
cin>>n;
cout<<Dati elementele vectorului;
for(int i=0;i<=n-1;i++)
cin>>a[i];
cout<<Dati numarul cautat: ;
cin>>x;
i=0;//resetam indexul la 0
While ( i<n-1 && a[i]!=x )
i++;
If (a[i]==x)
cout<<Nr. are indexul <<i;
else cout<<Nr. nu este in vector";
}

62!=21
62!=21

62!=36
62!=36

62!=14
62!=14

62==62
62==62

1. Cutarea liniar fr succes


Exemplul 2:
Elementul cutat: x=72
Vectorul in care se face cautarea : int a [7];

index index index index index index index

00

11

22

33

44

55

66

4!=72 21!=72
36!=72
14!=72
62!=72
91!=72
8!=72

Concluzie: Numarul 72 nu se gaseste in vectorul a!

2. Tehnica fanionului
Principiul de functionare:
Tabloul a se prelungeste cu inca un element ( fanion) caruia i se
asigneaza valoarea x, apoi se aplica metoda de cautare liniara.
Avantajul metodei: simplificarea conditiei de ciclare(nu mai este
nevoie sa se verifice daca indicele nu depaseste dimensiunea
tabloului) deoarece in tablou exista sigur cel putin un element cu
valoarea cautata.

//se citeste vectorul si nr. cautat


index index index index index index index index
i=0;
77
00
11
22
33
44
55
66
a[n]=x;
while (a[i]!=x)
i++;
if (i!=n)
cout<<Nr. are indexul <<i;
else cout<<Nr. nu este in vector;

3. Cutarea binar (logaritmic)


Principiul de functionare:
Se da o valoare x si un vector sortat a[].
Daca x se gaseste in vectorul a[], sa se indice pozitia la care
afla.
Elementul cautat : x= 22 prim mijl ultim

prim

mijl

se

ultim

22>21

prim

mijl

ultim

22<62

22==22
Elementul 22 se gaseste in vectorul
a[] pe pozitia mijl=6

3. Cutarea binar (logaritmic)


Exemplul 2 :
Cautarea binara a literei j in sirul
char a[18]=acdfghjlmoprsuvxz

ultim

prim

10 11

12

13

14

15

16

17

mijl

3. Cautarea binara (logaritmica)

ultim

prim

10 11

12

13

14

15

16

17

mijl

3. Cutarea binar (logaritmic)

ultim

prim

10 11

12

13

14

15

16

17

mijl

Elementul j se gaseste in vectorul a[] pe pozitia mijl=7

3. Cutarea binar (logaritmic)

#include <fstream>
#include <iostream>
using namespace std;
main ()
{int v[20],n=0,i,gasit,m,st,dr,x;
//creare vector
ifstream fin("vector_o.txt");
while(!fin.eof()) fin>>v[n++];
fin.close();
cout<<"Nr. cautat: "; cin>>x;

gasit=0;
st=0; dr=n-1;
while (st<=dr && !gasit)
{ m=(st+dr)/2;
if (x==v[m]) gasit=1;
else
if (x<v[m]) dr=m-1;
else
st=m+1;
}
if(gasit) cout<<"Gasit pe pozitia "<<m;
else
cout<<"Negasit!";
}

Probleme
1. Se citesc intr-un vector, de la tastatura, cel mult 50 numere
intregi. Sa se stearga primul element cu valoarea x(citita
de la tastatura)

2. Se citesc intr-un vector, de la tastatura, cel mult 50 numere


intregi. Sa se insereze elemental cu valoarea y inaintea
primului element care are valoarea x (x, y citite de la
tastatura)

Fiierul bac.txt conine numere naturale din intervalul [1,104]:

pe prima linie numrul n,

pe a doua linie un ir de n numere ordonate strict


descresctor,

iar pe a treia linie un numr x.


Numerele de pe aceeai linie sunt separate prin cte un spaiu.
Se cere s se afieze pe ecran cel mai mare numr din ir mai
mic sau egal cu x. Dac nu exist un astfel de numr, se afi eaz
pe ecran mesajul nu exista. Pentru determinarea numrului cerut
se utilizeaz un algoritm eficient din punctul de vedere al
timpului de executare.
Exemplu: dac fiierul conine numerele
5
100 49 16 7 2
30
atunci pe ecran se afieaz 16