120 likes | 284 Views
Tehnici de căutare. Capitolul 4. Tabloul unidimensional (vector ul ). Tabloul (v ectorul ) este o structură omogenă de date, formată dintr-o mulțime ordonată de elemente, ordonate printr-un ansamblu de indici asociați Elementele tabloului ocupă locații de memorie cu adrese consecutive
E N D
Tehnici de căutare Capitolul 4
Tabloul unidimensional (vectorul) • Tabloul (vectorul) este o structură omogenă de date, formată dintr-o mulțime ordonată de elemente, ordonate printr-un ansamblu de indici asociați • Elementele tabloului ocupă locații de memorie cu adrese consecutive • Definirea tabloului se face prin specificarea: • Numelui tabloului • Dimensiunea tabloului (numărul de elemente componente) • Tipul de date a elementelor din tablou • Fiecare element al structurii se identifică prin numele tabloului și poziția sa în tablou(indicele), care trebuie să aparțină unui tip ordinal finit • Accesarea elementelor se realizează cu ajutorul indexului asociat • Tablourile de memorie se folosesc pentru a crea colecții de date care vor fi prelucrate prin algoritmi specializați
Parcurgerea vectorului • Parcurgerea elementelor unui vector înseamnă vizitarea pe rând a elementelor pentru prelucrarea lor • Parcurgerea elementelor se face secvențialși se folosește pentru: • Citirea elementelor vectorului • Afișarea elementelor vectorului • Prelucrarea elementelor vectorului void citire(int V[100], int n) {int i; for (i=1;i<=n;i++) {cout<<"V["<<i<<"]="; cin>>V[i]; } } void afisare(int V[100], int n) {int i; for(i=1;i<=n;i++) cout<<V[i]<<" "; cout<<endl; }
Căutarea în vector • Este una dintre operațiile cele mai frecvente care se execută asupra tablourilor • Problema căutării constă în: • verificarea existențeiîn tablou a elementului dat x • determinarea celui mai mic indice i pentru care elementul căutat x se află în șir (x=a[i]) • Scopul căutarii poate fi: • Modificarea/ștergerea valorii • Inserarea unui element după/înaintea acestui element • Consultarea elementului în vederea efectuării unor calcule
Căutarea secvențială (liniară) • Se aplică atunci când: • nu există nici o informație despre informațiile din vector (nu sunt sortate) • nu este posibil decât accesul secvențial • Se compară pe rând valoarea căutată x cu elementele tabloului până când: • se găsește egalitatea x=a[i] • s-a ajuns la sfârșitul tabloului • Algoritmul de căutare a unui element se face diferit pentru: • Un tablou sortat • Un tablou nesortat
Algoritm Citeste n Pentru i=1,n executa citeste v[i] Citeste x i1 ┌Cat timp i<=n and x!=v[i] executa │ ii+1 └■ ┌daca x=v[i] atunci │ scrie x, “element gasit” │ altfel scrie x, “nu e gasit” └■ Implementare int caut(int v[100], int n, int x) {int i=1; While(i<=n && x!=v[i]) i++; if (x==v[i]) return 1; else return 0; } Int main() {cin>>n; citire(v,n); if(caut(v,n,x)==1) cout<<x<<“ gasit”; else cout<<x<<“ nu e gasit”; } Căutarea secvențială (liniară) Pentru un vector oarecare, putem folosi tehnica următoare:
Tehnica fanionului • Vectorul se prelungește cu încă un element (fanion) căruia i se atribuie valoarea x, apoi se aplică metoda de căutare liniară. • Avantajul constăîn simplificarea condiției de ciclare, deoarece nu mai este nevoie de verificareaca indicele să nu depașească dimensiunea vectorului, deoarece în vector există sigur cel puțin un element cu valoarea căutată. void fanion (int v[100], int n, int x) {int i=1; v[n+1]=x; while(v[i]!=x) i=i+1; If(i>n)cout<<x<<“nu există elementul căutat”; else cout<<x<<“ elementul căutat se afla pe pozitia “<<i; }
Căutare într-un vector sortat • Căutarea este mult simplificată dacă datele în care efectuăm căutarea, sunt sortate(ordonate) într-o anumită ordine (crescătoare sau descrescătoare). • Obs. • Parcurgerea vectorului pentru căutarea valorii date se oprește când: • S-a gasit elementul și se returnează valoarea 1 (true) • S-au gasit elemente mai mari și nu mai este necesară căutarea. Se va returna 0 (false) Implementare int caut(int v[100], int n, int x) {int i=1; While(i<=n && x>v[i]) i++; if (x==v[i]) return 1; else return 0; } Int main() {cin>>n; citire(v,n); if(caut(v,n,x)==1) cout<<x<<“ gasit”; else cout<<x<<“ nu e gasit”; }
Căutarea binară • Se aplică pentru șiruri ordonate • Principiul constăîn înjumătățirea repetată a intervalului în care se caută elementul dorit • Această tehnică are avantajul rapidității: numărul de comparații necesare este cel mult log2(n). • La fiecare comparare, dacă elementul căutat nu e gasit, se renunță la jumătate din șir • Algoritmul returnează: • poziția în șir a elementului căutat, dacă e găsit • valoarea 0, dacă elemenul căutat nu e în șir int cautareBinara(int s, int d) {int m; do{ m=(s+d)/2; if (x==a[m]) return m; else if(x>a[m]) s=m+1; else d=m-1; }while(s<=d); return 0; }
Aplicații: • Pentru aprofundarea noțiunilor, veți exersa aceste operații rezolvând problemele din fișa 4.