jsh*_*ort 19 ruby arrays 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
Run Code Online (Sandbox Code Playgroud)
fl0*_*00r 30
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
Run Code Online (Sandbox Code Playgroud)
二进制搜索使用块的结果作为提示应该选择阵列的一部分(左侧或右侧)以便在下一次迭代时进行搜索.如果块返回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 }
Run Code Online (Sandbox Code Playgroud)
首先,我们将采用中间元素(2)并将其生成块.2 == 3将返回false,所以我们移动到数组的右侧.
我们把中间的元素[4, 5]是5和5 == 3是false
右边没有任何元素,所以我们会回来 nil
arr_in = [-1, 1, 2, 4, 5]
arr_in.bsearch { |x| x == 2 }
Run Code Online (Sandbox Code Playgroud)
首先2 == 2是true.我们走到左边.
中间元素[-1, 1]是1. 1 == 2是false.我们走向右边.
1中没有任何元素[-1, 1],所以我们返回最后一个返回true语句的元素2
PS:别忘了,数组应该排序;)
aku*_*uhn 11
我发现使用宇宙飞船运营商更直观
array.bsearch {|x| 3 <=> x }
Run Code Online (Sandbox Code Playgroud)
只需确保将x太空船放在右侧.
这也适用于字符串和任何可比较的对象<=>.
| 归档时间: |
|
| 查看次数: |
3882 次 |
| 最近记录: |