Ricerca binaria

Sk_Anonymous
Se ho il seguente vettore di 7 numeri:

0-3-4-x-10-11-12

Per trovare il valore di x,che si trova a metà,devo fare x=(inf+sup)/2=6?


mi sa di no perchè se ho

0-3-4-6-x-11-12

e voglio trovare la x,poichè A[med]:(

Risposte
gigilatrottola2
Dovresti vedere la x come un indice, nn come un valore, ossia la posizione che essa occupa nel vettore.

x = indice
vettore[x] = valore dell'elemento in posizione x

Ti posizioni a metà e controlli il valore vettore[x] con quello che cerchi. Se è diverso ti sposti in una delle due metà (a seconda che quello che cerchi sia maggiore o minore di quello in posizione x) e continui.

Sk_Anonymous
Sicuramente il valore di x sarà minore dei valori di destra e maggiore dei valori di destra.Ma come trovo tale valore?

_luca.barletta
Prima stavi facendo confusione tra indici dell'array e valori dell'array.
Ti faccio un esempio semplice: vuoi trovare un numero di telefono dall'elenco telefonico, appunto. Tu conosci il cognome e vuoi ottenere il numero di telefono (ovvero conosci il valore dell'array da ricercare e vuoi sapere la sua posizione nell'array).
1) Apri l'elenco a caso, ipotizziamo a metà (med)
2a) se il cognome che leggi viene dopo (prima) in ordine alfabetico rispetto a quello che ti interessa allora puoi scartare la seconda (prima) metà dell'elenco
2b) se il cognome che leggi è quello che ti interessa hai finito. FINE

3) il tuo nuovo elenco diventa l'elenco ridotto, ritorni a 1.

gigilatrottola2
Beh nella ricerca binaria devi sapere quanti elementi hai ed assumere che siano ordinati.

Fatto ciò, x indica LA POSIZIONE dell'elemento che si trova a metà del vettore che consideri, ossia tutto il vettore inizialmente, la metà al secondo giro, un quarto al terzo e cosi via...

Molti si incasinano su questa parte, ma è normale
x è LA POSIZIONE
vettore[x] è il VALORE dell'elemento in quella posizione

Sk_Anonymous
allora $x$ può assumere indifferentemente tutti i numeri interi tali che $5<=x<=9$?

Sk_Anonymous
:prayer:

Cheguevilla
allora $x$ può assumere indifferentemente tutti i numeri interi tali che $5<=x<=9$?
Non capisco il senso di questa affermazione.
Il post di luca.barletta mi sembra sufficientemente chiaro.
Fai bene attenzione al numero che indica la posizione nel vettore e all'elemento contenuto dal vettore in quella posizione.

Sk_Anonymous
Mi riferisco al mio esempio

lorven
Lavorando sull'esempio di ENEA84:

Il vettore V, di dimensione N=7 e già ordinato, sia: 0-3-4-6-9-11-12
il valore x da ricercare in V sia, ad esempio, x=9

all'inizio, la posizione iniziale di ricerca: inf=1 e la posizione finale di ricerca: sup=N=7

1) viene calcolato med=[(inf+sup)/2] = 4
2) si confronta V(med) con x: V(4)=9? NO
(fosse stato V(4)=9, l'algoritmo sarebbe dovuto terminare)
quindi si determina in quale metà del vettore ricercare x:
3) x>V(med)? SI', perchè 9>6
pertanto x, se apparisse in V, dovrebbe stare "a destra" della posizione med:
ridefiniamo l'ambito di ricerca, "scartando" la porzione di vettore in cui x sicuramente non c'è
e, quindi, sup resta fermo a 7 e si sposta inf:
4) inf = med+1 (inf diventa = 5)
(se fosse stato x e si ripete dal punto 1):

1) med=[(inf+sup)/2] = 6
2) V(6)=9? NO
3) x>V(med)? NO
4) sup=med-1 (sup diventa = 5)

e si ritorna a 1)

1) med=[(inf+sup)/2] = 5
2) V(5)=9? SI
e termina l'algoritmo.

Se x fosse stato un valore non presente in V, ad esempio 10, l'algoritmo
avrebbe fatto avanzare inf e indietreggiare sup, fino a che inf non fosse
diventato > sup: questa condizione garantisce che x NON è un valore contenuto in V.
Ricordo che il numero massimo di passi per trovare x o per stabilire che
x non appare in un vettore ordinato di dimensione N è pari a $[log_2N] +1$
:-)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.