首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby2.0.0 Array#bsearch行为

Ruby2.0.0 Array#bsearch行为
EN

Stack Overflow用户
提问于 2014-04-22 14:08:49
回答 2查看 5.2K关注 0票数 19

我注意到,在Ruby2.0.0中,数组类有一个我正在测试的bsearch方法,而且我没有得到我期望的行为。为什么它返回一个值为2和5,但nil为-1,1和4?

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-22 14:20:42

代码语言:javascript
复制
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

好的,让我们举你的例子

代码语言:javascript
复制
arr_in = [-1, 1, 2, 4, 5]
arr_in.bsearch { |x| x == 3 }

首先,我们将取中间元素(2),并将其转化为块。2 == 3将返回false,因此我们移到数组的右侧。

我们采用[4, 5]的中间元素55 == 3false

右边没有任何元素,所以我们将返回nil

代码语言:javascript
复制
arr_in = [-1, 1, 2, 4, 5]
arr_in.bsearch { |x| x == 2 }

第一个2 == 2true。我们往左边走。

[-1, 1]的中间元素为1,1 == 2false。我们往右边走。

[-1, 1]中没有任何元素右转到1,因此我们返回返回true语句的最后一个元素,即2

PS:别忘了,数组应该排序;)

票数 34
EN

Stack Overflow用户

发布于 2017-01-20 08:37:23

我发现使用太空船运算符更直观

代码语言:javascript
复制
array.bsearch {|x| 3 <=> x }

一定要把x放在飞船的右边。

原因是在每次迭代中被比较的东西是左边的操作数。因此,如果您想要找到一个3,您需要不断地比较与一个3,以获得正确的左,右,或相等的结果。如果您将变量放在左边(您可能会直观地这样做),那么您已经反转了比较输出,从而挫败了bsearch算法!

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

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23221965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档