【问题标题】:Is there a built-in binary-search In Ruby?Ruby 中有内置的二进制搜索吗?
【发布时间】:2012-01-30 03:26:55
【问题描述】:

我正在寻找一种内置的 Ruby 方法,它与index 具有相同的功能,但使用二分搜索算法,因此需要一个预排序的数组。

我知道我可以编写自己的实现,但是根据“Ruby#index Method VS Binary Search”,index 使用的内置简单迭代搜索比纯 Ruby 版本的二进制搜索要快,因为内置方法是用C写的。

Ruby 是否提供任何执行二进制搜索的内置方法?

【问题讨论】:

  • 无需自己编写:tyler/binary_search。作者还花时间运行了一些基准测试。
  • 嗨 sczizzo,我是 ruby​​ 新手,所以这是一个非常新的问题,但是如何将此功能添加到我的 ruby​​ 安装中?只是运行 rakefile 的问题吗?谢谢。
  • 可能更容易使用 bsearch gem,正如 Marc-André 所建议的那样。然后它就像命令行中的gem install bsearch 和Ruby 中的require 'bsearch' 一样简单。你可能想look at the documentation for usage
  • 应该注意的是,即使它是用 ruby​​ 编写的,对于足够大的数组,任何二进制搜索的实现最终都会胜过线性搜索的任何实现,无论如何优化。

标签: ruby binary-search


【解决方案1】:

我使用bsearch。它是这样工作的:

array = ['one', 'two', 'three', 'four', 'five']

search = array.sort.bsearch { |value| 'four' <=> value }

注意:二分查找需要一个有序数组;这增加了一点开销,但与搜索速度相比,这很好。

search 将返回 array 的值 four,否则 nil 如果找不到该值。

【讨论】:

    【解决方案2】:

    自 2011 年以来发生了很大变化,在 Ruby 2.3 中,您可以使用 bsearch_index

    https://ruby-doc.org/core-2.3.0/Array.html#method-i-bsearch_index

    array.bsearch_index { |val| query &lt;=&gt; val }

    【讨论】:

    • 这有什么问题? arr = ['a', 'b', 'c', 'd','e']arr.sort.bsearch { |x| 'a' == x }
    • @AHK 尝试 arr.sort.bsearch{ |x| 'a' x }
    【解决方案3】:

    Ruby 2.0 引入了Array#bsearchRange#bsearch

    对于 Ruby 1.9,您应该查看 bsearchbinary_search gems。 其他可能性是使用与数组不同的集合,例如 using rbtree

    bsearch 在我的backports gem 中,但这是一个纯 Ruby 版本,所以速度要慢一些。请注意,对于足够大的数组/范围(或昂贵的比较),纯 Ruby 二进制搜索仍然比线性内置搜索(如 indexinclude?)更快,因为它的复杂性顺序不同 O(log n) 与 @987654338 @。

    今天要玩它,你可以require 'backports/2.0.0/array/bsearch'require 'backports/2.0.0/range/bsearch'

    祝你好运!

    【讨论】:

    • 嗨,马克,感谢您的回答。是否有任何我可以使用的第三方库(用 C 编写)?
    • 而且@sczizzo 也链接到另一个宝石。
    • 请注意,Array#bsearch 现已合并到 Ruby 中:bugs.ruby-lang.org/issues/4766#change-32923
    • @Rahul:是的,Array#include? 是线性的,所以会更慢。
    • 有没有办法返回索引而不是值?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2014-05-11
    • 2017-08-10
    相关资源
    最近更新 更多