SlideShare a Scribd company logo
1 of 16
Download to read offline
Dipartimento Ingegneria Chimica Materiali Ambiente

             Abilità Informatiche
                  Lezione 19
                18 Aprile 2012




            Prof. Antonino Stelitano
Docente        Antonino
               Stelitano

Tutor          Da definire

Lezioni        Lunedì             14:00 – 17:30 aula 16
                                  Lab. Paolo Ercoli

               Mercoledì          15:45 – 19:00 aula 17
                                  Lab. Paolo Ercoli
Ricevimento:   Per                antonino.stelitano@uniroma1.it
               appuntamento       stelitano.a@libero.it


Sito web:      http://w3.uniroma1.it/ab_informatiche/
Gli algoritmi di ricerca

Per ricerca si intende, qui il procedimento di localizzazione di una particolare
informazione in un elenco di dati.
Il problema della ricerca in termini generali :
• Dato un insieme L = {a ,a ,...,a } di n elementi distinti e un elemento x
     (elemento chiave ), determinare se x appartiene all'insieme.
Il metodo di ricerca dipende da come le informazioni sono organizzate, esistono
due possibili approcci :

Ricerca Sequenziale – serve per ricercare i dati in un vettore NON ordinato

Ricerca Binaria o Dicotomica – serve nel caso in cui i dati nel vettore siano già
ordinati



  3
La Ricerca Sequenziale – L’Algoritmo

    Se non abbiamo alcuna informazione circa l'ordine
    degli elementi nell'insieme, l'unico metodo per
    localizzare un particolare elemento è una ricerca
    lineare cioè si parte dal primo elemento e si
    procede esaminando uno per uno tutti gli elementi
    fino a quando non si trova l’elemento cercato
    oppure fino a quando non sono stati letti tutti gli
    elementi dell’insieme.



4
La Ricerca sequenziale – l’Algoritmo
L’Algoritmo può essere formalizzato effettuando le seguenti operazioni:
1) lettura dal primo elemento del vettore V;
2) confronto ripetuto della chiave K con ciascuno degli elementi del
   vettore;
3) La lettura termina quando è soddisfatto un confronto ossia si trova
     i-esimo elemento = K ( ricerca con successo ) oppure quando si è
   raggiunto l’ultimo elemento del vettore ( ricerca senza successo ).

Osservazione : Abbiamo bisogno di un indice che individui l’elemento
    dell’insieme considerato nel confronto




 5
La ricerca sequenziale codice 1/2
#include <stdio.h>
#define MAXDIM 20 // definisco la dimensione massima del vettore
main()
{
  int i,K,N;       // dichiarazione delle variabili
  int V[MAXDIM]; // dichiarazione delle variabili

    do{
    printf("n Inserire la dimensione del vettore non superiore a %dn",MAXDIM);
     // inserimento del valore da tastiera
    scanf("%d",&N);
    }while(N>MAXDIM);

// inserimento del vettore
 for (i=0;i<N;i++)
 {
    printf("Inserire l'elemento %d : ",i+1);
    scanf("%d",&V[i]);
 }


6
La ricerca sequenziale codice 1/2
// Inserimento del valore da cercare ( la chiave K )
printf("Inserire l'elemento da cercare : ");
scanf("%d",&K);

// la variabile i è stata già usata, è necessario un nuovo assegnamento
i=0;

// lettura degli elementi del vettore partendo dal primo V[0]
while( K != V[i] && i<N )
{
  // leggere l'elemento successivo dell'array V
     i = i + 1;
}
//risultato della ricerca
if ( i<N ) printf("Elemento trovato in posizione %dn", i+1);
else printf("Elemento non trovaton");

} // Fine del main
7
La ricerca dicotomica o binaria



    Se la sequenza è ordinata si può effettuare una
    ricerca più efficiente che mi permette di
    individuare l’elemento cercato senza dover
    scandire tutti gli elementi del vettore.

    L’algoritmo di ricerca binaria dopo ogni
    confronto scarta metà degli elementi del vettore su
    cui si effettua la ricerca restringendo il campo di
    ricerca.



8
La Ricerca Dicotomica – L’Algoritmo

