Ruby 2.0.0 Array #bsearch行为

时间:2014-04-22 14:08:49

标签: arrays ruby binary-search bsearch

我注意到,从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

2 个答案:

答案 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}}的中间元素,55 == 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放在宇宙飞船的右侧。

这也适用于字符串和任何与<=>相当的对象。