在Ruby中是否有内置的二进制搜索?

时间:2011-12-29 19:28:47

标签: ruby binary-search

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

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

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

3 个答案:

答案 0 :(得分:49)

Ruby 2.0引入了Array#bsearchRange#bsearch

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

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

要立即使用它,您可以O(n)require 'backports/2.0.0/array/bsearch'

祝你好运!

答案 1 :(得分:4)

自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 <=> val }

答案 2 :(得分:0)

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

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

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

注意:二进制搜索需要一个排序数组;与搜索速度相比,这增加了开销,但它很好。

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