L’Algoritmo può essere descritto mediante i seguenti passi :
1) Si individua l’elemento che sta a metà del vettore;
2) Si confronta la chiave K con tale elemento. Se l’elemento
   individuato non è uguale a quello cercato si prosegue in due modi
   possibili :
   • se K > elemento mediano la ricerca continua solo nel
       semivettore superiore
   • se K < elemento mediano la ricerca continua solo nel
       semivettore inferiore
3) Il procedimento continua iterativamente in modo da suddividere i
   semivettori via via individuati.



9
Esempio numerico :                Valore cercato           26

      2         3   6   12   16    21   24     26   28    30    36   41    50


          inf                                med                     sup


      2         3   6   12   16    21   24     26   28    30    36   41    50


                                         inf        med               sup

      2         3   6   12   16    21   24     26   28    30    36   41    50

                                        inf
                                                    sup
                                        med

10
•  La ricerca termina con successo quando l’elemento
   mediano V[i] considerato ad un certo passo è proprio
   uguale a K.
• La ricerca termina con insuccesso quando la parte di
   vettore considerata è costituita da un solo elemento
   diverso dalla chiave.
Osservazione : Per il calcolo del valore mediano abbiamo
   bisogno di tre indici che individuino l’estremità
   inferiore, l’estremità superiore e la metà del vettore
   considerato ad ogni passo.



11
med = [ (inf+sup)/2 ]


                   K ≠ V [med]
                       and            no
                    inf < sup

                         si
              no                 si
                   K > V [med]
     sup = med - 1            inf = med + 1




12
Ricerca dicotomica codice 1/2

#include <stdio.h>
#define MAXDIM 20 // definisco la dimensione massima del vettore
main()
{
 // La dichiarazione delle variabili
int i,inf,sup,med,K,N;

int V[MAXDIM];
do{
  printf("n Inserire la dimensione del vettore non superiore a %dn",MAXDIM);
  scanf("%d",&N);
  }while(N>MAXDIM);
// inserimento del vettore ordinato
   for (i=0;i<N;i++)
   {
      printf("Inserire l'elemento %d : ",i+1);
      scanf("%d",&V[i]);
   }




13
Ricerca dicotomica codice 2/2



// Inserimento del valore da cercare ( la chiave K )
printf("Inserire l'elemento da cercare : ");
scanf("%d",&K);
inf = 0; //inizializzazione degli indici
sup = N-1;
med = (inf + sup)/2;
//lettura dell'elemento mediano del vettore a ciascun passo
while ( K != V[med] && inf<sup )
{
     if ( K > V[med] ) //controllo sull’elemento mediano
      inf = med+1;
      else
      sup = med-1;

     med = (inf + sup)/2;
}
//risultato della ricerca
if ( V[med]== K )
printf("Elemento trovato in posizione %dn", med+1);
else printf("Elemento non trovaton");
}



14
confronto
 La Ricerca Sequenziale
• ricerca con successo:Nel caso migliore ho un solo confronto e in quello
    peggiore N
  Il numero medio di confronti risulta (N+1)/2
• ricerca senza successo:
   L’algoritmo esamina sempre tutto il vettore, quindi il numero di confronti è
    sempre N

La Ricerca dicotomica o binaria
• Ad ogni iterazione l'insieme è dimezzato, il numero di confronti è pari a quante
volte un numero N può essere diviso per 2 fino a ridurlo a 0.
Per esempio in un vettore di dimensione N = 2h-1
l’algoritmo deve compiere h = log2(N+1) passi (e quindi confronti) per la ricerca
senza successo, nel caso medio il numero è leggermente inferiore mentre nel caso
migliore è 1.



15
confronto


Esempio : Se dovessimo cercare un elemento in un insieme
  di 1.000.000 di elementi, nei casi più sfortunati con
  l’algoritmi di Ricerca Sequenziale dovremmo eseguire
  circa 1.000.000 confronti, mentre con la Ricerca
  Binaria ne dobbiamo effettuare al massimo solamente
  21.




16

More Related Content

More from STELITANO

Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012STELITANO
 
Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012STELITANO
 
Dispenza aloisi
Dispenza aloisiDispenza aloisi
Dispenza aloisiSTELITANO
 
Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)STELITANO
 
Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)STELITANO
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)STELITANO
 
Lezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteLezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteSTELITANO
 
Lezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteLezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteSTELITANO
 
Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)STELITANO
 
Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)STELITANO
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)STELITANO
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)STELITANO
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)STELITANO
 
Lezione 12 (28 marzo 2012) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettoriSTELITANO
 
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni   memoria - puntatoriLezione 12 (28 marzo 2012) funzioni   memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni memoria - puntatoriSTELITANO
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012STELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 

More from STELITANO (20)

Risultati
RisultatiRisultati
Risultati
 
Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012
 
Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012
 
Dispenza aloisi
Dispenza aloisiDispenza aloisi
Dispenza aloisi
 
Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)
 
Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)
 
Lezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteLezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parte
 
Lezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteLezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parte
 
Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)
 
Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)
 
Lezione 12 (28 marzo 2012) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettori
 
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni   memoria - puntatoriLezione 12 (28 marzo 2012) funzioni   memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 

Lezione 19 (18 aprile 2012) ricerca

  • 1. Dipartimento Ingegneria Chimica Materiali Ambiente Abilità Informatiche Lezione 19 18 Aprile 2012 Prof. Antonino Stelitano
  • 2. Docente Antonino Stelitano Tutor Da definire Lezioni Lunedì 14:00 – 17:30 aula 16 Lab. Paolo Ercoli Mercoledì 15:45 – 19:00 aula 17 Lab. Paolo Ercoli Ricevimento: Per antonino.stelitano@uniroma1.it appuntamento stelitano.a@libero.it Sito web: http://w3.uniroma1.it/ab_informatiche/
  • 3. Gli algoritmi di ricerca Per ricerca si intende, qui il procedimento di localizzazione di una particolare informazione in un elenco di dati. Il problema della ricerca in termini generali : • Dato un insieme L = {a ,a ,...,a } di n elementi distinti e un elemento x (elemento chiave ), determinare se x appartiene all'insieme. Il metodo di ricerca dipende da come le informazioni sono organizzate, esistono due possibili approcci : Ricerca Sequenziale – serve per ricercare i dati in un vettore NON ordinato Ricerca Binaria o Dicotomica – serve nel caso in cui i dati nel vettore siano già ordinati 3
  • 4. La Ricerca Sequenziale – L’Algoritmo Se non abbiamo alcuna informazione circa l'ordine degli elementi nell'insieme, l'unico metodo per localizzare un particolare elemento è una ricerca lineare cioè si parte dal primo elemento e si procede esaminando uno per uno tutti gli elementi fino a quando non si trova l’elemento cercato oppure fino a quando non sono stati letti tutti gli elementi dell’insieme. 4
  • 5. La Ricerca sequenziale – l’Algoritmo L’Algoritmo può essere formalizzato effettuando le seguenti operazioni: 1) lettura dal primo elemento del vettore V; 2) confronto ripetuto della chiave K con ciascuno degli elementi del vettore; 3) La lettura termina quando è soddisfatto un confronto ossia si trova i-esimo elemento = K ( ricerca con successo ) oppure quando si è raggiunto l’ultimo elemento del vettore ( ricerca senza successo ). Osservazione : Abbiamo bisogno di un indice che individui l’elemento dell’insieme considerato nel confronto 5
  • 6. La ricerca sequenziale codice 1/2 #include <stdio.h> #define MAXDIM 20 // definisco la dimensione massima del vettore main() { int i,K,N; // dichiarazione delle variabili int V[MAXDIM]; // dichiarazione delle variabili do{ printf("n Inserire la dimensione del vettore non superiore a %dn",MAXDIM); // inserimento del valore da tastiera scanf("%d",&N); }while(N>MAXDIM); // inserimento del vettore for (i=0;i<N;i++) { printf("Inserire l'elemento %d : ",i+1); scanf("%d",&V[i]); } 6
  • 7. La ricerca sequenziale codice 1/2 // Inserimento del valore da cercare ( la chiave K ) printf("Inserire l'elemento da cercare : "); scanf("%d",&K); // la variabile i è stata già usata, è necessario un nuovo assegnamento i=0; // lettura degli elementi del vettore partendo dal primo V[0] while( K != V[i] && i<N ) { // leggere l'elemento successivo dell'array V i = i + 1; } //risultato della ricerca if ( i<N ) printf("Elemento trovato in posizione %dn", i+1); else printf("Elemento non trovaton"); } // Fine del main 7
  • 8. La ricerca dicotomica o binaria Se la sequenza è ordinata si può effettuare una ricerca più efficiente che mi permette di individuare l’elemento cercato senza dover scandire tutti gli elementi del vettore. L’algoritmo di ricerca binaria dopo ogni confronto scarta metà degli elementi del vettore su cui si effettua la ricerca restringendo il campo di ricerca. 8
  • 9. La Ricerca Dicotomica – L’Algoritmo L’Algoritmo può essere descritto mediante i seguenti passi : 1) Si individua l’elemento che sta a metà del vettore; 2) Si confronta la chiave K con tale elemento. Se l’elemento individuato non è uguale a quello cercato si prosegue in due modi possibili : • se K > elemento mediano la ricerca continua solo nel semivettore superiore • se K < elemento mediano la ricerca continua solo nel semivettore inferiore 3) Il procedimento continua iterativamente in modo da suddividere i semivettori via via individuati. 9
  • 10. Esempio numerico : Valore cercato 26 2 3 6 12 16 21 24 26 28 30 36 41 50 inf med sup 2 3 6 12 16 21 24 26 28 30 36 41 50 inf med sup 2 3 6 12 16 21 24 26 28 30 36 41 50 inf sup med 10
  • 11. • La ricerca termina con successo quando l’elemento mediano V[i] considerato ad un certo passo è proprio uguale a K. • La ricerca termina con insuccesso quando la parte di vettore considerata è costituita da un solo elemento diverso dalla chiave. Osservazione : Per il calcolo del valore mediano abbiamo bisogno di tre indici che individuino l’estremità inferiore, l’estremità superiore e la metà del vettore considerato ad ogni passo. 11
  • 12. med = [ (inf+sup)/2 ] K ≠ V [med] and no inf < sup si no si K > V [med] sup = med - 1 inf = med + 1 12
  • 13. Ricerca dicotomica codice 1/2 #include <stdio.h> #define MAXDIM 20 // definisco la dimensione massima del vettore main() { // La dichiarazione delle variabili int i,inf,sup,med,K,N; int V[MAXDIM]; do{ printf("n Inserire la dimensione del vettore non superiore a %dn",MAXDIM); scanf("%d",&N); }while(N>MAXDIM); // inserimento del vettore ordinato for (i=0;i<N;i++) { printf("Inserire l'elemento %d : ",i+1); scanf("%d",&V[i]); } 13
  • 14. Ricerca dicotomica codice 2/2 // Inserimento del valore da cercare ( la chiave K ) printf("Inserire l'elemento da cercare : "); scanf("%d",&K); inf = 0; //inizializzazione degli indici sup = N-1; med = (inf + sup)/2; //lettura dell'elemento mediano del vettore a ciascun passo while ( K != V[med] && inf<sup ) { if ( K > V[med] ) //controllo sull’elemento mediano inf = med+1; else sup = med-1; med = (inf + sup)/2; } //risultato della ricerca if ( V[med]== K ) printf("Elemento trovato in posizione %dn", med+1); else printf("Elemento non trovaton"); } 14
  • 15. confronto La Ricerca Sequenziale • ricerca con successo:Nel caso migliore ho un solo confronto e in quello peggiore N Il numero medio di confronti risulta (N+1)/2 • ricerca senza successo: L’algoritmo esamina sempre tutto il vettore, quindi il numero di confronti è sempre N La Ricerca dicotomica o binaria • Ad ogni iterazione l'insieme è dimezzato, il numero di confronti è pari a quante volte un numero N può essere diviso per 2 fino a ridurlo a 0. Per esempio in un vettore di dimensione N = 2h-1 l’algoritmo deve compiere h = log2(N+1) passi (e quindi confronti) per la ricerca senza successo, nel caso medio il numero è leggermente inferiore mentre nel caso migliore è 1. 15
  • 16. confronto Esempio : Se dovessimo cercare un elemento in un insieme di 1.000.000 di elementi, nei casi più sfortunati con l’algoritmi di Ricerca Sequenziale dovremmo eseguire circa 1.000.000 confronti, mentre con la Ricerca Binaria ne dobbiamo effettuare al massimo solamente 21. 16