[英]Is there a built-in binary-search In Ruby?
我正在寻找一个内置的Ruby方法,它具有与index
相同的功能,但使用二进制搜索算法,因此需要预先排序的数组。
我知道我可以编写自己的实现,但根据“ Ruby #index Method VS Binary Search ”,索引使用的内置简单迭代搜索比纯Ruby版本的二进制搜索更快,因为内置方法是用C写的。
Ruby是否提供任何进行二进制搜索的内置方法?
Ruby 2.0引入了Array#bsearch
和Range#bsearch
。
对于Ruby 1.9,您应该查看bsearch
和binary_search
gem。 其他可能性是使用与数组不同的集合,例如使用rbtree
bsearch
是我的backports
gem ,但这是一个纯Ruby版本,所以速度要慢一些。 请注意,纯Ruby二进制搜索仍然比index
或include?
线性内置搜索更快include?
对于足够大的数组/范围(或昂贵的比较),因为它与复杂度O(log n)
与O(n)
顺序不同。
要使用它今天,您可以require 'backports/2.0.0/array/bsearch'
或require 'backports/2.0.0/range/bsearch'
。
祝好运!
自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 }
我用bsearch
。 这是它的工作原理:
array = ['one', 'two', 'three', 'four', 'five']
search = array.sort.bsearch { |value| 'four' <=> value }
注意:二进制搜索需要一个排序数组; 这增加了一些开销,但与搜索速度相比,这很好。
search
将返回array
的值four
,否则返回nil
如果找不到值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.