18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!