我注意到,从Ruby 2.0.0开始,数组类有一个我正在测试的bsearch
方法,我没有得到我期望的行为。为什么它返回2和5的值,而nil
的值为-1,1和4?
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
答案 0 :(得分:29)
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
二进制搜索使用块的结果作为提示应选择阵列的一部分(左侧或右侧)以便在下一次迭代时进行搜索。如果块返回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 == 3
将返回false
,因此我们移动到数组的右侧。
我们采用[4, 5]
的{{1}}的中间元素,5
为5 == 3
右侧没有任何元素,因此我们将返回false
nil
首先arr_in = [-1, 1, 2, 4, 5]
arr_in.bsearch { |x| x == 2 }
是2 == 2
。我们走到左边。
true
的中间元素为1. [-1, 1]
为1 == 2
。我们走到右边。
false
中没有任何元素直接到1,所以我们返回返回[-1, 1]
语句的最后一个元素true
PS:不要忘记,数组应该排序;)
答案 1 :(得分:7)
我发现使用宇宙飞船运营商更直观
array.bsearch {|x| 3 <=> x }
请务必将x
放在宇宙飞船的右侧。
这也适用于字符串和任何与<=>
相当的对象。