web-dev-qa-db-ja.com

Rubyに組み込みのバイナリ検索はありますか?

組み込みのRubyメソッドはindexと同じ機能を持っていますが、バイナリ検索アルゴリズムを使用しているため、事前に並べ替えられた配列が必要です。)を探しています。

独自の実装を作成できることはわかっていますが、 " Ruby#indexメソッドVSバイナリ検索 "によると、インデックスで使用される組み込みの単純な反復検索は、純粋なRubyバージョンのバイナリ検索よりも高速です。 、組み込みメソッドがCで記述されているため。

Rubyは、バイナリ検索を行う組み込みメソッドを提供していますか?

31
Jonah

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'_を使用できます。

幸運を!

51

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 }

6
Yoav Epstein

bsearchを使用しています。これがどのように機能するかです:

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

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

注:バイナリ検索にはソートされた配列が必要です。これはli'lオーバーヘッドを追加しますが、検索速度と比較すると問題ありません。

searchfourの値arrayを返します。値が見つからない場合はnilを返します。

0
Ruto Collins