Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
Dalla A alla Z passando per C - Robotica
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
valori −10 −8 −7 −5 −4 −3 −1 2 2 3 4 5 6 6 8 11 13<br />
indici<br />
}<br />
0<br />
3 > 2<br />
3 == 3<br />
3 < 4<br />
3 < 6<br />
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16<br />
Figura 19.1: Esempio di ricerca binaria.<br />
} else if (x < l[m]) {<br />
return bsearch1(l, x, a, m - 1); /* ricerca nella parte inferiore */<br />
} else if (x > l[m]) {<br />
return bsearch1(l, x, m + 1, b); /* ricerca nella parte su<strong>per</strong>iore */<br />
} else {<br />
return m; /* indice dell’elemento desiderato */<br />
}<br />
Si faccia attenzione al fatto che, nell’implementazione, i valori a e b che delimitano l’intervallo<br />
di ricerca sono degli indici <strong>per</strong> il vettore l, e non i valori contenuti in determinate posizioni del<br />
vettore.<br />
In Figura 19.1 è rappresentato un esempio di ricerca binaria su un vettore di 17 elementi, nel<br />
quale si è interessati a trovare l’elemento di valore 3.<br />
Il vantaggio della ricerca binaria rispetto a quella sequenziale è che richiede al più log(n) + 1<br />
iterazioni <strong>per</strong> determinare la posizione dell’elemento desiderato o <strong>per</strong> stabilire che esso non sia<br />
presente.<br />
Dal momento che qualsiasi algoritmo ricorsivo può essere implementato in forma non ricorsiva,<br />
di seguito è presentata la forma non ricorsiva dell’algoritmo di ricerca binaria. Ad ogni passo<br />
viene ricalcolato esplicitamente il limite su<strong>per</strong>iore o inferiore dell’intervallo di ricerca, e l’elemento<br />
centrale viene confrontato con il valore desiderato.<br />
Quando l’esecuzione esce dal ciclo while significa che l’elemento x non è presente in lista.<br />
int bsearch1_nr(int l[], int x, int n)<br />
{<br />
int a, b, m;<br />
a = 0;<br />
b = n - 1;<br />
while (a