首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby: bsearch返回零

Ruby: bsearch返回零
EN

Stack Overflow用户
提问于 2020-11-11 15:29:24
回答 1查看 59关注 0票数 0

我有一个排序的数字数组,并希望检查数字是否在数组中。我认为这里应该使用bsearch,但是即使数组中有数字,它也会返回nil,并且只给出中间元素的正结果。

这是我要测试的。

代码语言:javascript
复制
>> [1,2,3,4,5].bsearch { |value| value <=> 1}
>> nil
>> [1,2,3,4,5].bsearch { |value| value <=> 3}
>> 3

我正在使用RubyVersion2.3.8

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-11 18:15:36

您正在查找-任意模式下使用Array#bsearch

正如文档所述,您的块需要满足以下要求:

  • 所有正评价元素先于所有零评估元素,
  • 所有正评价元素先于所有负面评估元素,
  • 所有零评估元素先于所有负面评估元素。

您的块违反了这些要求。

让我们来看看一个例子。在第一次迭代中,Array#bsearch将选择中间元素,即3,并将其传递给您的块。块返回1,这意味着要搜索的元素大于3,因此必须位于当前元素的右侧。因此,Array#bsearch抛出数组的左半部分,剩下的是[4, 5]。现在,Array#bsearch再次选择“中间”元素,即4,并将其传递给您的块。块返回1,这是一个正数,因此意味着要查找的元素大于4,因此必须位于数组的右半部分。因此,Array#bsearch再次抛出了左半部分,剩下的是[5]。同样,Array#bsearch5传递给块,您的块返回1,这是一个正数,因此意味着我们需要向右看,除非我们已经在数组的末尾,因此我们可以得出结论,您要查找的元素不在数组中。

所以,基本上,您只是告诉Array#bsearch看错地方了。

让我们再看一下文档:

在查找-任意模式下作为块都是有意义的:

A= 0,4,7,10,12 a.map {AC.26元素7 <=>元素}# => 1,1,0,-1,-1 a.map {AC.26 element { <=> element }# => -1,-1,-1,-1,-1,-1,-1 a.map {AC.26 element 5 <=> element }# => 1,1,- 1,- 1,- 1,- 1,-1 a.map {element 15 <=> element}# => 1,1,1,1,1,-1

这是没有道理的:

A= 0,4,7,10,12 a.map {区元素<=> 7}# => -1,-1,0,1,1

因此,从本质上讲,您编写的块与文档明确表示错误的块完全相同,与文档告诉您的方式完全相反。

如果您翻转了块中的两个操作数,以便您的块看起来像文档中的示例,说明它应该查看,那么它将工作:

代码语言:javascript
复制
[1, 2, 3, 4, 5].bsearch { |value| 0 <=> value } #=> nil
[1, 2, 3, 4, 5].bsearch { |value| 1 <=> value } #=> 1
[1, 2, 3, 4, 5].bsearch { |value| 2 <=> value } #=> 2
[1, 2, 3, 4, 5].bsearch { |value| 3 <=> value } #=> 3
[1, 2, 3, 4, 5].bsearch { |value| 4 <=> value } #=> 4
[1, 2, 3, 4, 5].bsearch { |value| 5 <=> value } #=> 5
[1, 2, 3, 4, 5].bsearch { |value| 6 <=> value } #=> nil
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64789365

复制
相关文章

相似问题

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