2014-04-22 7 views
14

Ruby 2.0.0에서 배열 클래스는 내가 테스트 한 bsearch 메서드를 가지고 있으며 기대했던 동작을 얻지 못한다는 것을 알게되었습니다. 왜 2와 5의 값을 반환 하나 -1, 1, 4는 nil입니까?Ruby 2.0.0 Array # bsearch 동작

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 

답변

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 

이진 검색은 다음 반복에 대한 검색을 위해 선택되어야한다 어레이 (좌측 또는 우측)의 일부 힌트로 블록의 결과를 사용한다. block이 0을 반환하면 검색이 중지됩니다. 그것은 왼쪽으로 갈 것입니다 0 적은 다음 반환하는 경우 그렇지 않으면 바로갑니다 :)

이 여기

더 많은 정보 http://www.ruby-doc.org/core-2.1.1/Array.html#method-i-bsearch

좋아 UPD,의 당신의 예를

arr_in = [-1, 1, 2, 4, 5] 
arr_in.bsearch { |x| x == 3 } 

먼저 보자 우리는 중간 요소 (2)를 취하여 그것을 블록으로 가져올 것입니다. 2 == 3false을 반환하므로 배열의 오른쪽으로 이동합니다.

우리는 5입니다 [4, 5]5 == 3의 중간 요소를 false

오른쪽에는 어떤 요소가되지 가지고, 그래서 우리는 nil

arr_in = [-1, 1, 2, 4, 5] 
arr_in.bsearch { |x| x == 2 } 

먼저 2 == 2true입니다 반환합니다. 우리는 왼쪽으로 간다.

[-1, 1]의 중간 요소는 1입니다. 1 == 2false입니다. 우린 오른쪽으로 간다.

이 바로 1-[-1, 1]에는 어떤 요소가 없다, 그래서 우리는 2

PS입니다 true 문 반환 마지막 마지막 요소 반환 : 배열을 정렬해야 함을 잊지 마세요)

+0

찾기 - 최소 모드 *에서 어떤 일이 발생했는지 설명해야합니다. OP의 예가 이와 관련되어 있습니다. –

+0

@ArupRakshit 저자가 find-any에 관해 묻고 있지만, 그렇지 않습니까? – fl00r

+0

나는 그렇게 생각하지 않는다. –

1

나는 더 직관적 그냥 우주선의 오른쪽에있는 x을 넣어해야합니다 우주선 연산자

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

를 사용하여 찾을 수 있습니다.

문자열과 <=>과 비슷한 모든 개체에도 적용됩니다.