16
Dipartimento Ingegneria Chimica Materiali Ambiente Abilità Informatiche Lezione 19 18 Aprile 2012 Prof. Antonino Stelitano

Lezione 19 (18 aprile 2012) ricerca

Embed Size (px)

Citation preview

Page 1: Lezione 19 (18 aprile 2012)   ricerca

Dipartimento Ingegneria Chimica Materiali Ambiente

Abilità Informatiche

Lezione 19

18 Aprile 2012

Prof. Antonino Stelitano

Page 2: Lezione 19 (18 aprile 2012)   ricerca

Docente Antonino

Stelitano

Tutor Da definire

Lezioni Lunedì

Mercoledì

14:00 – 17:30 aula 16

Lab. Paolo Ercoli

15:45 – 19:00 aula 17

Lab. Paolo Ercoli

Ricevimento: Per

appuntamento

[email protected]

[email protected]

Sito web: http://w3.uniroma1.it/ab_informatiche/

Page 3: Lezione 19 (18 aprile 2012)   ricerca

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

Page 4: Lezione 19 (18 aprile 2012)   ricerca

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.

Page 5: Lezione 19 (18 aprile 2012)   ricerca

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

Page 6: Lezione 19 (18 aprile 2012)   ricerca

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 %d\n",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]);

}

Page 7: Lezione 19 (18 aprile 2012)   ricerca

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 %d\n", i+1);

else printf("Elemento non trovato\n");

} // Fine del main

Page 8: Lezione 19 (18 aprile 2012)   ricerca

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.

Page 9: Lezione 19 (18 aprile 2012)   ricerca

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.

Page 10: Lezione 19 (18 aprile 2012)   ricerca

10

Esempio numerico : Valore cercato

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

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

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

inf sup med

med sup inf

inf

med sup

26

Page 11: Lezione 19 (18 aprile 2012)   ricerca

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.

Page 12: Lezione 19 (18 aprile 2012)   ricerca

12

K ≠ V [med]

and

inf < sup

med = [ (inf+sup)/2 ]

K > V [med]

inf = med + 1 sup = med - 1

si

si

no

no

Page 13: Lezione 19 (18 aprile 2012)   ricerca

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 %d\n",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]); }

Page 14: Lezione 19 (18 aprile 2012)   ricerca

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 %d\n", med+1); else printf("Elemento non trovato\n"); }

Page 15: Lezione 19 (18 aprile 2012)   ricerca

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.

Page 16: Lezione 19 (18 aprile 2012)   ricerca

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.