Search:


| Hemorrhoid pain relief


Algoritmi.


Algoritmi de cautare in cadrul structurilor de date abstracte.

    Cuprins:
    1. Ce este algoritmul de cautare?.
    2. Cautarea in tablouri.

    3. Cautarea neinformata.
    4. Cautarea in liste.
    5. Cautarea in arbore.
    6. Cautarea in graf.
    7. Cautarea in baza de date structurate (SQL).
    8. Cautarea informata.

    1. Prezentarea algoritmului de cautare. >>>

    In domeniul calculatoarelor un algoritm de cautare este o metoda care trebuie sa returneze un returneze numai un rezultat aflat intr-un spatiu de solutii, pentru o anumita cerinta (problema).Majoritatea algoritmilor studiati in domeniul calculatoarelor care pot oferii solutii cerintelor propuse fac parte din familia algoritmilor de cautare.Spatiul tuturor solutiilor posibile ale unei cerinte care trebuie rezolvata este denumit spatiu de solutii posibile.Cautarea neinformata este o metoda abordata de algoritmii de cautare simpli.Cele mai intuitive metode de cautare prin spatiul de solutii posibile, cum sunt algoritmii de cautare informata, isi folosesc cele mai eficiente astfel de metode pentru a primii informatii despre structura spatiului de raspunsuri pentru a incerca sa reduca cat mai mult perioada de cautare.

    2. Cautarea in tablouri. >>>

    Fie v un tablou unidimensional de dimensiune n si k un element de acelasi tip cu elementele tabloului.(k=cheie de cautare).Cautarea lui k revine la a gasii daca exista sau nu, un element din v de valoare k.În functie de aranjarea elementelor în tabloul v, exista trei tipuri de cautari:

      2.1. Secventiala – nu se specifica nimic despre elementele tabloului v
      2.2. Secventiala în tabloul ordonat
      2.3. Cautare binara (caz în care tabloul este ordonat)

    2.1. Cautarea secventiala intr-un tablou. >>>
    In cautarea secventiala – nu se specifica nimic despre elementele tabloului v.Functia care rezolva aceasta cautare este:

    int cautare(int v[], int n, int k)
    {
      i=1;
      while (i<=n && v[i]!=k) i++;
      if (i<=n) return 1;
      else return 0;
    }

    Un exemplu mai concret:

    #include 
    #include int main(void)
    {
      int v[20],n,i,k;
      printf("n="); scanf("%d",&n);
      printf("introduceti elementele vectorului\n");
      for (i=1;i<=n;i++)
      {
        printf("v[%d]=",i);
        scanf("%d",&v[i]);
      } printf("nr cautat in sir =");
      scanf("%d",&k);
      i=1;
      while (i<=n && v[i]!=k) i++; if(i<=n) printf("Numarul cautat se afla in sir");
      else printf("Numarul cautat nu se afla in sir");
    }

    2.2 Cautarea secventiala într-un tablou ordonat. >>>
    Fie v un tablou sortat crescator: v1<=v2<=... <=vn. La compararea unui element vi cu k avem urmatoarele trei situatii:

      * vi = k: Algoritmul se încheie,rezultand o cautare cu succes;
      * vi > k: Algoritmul se încheie, rezultand o cautare fara succes;
      * vi< k: Se continua cautarea daca i < n;

    Functia cautare() implementeaza cele trei cazul prezentate mai suscazurile care rezolva aceasta cautare:

    void cautare()
    {
      gata=0;
      gasit=0;
      i=1;
      while (i<=n && !gata)
      {
        if (v[i]==k)
        {
          gata=1; gasit=1;
        }
        else if (v[i]>k) gata=1;
        else i++;
      }
      if (i>n || !gasit) printf("Numarul cautat nu se afla in sir");
      else printf("Numarul cautat se afla in sir");
    }

    Un exemplu de program care dezvolta functia prezentata mai sus:

    #include 
    #include
    int v[20];
    int n,i,k,gata,gasit,ind,aux;
    void sortv()
    {
      do
      {
        ind=0; for(i=1;i<=n-1;i++)
        {
          if (v[i]>v[i+1])
          {
            ux=v[i];
            v[i]=v[i+1]; v[i+1]=aux;
            ind=1;
          }
        }
      }
      while (ind!=0);
    }
    void fisare()
    {
      for(i=1;i<=n;i++) printf("v[%d]=%d ",i,v[i]);
      printf("\n");
    }
    void main(void)
    {
      clrscr();
      printf("n="); scanf("%d",&n);
      printf("introduceti elementele vectorului\n");
      for (i=1;i<=n;i++)
      {
        printf("v[%d]=",i);
        scanf("%d",&v[i]);
      }
      sortv();
      printf("vectorul sortat \n");
      afisare();
      printf("Numarul cautat in sir =");
      scanf("%d",&k);
      gata=0; gasit=0;
      i=1;
      while (i<=n && !gata)
      {
        if (v[i]==k)
        {
          gata=1;
        }
        else if (v[i]>k) gata=1;
        else i++;
      }
      if (i>n || !gasit) printf("Numarul cautat nu se afla in sir");
      else printf("Numarul cautat se afla in sir");
      getch();
    }

    2.3. Cautarea binara intr-un tablou. >>>
    Cautarea binara (caz în care tabloul este ordonat) se poate realiza recursiv sau iterativ.

    Fie v sortat crescator: v1<= v2 <= ... <= vn.

    Astfel varianta recursiva presupune compararea cheii cu elementul din mijlocul tabloului, obtinându-se urmatoarele trei situatii:

      * vmijloc= k: Se opreste cautarea, deoareace s-a gasit cheia cautata.
      * vmijloc< k : Se continu? cautarea în secventa vmijloc+1,v'mijloc=2, ... ,vn
      * vmijloc> k: se continua cautarea in segventa: v1,v'2, ... ,vmijloc-1

    Exemplu de functie recursiva:

    int cautare(int k,int inf, int sup)
    {
      int mij;
      if (inf<=sup)
      {
        mij=(inf+sup)/2;
        if (v[mij]==k) return mij;
        else if (v[mij]>k) cautare(k,inf,mij-1); else cautare(k,mij+1,sup);
      }
      else return 0;
    }

    Exemplu de program care foloseste functia prezentata mai sus:

    #include 
    #include
    int v[20];
    int n,k,c;
    void citire()
    {
      int i;
      printf("Elementele sirului in ordine crescatoare\n");
      printf("v[1]=");scanf("%d",&v[1]);
      for(i=2;i<=n;i++) do
      {
        printf("v[%d]=",i);scanf("%d",&v[i]);
      }
      while (v[i]<=v[i-1]);
    }
    void afisare()
    {
      int i;
      for(i=1;i<=n;i++) printf("v[%d]=%d ",i,v[i]);
      printf("\n");
    }
    int cautare(int k,int inf, int sup)
    {
      int mij;
      if (inf<=sup)
      {
        mij=(inf+sup)/2;
        if (v[mij]==k) return mij;
        else if (v[mij]>k) cautare(k,inf,mij-1);
        else cautare(k,mij+1,sup);
      }
      else return 0;
    }
    void main(void)
    {
      do
      {
        printf("n="); scanf("%d",&n);
      }
      while(n<1||n>20);
      citire();
      printf("Vectorul introdus \n");
      afisare();
      printf("Numarul cautat in sir este=");
      scanf("%d",&k);
      c=cautare(k,1,n);
      if (c==0) printf("Elementul nu este in sir\n");
      else printf("Elementul cautat este pe pozitia %d\n",c);
      getch();
    }

    Fie v sortat crescator: v1<= v2 <= ... <= vn.
    Implementarea cautarii binare iterative:

    int cautare(int v[], int n, int k)
    {
      int mij,inf,sup,ind;
      inf=1;sup=n;
      ind=0;
      do
      {
        mij=(inf+sup)/2;
        if (v[mij]==k) ind=1;
        else if (v[mij]else sup=mij-1;
      }
      while(inf<=sup && ind==0);
      if (ind==1) return mij;
      else return 0;
    }

    Programul care foloseste metoda prezentata mai sus este urmatorul:

    #include  
    #include
    int v[20];
    int n,k;
    void citire()
    {
      int i;
      printf("Elementele sirului in ordine crescatoare\n");
      printf("v[1]=");scanf("%d",&v[1]);
      for(i=2;i<=n;i++)
      do
      {
        printf("v[%d]=",i);scanf("%d",&v[i]);
      }
      while (v[i]<=v[i-1]);
    }void afisare()
    {
      int i;
      for(i=1;i<=n;i++)
      printf("v[%d]=%d ",i,v[i]);
      printf("\n");
    }
    void cautare()
    {
      int mij,inf,sup,ind;
      inf=1;sup=n;
      ind=0;
      do
      {
        mij=(inf+sup)/2;
        if (v[mij]==k) ind=1;
        else if (v[mij]else sup=mij-1;
      }
      while(inf<=sup && ind==0);
      if (ind==1) printf("Elementul este pe pozitia %d\n",mij);
      else printf("Elementul nu este in sir");
    }
    void main(void)
    {
      clrscr();
      do
      {
        printf("n="); scanf("%d",&n);
      }
      while(n<1||n>20);
      citire();
      printf("Vectorul introdus \n");
      afisare();
      printf("Numarul cautat in sir este=");
      scanf("%d",&k);
      cautare();
      getch();
    }

    3. Cautarea neinformata. >>>

    Un algoritm de cautare neinformata este unul dintre algoritmii care nu abordeaza in amanunt natura specifica a cerintei ce trebuie solutionata.Astfel dar, ei pot fi implementati in general astfel incat aceeasi metode de cautare poate functiona prin abstractizare si pentru a rezolva alte cerinte de cautare.Dezavantajul acestei metode este atunci cand spatiul raspunsurilor posibile este prea mare, isa o cautare informata, mai ales intr-un arbore, poate furniza un raspuns corect intr-un interval de timp foarte scurt.Ca urmare, pentru usurarea procesului de cautare se foloseste pe langa algoritmul de cautare neinformata si un algoritm de cautare informata.

    4. Cautarea in liste. >>>

    Algorimii de cautare in liste sunt probabil cei mai performanti algorimi din familia algorimilor de cautare.Scopul este sa se gaseasca un element dintr-un grup de elemente care au acelasi tip (probail continand si alte informatii referitor la elemente).Aceasta este o problema ivita in domeniul de studiu al calculatoarelor, functionarea complexa a algoritmulor de acest tip a fost bina studiata.Algorimii simpli, cum este de exemplu algorimul de cautare liniara,sunt usor de implenetat si procedura de cautare consta in examinarea in ordine a fiecarui element al unui spatiu de solutii posibile.Acesti tip de algoritmi realizeaza O(n) treceri de cautare (unde n reprezinta numarul de elemente din spatiul de solutii posibile), ei fi folositi si-n cadrul listelor neprocesate (nesortate).Cel mai sofisticat algoritm de cautare in lista este cautarea binara, care realizeaza O(log n) treceri de cautare.Acest algoritm este mult mai eficient decat metoda cautarii liniare cand se opereaza cu liste de mari dimensiuni, numai ca el lucreaza numai pentru liste sortate in prealabil.Cautarea prin interpolare este mai eficienta decat cautarea binara cand se lucreaza cu liste mari de date egal distribuite.Algoritmul lui Grover este si el un algoritm de cautare numit algoritm de quantum care ofera o viteza de patru ori mai mare decat clasicul algoritm de cautare liniara pentru liste nesortate.

    Tablourile asociate sunt si ele folosite in cautarea listelor de date,si care necesita numai perioade constante de timp pentru o solutionare de complexitate medie, numai ca ele necesita spatiu de memorie mare si se comporta foarte inaficient din punct de vedere al performantei.Alte metode de cautare bazate pe structuri de date speciale sunt folosite de arborii binari de cautare, care neceista o perioada o perioada de timp O(log n) pentru a efectua o cautare, putand fi vazuti ca provenind din familia algoritmilor de cautare binara, si care permit inserii rapide si usor de mutat.Multi algoritmi de cautare, cum sunt algaritmul de cautare binara, algoritmul de cautare liniara sau arborii binari de cautare, pot fi extinsi prin mici modificari adaugate pentru a gasii taoate valorile mai mici sau mai mari decat cheia data, operatie denumita cautare prin intindere.In acest criteriu nu intra tablourile asociate, caci nu se pot comporta eficient intr-o cautare.

    5. Cautarea in arbore. >>>

    Algoritmii de cautare abordati in structura de date abstracta numita arborii reprezinta pulsul tehnicilor de cautare.Algoritmul arborelui binar de cautare cauta nodurile valorile din nodurile unui arbore de tip explicit sau implicit (adica generat la intrare).Principiul de baza functioneaza pe faptul ca un nod este luat dintr-o structura de date, iar succesorii sai sunt verificati si adaugati la structura de date.Prin intermediul structurilor de date, arborele este parcurs in ordini diferite de la un nivel la altul pentru a verifica arborele nivel cu niver (traversand arborele prin cuprindere) sau extinderea primului nod radacina si reluarea traseului de parcurgere din locul de unde acesta s-a oprit (procedura abordand o parcurgere a arborelui in adancime).Alte exemple de arbori de cautare sunt "Iterative-deepending search","Deph-limited search (DLS)",cautarea bidirectionala si cautarea prin cost unuform.

    6. Cautarea in graf. >>>

    Cele mai multe probleme din cadrul domeniului de studiere a grafurilor pot fi solutionate folosind algoritmi de cautare, cum ar fi algoritmul lui Dijkstra, algoritmul lui Kruskal,algoritmul lui Prim si algoritmul de cautare numit "algoritmul celui mai apropiat vecin".Acesti algoritmi pot fi vazut ca metode de cautare ce provin din algoritmul de cautare in arbore.

    6. Cautarea in baza de date structurate (SQL). >>>

    Majoritatea problemelor de cautare sin arbori pot fi rezolvati folosind cautarile de tip SQL (Structured Query Language).De obicei SQL se comporta eficient in baze de date structurate.El ofera unul dintre avantajele de eficienta a comportarii mai bun decat tipul de cautare ierarhica, deoarece permite accese la date inmai multe moduri.In cautarile ierarhice traseul este fortat prin conexiuni (legaturi -exemplu aranjarea in ordine alfabetica), insa in cautarea SQL este posibilitatea accesarii datelor prin mai multe directii ( de exemplu prin nume, adresa, salariu etc..)

    7. Cautarea informata. >>>

    Intr-o cautare informata se foloseste o euristica ca si ghid in abordarea problemei.Folosind strategiile cautarii neinformate pentru solutionarea cerintelor (problemelor), numarul de sortari investigate inainte de a gasii o solutie poate ajunge prohibitiv de mare, chiar si pentru cerinte relativ simplu de rezolvat.Spatiul solutiilor posibile poate fi redus prin aplicarea informatiilor euristice despre problema.In cele din urma se va decide pe baza unei functii de evaluare euristica atasarea starilor pentru a determina care este starea ce urmeaza sa fie exlorata.O astfel de comportare corespunde unei strategii de cautare informata, numita si cautare euristica.In aceasta categorie sunt inclusi si cativa algoritmi de informare proeminenta in cautarea in liste.Un posibil membru al acestei categorii este un tablou asociat cu o functie asociata care reprezinta o euristica de baza in rezolvarea cerintei de cautare.Cei mai multi algorimi de cautare informata sunt pentru traversarea arborilor, cum sunt de exemplu cautarea informata "Best-first" si A*.Acestea au principul de functionare asemanator cu cel al algoritmilor de cautare neinformata, si pot fi expusi si in cautarile in grafuri.


Structuri de date abstracte | SDA Arbori | SDA Arbori Binari | SDA Arbori Multicai | SDA Arbori Optimi | SDA Graf | Traversarea grafurilor | SDA Graf Ponderat | SDA Graf Orientat | SDA Lista Inlantuita | SDA Tablou Asociat | Despre algoritmi. | Algoritmi de cautare neinformata, cautarea inforamata,cautarea in liste,in grafuri, in SQL-uri | Algoritmi de cautare liniara, binara, interpolare | Prezentare Algoritmi Sortare | Sortare Insertie cu Pas Variabil (Shellsort) | Sortarea Prin Ansamble (Heapsort) | Sortarea Prin Insertie (Insertionsort) | Sortarea Prin Interclasare (Mergesort) | Sortarea Prin Interschimbare (Bubblesort) | Sortarea Prin Selectie (Selectionsort) | Sortarea Rapida (Quicksort)


Inapoi la pagina principala



©2006-2007 frankeman Software - Timisoara. Toate drepturile sunt rezervate.