Implementazioni di algoritmi/Ricerca dicotomica
Wikibooks, manuali e libri di testo liberi.
La ricerca dicotomica (o ricerca binaria) è un algoritmo di ricerca per individuare un determinato valore all'interno di un insieme ordinato di dati. La ricerca dicotomica richiede un accesso casuale ai dati in cui cercare.
Indice |
[modifica] Implementazione in Python versione ricorsiva
def binsearchr(seq, search, left=0, right=None): if right==None: right = len(seq) center = (left + right) / 2 if left>right: return -1 if search<seq[center]: return binsearchr(seq, search, left, center-1) elif search>seq[center]: return binsearchr(seq, search, center+1, right) else: return center
[modifica] Implementazione in Python versione non ricorsiva
def binsearch(seq, search): left = 0 right = len(seq)-1 while left<=right: center = (left + right) / 2 if search<seq[center]: right=center-1 elif search>seq[center]: left=center+1 else: return center return -1
[modifica] Implementazione in C versione ricorsiva
int ricercaBinaria(int lista[], int x, int a, int z ) { int m; // Determina l'elemento centrale m = ( a + z ) / 2; if ( m < a || z < 0 ) { // l'elemento cercato non c'è return -1; } else if ( x < lista[m] ) { // Si ripete la ricerca nella parte inferiore return ricercaBinaria( lista, x, a, m-1 ); } else if ( x > lista[m] ) { // Si ripete la ricerca nella parte superiore return ricercaBinaria( lista, x, m+1, z ); } else { // m rappresenta l'indice dell'elemento cercato return m; } }
[modifica] Implementazione in C versione non ricorsiva
// lista l'array su cui effettuare la ricerca // n numero elementi della lista // x chiave da ricercare // N.B.: questa implementazione è valida solo se la lista contiene dati numerci (int) // per estenedere la ricerca ad altri tipi di dati occorre riportare alcune // modifiche sui tipi di dati e sulle if di comparazione. // buon lavoro! int ricercaBinariaNonRicorsiva(int lista[], int n, int x) { int p,u,m; p = 0; u = n-1; while(p<=u) { m = (p+u)/2; if(lista[m]==x) return m; // valore x trovato alla posizione m if(lista[m]<x) p = m+1; else u = m-1; } // se il programma arriva a questo punto vuol dire che // il valore x non è presente in lista, ma se ci fosse // dovrebbe trovarsi alla posizione u (nota che qui p==u) return -1; }
[modifica] Implementazione in Java versione non ricorsiva
/* * @param lista l'array ordinato su cui effettuare la ricerca * @param key il valore da cercare * @return la posizione del valore trovato, -1 se non l'ha trovato */ public int ricercaBinariaNonRicorsiva(int lista[], int key) { int low = 0; int high = lista.length-1; while (low<=high) { int mid = (low+high)/2; if(lista[mid]==key)) { return mid; //valore trovato nella posizione mid } else if (lista[mid]<key) { low = mid + 1; } else { high = mid - 1; } } return -1; //non l'ha trovato }