arr_in = [-1, 1,2,4,5]
arr_in.bsearch{ |x| 2 - x }
#=> 2
arr_in.bsearch{ |x| -1 - x }
#=> -1
arr_in.bsearch{ |x| 3 - x }
#=> nil
Binary wyszukiwania używa wynik bloku jako wskazówkę, która część tablicy (lewej lub prawej strony) powinny być dobrane do przeszukiwania na następnej iteracji. Jeśli blok zwróci 0, zatrzyma wyszukiwanie. Jeśli zwróci mniej niż 0 to pójdzie w lewo w przeciwnym razie idzie dobrze :)
Więcej informacji tutaj http://www.ruby-doc.org/core-2.1.1/Array.html#method-i-bsearch
UPD
Ok, weźmy swój przykład
arr_in = [-1, 1, 2, 4, 5]
arr_in.bsearch { |x| x == 3 }
Pierwszy weźmiemy środkowy element (2) i poddamy go blokowi. 2 == 3
zwróci false
, więc przechodzimy na prawą stronę tablicy.
Bierzemy środkowy element [4, 5]
który jest 5
i 5 == 3
jest false
Nie ma żadnych elementów po prawej stronie, więc wrócimy nil
arr_in = [-1, 1, 2, 4, 5]
arr_in.bsearch { |x| x == 2 }
Pierwszy 2 == 2
jest true
. Idziemy w lewo.
Środkowy element [-1, 1]
to 1. 1 == 2
jest false
. Idziemy w prawo.
Nie ma żadnych elementów w [-1, 1]
prawo do 1, więc wracamy Ostatni element, który zwrócony true
oświadczenie, które jest 2
PS: nie zapomnij, że tablica powinna być sortowane;)
Powinieneś wyjaśnić, co się stało * w trybie minimum wyszukiwania *? Z przykładami OP wynikającymi z tego. –
@ArupRakshit I choć autor pyta o znalezisko, czyż nie? – fl00r
Nie sądzę .. –