組み込みのRubyメソッドはindex
と同じ機能を持っていますが、バイナリ検索アルゴリズムを使用しているため、事前に並べ替えられた配列が必要です。)を探しています。
独自の実装を作成できることはわかっていますが、 " Ruby#indexメソッドVSバイナリ検索 "によると、インデックスで使用される組み込みの単純な反復検索は、純粋なRubyバージョンのバイナリ検索よりも高速です。 、組み込みメソッドがCで記述されているため。
Rubyは、バイナリ検索を行う組み込みメソッドを提供していますか?
Ruby 2.0では _Array#bsearch
_ および _Range#bsearch
_ が導入されました。
Ruby 1.9の場合、 bsearch
および _binary_search
_ gemsを調べる必要があります。他の可能性は sing rbtree
のように、配列とは異なるコレクションを使用します
bsearch
は私の backports
gem に含まれていますが、これは純粋なRubyバージョンなので、かなり低速です。純粋なRubyバイナリ検索は、十分な大きさの配列/範囲(または高価な比較)の場合、index
または_include?
_のような線形組み込み検索よりも高速です。複雑さの同じ順序O(log n)
vs O(n)
。
今日それを試すには、_require 'backports/2.0.0/array/bsearch'
_または_require 'backports/2.0.0/range/bsearch'
_を使用できます。
幸運を!
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 }
注:バイナリ検索にはソートされた配列が必要です。これはli'lオーバーヘッドを追加しますが、検索速度と比較すると問題ありません。
search
はfour
の値array
を返します。値が見つからない場合はnil
を返します。