Nell'articolo http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binarySearch, l'autore discute della ricerca binaria. Fa una distinzione tra trovare il valore più basso in cui qualcosa è vero, e il valore più alto in cui qualcosa è falso. L'array di essere cercato sembra qualcosa di simile:Differenza tra ricerca binaria di base per limite superiore e limite inferiore?
false false false true true
Sono curioso di sapere perché questi due casi sono diversi. Perché non riesci a trovare il valore più basso che è vero, quindi sottrai uno per trovare il valore più alto che è falso?
Edit2: Ok, quindi capisco lower vs upper bound. Ora, sto cercando di capire, quando cerco il numero più piccolo maggiore o uguale alla query, perché non possiamo semplicemente cambiare lo if(mid>query)
in if(mid>=query)
e farlo fare più in basso che in alto.
Edit: Ecco ciò che l'articolo afferma:
"Ora abbiamo finalmente arriviamo al codice che implementa la ricerca binaria, come descritto in questo e nel precedente paragrafo:
binary_search(lo, hi, p):
while lo < hi:
mid = lo + (hi-lo)/2
if p(mid) == true:
hi = mid
else:
lo = mid+1
if p(lo) == false:
complain // p(x) is false for all x in S!
return lo // lo is the least x for which p(x) is true
...
Se volessimo trovare gli ultimi x per i quali p (x) è falsa, dovremmo inventare (utilizzando una logica simile come sopra) qualcosa come:
binary_search(lo, hi, p):
while lo < hi:
mid = lo + (hi-lo+1)/2 // note: division truncates
if p(mid) == true:
hi = mid-1
else:
lo = mid
if p(lo) == true:
complain // p(x) is true for all x in S!
return lo // lo is the greatest x for which p(x) is false
. "
Beh, im assumendo che la ricerca binaria implica il set sembra qualcosa di simile ** falso .... falso vero ... vero ** non importa quale –
L'articolo im riferimento a implica che questo è il caso se siamo eseguire la ricerca binaria; Credo che sia anche una necessità per la ricerca binaria di applicarsi anche alla situazione. –
@ DietmarKühl sicuro, ma non potresti facilmente controllare che con il numero 'if (lo == 0 && works (lo) == true) return false'? –