binary_search.rb

Heads up: This description was created by AI and might not be 100% accurate.

このRubyスクリプトは、バイナリサーチ(二分探索)アルゴリズムを実装したものです。プログラムの特徴は、ソート済みのデータ配列から特定のターゲット値を効率的に検索することです。

アルゴリズム:

  1. 初期化:
    • min_index: 検索範囲の最小インデックスを0に設定。
    • max_index: 検索範囲の最大インデックスを配列の長さを1減算した値に設定(配列の最後の要素を含む)。
  2. 反復:
    • whileループは、min_indexmax_index以下である限り実行されます。この条件が満たされない場合、ターゲット値が配列内に存在しないことを意味します。
  3. 中央インデックスの計算:
    • mid_index = min_index + (max_index - min_index) / 2
    • 中央インデックスを計算します。この計算方法は、オーバーフローを避けるためのものです。
  4. 値の比較:
    • standard = data[mid_index]:中央インデックスにある要素の値を取得。
    • if standard == target:中央要素の値がターゲット値と一致する場合、mid_index(ターゲット値のインデックス)を返します。
    • elsif standard < target:中央要素の値がターゲット値より小さい場合、ターゲット値は中央要素よりも大きい要素の範囲にあるため、min_indexmid_index + 1に更新して、検索範囲を右半分に絞り込みます。
    • else:中央要素の値がターゲット値より大きい場合、ターゲット値は中央要素よりも小さい要素の範囲にあるため、max_indexmid_index - 1に更新して、検索範囲を左半分に絞り込みます。
  5. ターゲットが見つからない場合:
    • whileループが終了し、ターゲット値が配列内に存在しない場合、-1を返します。

コードの説明:

このコードは、効率的な検索アルゴリズムであるバイナリサーチを利用し、ソート済みの配列に対して、平均計算量O(log n)でターゲット値を検索します。

Ruby code snippet

# frozen_string_literal: true
#=> nil

def binary_search(data, target)
  min_index = 0
  max_index = data.length - 1

  while min_index <= max_index
      mid_index = min_index + (max_index - min_index) / 2
      standard = data[mid_index]
  
      if standard == target
          return mid_index
        elsif standard < target
          min_index = mid_index + 1
        else
          max_index = mid_index - 1
      end
  end
  -1
end
#=> :binary_search

data = [0, 1, 34, 56, 78]
#=> [0, 1, 34, 56, 78]
data.sort!
#=> [0, 1, 34, 56, 78]
p binary_search(data, 34)
2
#=> 2

cities = %w[fukuoka hiroshima kobe kyoto nagoya osaka sapporo tokyo yokohama]
#=> 
["fukuoka",

p binary_search(cities, "sapporo")
6
#=> 6

Executed with Ruby 3.4.9.