1 / 10

Tehnici de căutare

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

glen
Download Presentation

Tehnici de căutare

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Tehnici de căutare Capitolul 4

  2. 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

  3. 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; }

  4. 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

  5. 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

  6. Algoritm Citeste n Pentru i=1,n executa citeste v[i] Citeste x i1 ┌Cat timp i<=n and x!=v[i] executa │ ii+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:

  7. 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; }

  8. 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”; }

  9. 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; }

  10. Aplicații: • Pentru aprofundarea noțiunilor, veți exersa aceste operații rezolvând problemele din fișa 4.

More Related