Ruby 2.1.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Arrayクラス > bsearch
bsearch { |x| ... } -> object | nil
[permalink][rdoc]bsearch -> Enumerator
ブロックの評価結果で範囲内の各要素の判定を行い、条件を満たす値を二分探 索(計算量は O(log n))で検索します。要素が見つからない場合は nil を返し ます。self はあらかじめソートしておく必要があります。
本メソッドはブロックを評価した結果により以下のいずれかのモードで動作し ます。
find-minimum モード(特に理由がない限りはこのモードを使う方がいいでしょ う)では、条件判定の結果を以下のようにする必要があります。
ブロックの評価結果が true になる最初の要素を返すか、nil を返します。
ary = [0, 4, 7, 10, 12] ary.bsearch {|x| x >= 4 } # => 4 ary.bsearch {|x| x >= 6 } # => 7 ary.bsearch {|x| x >= -1 } # => 0 ary.bsearch {|x| x >= 100 } # => nil
find-any モードは bsearch(3) のように動作します。ブロックは真偽値 ではなく、以下のような数値を返す必要があります。求める要素が配列の i 番目 から j-1 番目までに入っているとします。またブロックパラメータの値の インデックスを k とします。
ブロックの評価結果が 0 になるいずれかの要素を返すか、nil を返します。
ary = [0, 4, 7, 10, 12] # 4 <= v < 8 になる要素を検索 ary.bsearch {|x| 1 - x / 4 } # => 4 or 7 # 8 <= v < 10 になる要素を検索 ary.bsearch {|x| 4 - x / 2 } # => nil
上記の 2 つのモードを混在して使用しないでください(ブロックの評価結果は 常に true/false、数値のいずれかを一貫して返すようにしてください)。 また、二分探索の各イテレーションで値がどのような順序で選ばれるかは 未規定です。
ブロックが与えられなかった場合は、 Enumerator のインスタンスを返します。
[SEE_ALSO] Range#bsearch, http://magazine.rubyist.net/?0041-200Special-note#l15