La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Sistemi e Tecnologie Informatiche Strategie di Ricerca Umberto Ferraro Petrillo.

Presentazioni simili


Presentazione sul tema: "Sistemi e Tecnologie Informatiche Strategie di Ricerca Umberto Ferraro Petrillo."— Transcript della presentazione:

1 Sistemi e Tecnologie Informatiche Strategie di Ricerca Umberto Ferraro Petrillo

2 Ricerca di un elemento Problema: Dato un elenco di voti ed un valore x (e.g., 29), stabilire se x compare nell’elenco e in che posizione 25

3 Ricerca sequenziale (in ordine crescente) Consente l’individuazione di un qualsiasi valore all’interno di un elenco Gli elementi che compongono l’elenco sono disposti in un ordine qualunque Si scorre l’elenco dal primo all’ultimo elemento confrontando l’elemento corrente con quello ricercato E’ possibile stabilire che un elemento è assente solo dopo aver considerato tutti gli elementi della lista

4 int PosizioneElemento(int Voti[], int elem, int n) /* Effettua la ricerca esaustiva di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ { int i = 0; // Verifichiamo se la fine dell’elenco è stata raggiunta // o se l’elemento corrente coincide con quello cercato while ( i

5 int PosizioneElemento(int Voti[], int elem, int n) /* Effettua la ricerca esaustiva di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ { int i = 0; // Verifichiamo se la fine dell’elenco è stata raggiunta // o se l’elemento corrente coincide con quello cercato while ( i

6 Ricerca di un elemento Supponiamo che l’elenco di partenza sia ordinato, è possibile migliorare la ricerca sequenziale?

7 Ricerca binaria Si consideri un elenco in input ordinato A ed un valore x da ricercare (e.g., 26): Passo 1: Confrontiamo x con l’elemento centrale dell’elenco (A[4]) Caso 1: x==A[4], Ricerca terminata! Caso 2: xA[4], proseguiamo la ricerca in A[5…9]

8 Ricerca binaria >25 (A[4]) 26<28 (A[7]) Ricerchiamo l’elemento 26 Confrontiamo 26 con A[4], è più grande (caso 3), proseguiamo la ricerca in A[5..9] Confrontiamo 26 con A[7], è più piccolo (caso 2), proseguiamo la ricerca in A[5..6] Confrontiamo 26 con A[5], i due numeri coincidono, la ricerca termina 26==26 (A[5])

9 int PosizioneElemento(int inf, int sup, int Voti[], int elem) { /* Effettua la ricerca binaria di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ if ( inf>sup) // Verifichiamo se esistono ancora elementi da considerare return -1; else{ int med = (int) (inf + sup) / 2; if (Voti[med] == elem) return med; // L’elemento è stato individuato else if (elem < Voti[med]) { sup = med -1; // Cerchiamo nella porzione di sinistra return PosizioneElemento(Voti, inf, sup, elem); } else{ inf = med + 1; // Cerchiamo nella porzione di destra return PosizioneElemento(Voti, inf, sup, elem); } } } /* PosizioneElemento */ Cerca elem nel vettore ordinato Voti[inf … sup] Se l’array è vuoto (inf>sup) la ricerca termina (ritorna -1) Considera l’elemento nella posizione centrale (med=(inf+sup)/2) Se elem è uguale a Voti[med] la ricerca termina (ritorna med) Altrimenti, se elem è minore di Voti[med] cerca elem nel vettore ordinato Voti[inf … med -1] Altrimenti, cerca elem nel vettore ordinato Voti[med+1 … sup]

10 int PosizioneElemento(int inf, int sup, int Voti[], int elem) { /* Effettua la ricerca binaria di elem tra i primi n elementi di Voti. Il valore di ritorno e` -1 se elem non e` presente in Voti, altrimenti e` l'indice della posizione di elem. */ if ( inf>sup) // Verifichiamo se esistono ancora elementi da considerare return -1; else{ int med = (int) (inf + sup) / 2; if (Voti[med] == elem) return med; // L’elemento è stato individuato else if (elem < Voti[med]) { sup = med -1; // Cerchiamo nella porzione di sinistra return PosizioneElemento(Voti, inf, sup, elem); } else{ inf = med + 1; // Cerchiamo nella porzione di destra return PosizioneElemento(Voti, inf, sup, elem); } } } /* PosizioneElemento */

11 Ricerca binaria vs Ricerca sequenziale L’efficienza di un algoritmo di ricerca può essere stimata in funzione del numero di confronti che esso richiede L’algoritmo peggiore è quello che necessita del maggior numero di confronti

12 Ricerca sequenziale Si consideri il problema della ricerca di un valore x all’interno di un elenco di taglia n Nella ricerca sequenziale ogni confronto ci consente di escludere al più un elemento Dopo il primo confronto avremo escluso l’elemento 0 Dopo il secondo confronto avremo escluso l’elemento 1 … Dopo il confronto k-esimo avremo escluso k elementi Nel peggiore dei casi (l’elemento ricercato non esiste nell’elenco) saranno necessari n confronti per dare una risposta

13 Ricerca binaria vs Ricerca sequenziale Nella ricerca binaria ogni confronto ci consente di escludere circa la metà degli elementi presenti Dopo il primo confronto restringiamo la ricerca ad n/2 elementi Dopo il secondo confronto restringiamo la ricerca ad (n/2)/2 = n/4 elementi … Dopo il confronto k-esimo restringiamo la ricerca ad n/2 k elementi Nel peggiore dei casi (l’elemento ricercato non esiste nell’elenco) porteremo avanti la ricerca sino a restringerla ad un solo elemento n/2 k =1 Saranno quindi necessari al più k = log(n) confronti

14 Ricerca binaria vs Ricerca sequenziale Taglia elenco input Ricerca sequenziale Ricerca binaria n=1,0001,0009,96 n=10,00010,00013,28 n=100,000100,00016,6 n=1,000,0001,000,00019,9


Scaricare ppt "Sistemi e Tecnologie Informatiche Strategie di Ricerca Umberto Ferraro Petrillo."

Presentazioni simili


Annunci Google