2014-04-22 10 views
14

Zauważyłem, że od Ruby 2.0.0 klasa tablicy ma metodę bsearch, którą testowałem i nie dostaję zachowania, którego oczekiwałbym. Dlaczego zwraca wartość 2 i 5, ale nil dla -1, 1 i 4?Ruby 2.0.0 Array # bsearch behaviour

arr_in = [-1, 1, 2, 4, 5] 

arr_in.bsearch { |x| x == 3 } #=> nil 
arr_in.bsearch { |x| x == -1 } #=> nil 
arr_in.bsearch { |x| x == 1 } #=> nil 
arr_in.bsearch { |x| x == 2 } #=> 2 
arr_in.bsearch { |x| x == 4 } #=> nil 
arr_in.bsearch { |x| x == 5 } #=> 5 

Odpowiedz

24
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;)

+0

Powinieneś wyjaśnić, co się stało * w trybie minimum wyszukiwania *? Z przykładami OP wynikającymi z tego. –

+0

@ArupRakshit I choć autor pyta o znalezisko, czyż nie? – fl00r

+0

Nie sądzę .. –

1

Uważam to bardziej intuicyjne w użyciu operatora statku kosmicznego

array.bsearch {|x| 3 <=> x } 

Tylko upewnij się umieścić x po prawej stronie statku kosmicznego.

Działa to również w przypadku ciągów i każdego obiektu porównywalnego z <=>.

Powiązane problemy