我正在寻找一个内置的Ruby方法,它具有与index
相同的功能,但使用二进制搜索算法,因此需要预先排序的数组。
我知道我可以编写自己的实现,但根据“Ruby#index Method VS Binary Search”,索引使用的内置简单迭代搜索比纯Ruby版本的二进制搜索更快,因为内置方法是用C语言编写的。
Ruby是否提供了进行二进制搜索的任何内置方法?
答案 0 :(得分:49)
Ruby 2.0引入了Array#bsearch
和Range#bsearch
。
对于Ruby 1.9,您应该查看bsearch
和binary_search
宝石。
其他可能性是使用与数组不同的集合,例如using rbtree
bsearch
在我的backports
gem中,但这是一个纯Ruby版本,因此速度要慢一些。请注意,对于足够大的数组/范围(或昂贵的比较),纯Ruby二进制搜索仍然比线性内置搜索(如index
或include?
)更快,因为它与复杂性的顺序不同{{ 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
,如果它找不到值。