Sei sulla pagina 1di 3

Algoritmi di ricerca

Problema della ricerca


Problema: decidere se un intero si trova in un vettore (true/false)
(versione alternativa: restituire la prima posizione in cui trovo l’elemento nel vettore
oppure -1 se l’elemento non c’è)
Prima soluzione (ricerca ingenua): controllare ogni elemento.
public static boolean cerca(int v[], int x) {
boolean trovato=false;
for(int i=0; i<v.length; i++){
if(v[i]==x){
trovato=true;
}
}
return trovato;
}

Quando ho trovato un elemento, il metodo continua ugualmente a verificare gli altri.


È un problema se:
•ho vettori molto grandi
•devo fare spesso questa ricerca
Seconda soluzione (ricerca con sentinella): quando trovo l'elemento, mi fermo.
public static boolean cerca(int v[], int x) {
for(int i=0; i<v.length; i++){
if(v[i]==x){
return true;
}
}
return false;
}

Se l'elemento non c'è, finisco con il fare tutta la scansione del vettore.
In generale, questo è inevitabile.

Vettore ordinato
Il vettore è ordinato se il primo elemento è minore del secondo, che è minore del
terzo, ecc.
La ricerca binaria (o dicotomica)
Si tratta ancora di trovare un elemento in un vettore ordinato.
Idea: invece di procedere sequenzialmente, parto da metà.
Esempio: ricerca di una parola nel vocabolario
Parto da metà vettore. Se l'elemento è quello da cercare, ritorno true

Se l'elemento da cercare è minore di quello a metà del vettore, cerco nella prima metà

Se è maggiore, cerco nella seconda metà

Algoritmo:
• trova l'elemento a metà fra l'inizio e la fine
• se è uguale a quello da cercare, torna true
• se è maggiore, cerca solo nella prima metà
• altrimenti, cerca solo nella seconda metà
È un tipico algoritmo ricorsivo.
Implementazione per esercizio

Quanto costano questi algoritmi?

Modello di costo
Assumo che ogni istruzione richieda tempo 1
Tempo di esecuzione = numero di istruzioni eseguite
Valutazione in base alla dimensione del vettore
n dimensione dei dati (numero di elementi del vettore)
T(n) tempo impiegato dal metodo su un vettore di lunghezza n

Costo degli algoritmi di ricerca


Ricerca sequenziale fino alla fine: tempo T(n)=n in ogni caso.
Ricerca sequenziale in cui mi fermo quando trovo l’elemento cercato:
T(n)=n nel caso peggiore T(n)=1 nel caso migliore
Ricerca binaria: T(n)=log(n) nel caso peggiore T(n)=1 nel caso migliore.

Fonte: http://www.dis.uniroma1.it

Potrebbero piacerti anche