LoginSignup
0
0

More than 1 year has passed since last update.

[Ruby] バイナリーリサーチの実装

Last updated at Posted at 2021-05-21

はじめに

大学2回生?3回生?ぶりに、ソリサーチの実装を行ったので、アウトプット兼ねてまとめます。

バイナリーリサーチとは

バイナリーソートとは、二分探索アルゴリズムのことです。アルゴリズム自体、難しくないので「汚くていいから実装しろ!」と言われればぐにできるものですが、きれいに書こうと思うとなかなか悩みました。

まずは、アルゴリズム全体の流れを以下の画像で見てみます。

スクリーンショット 2021-05-21 10.50.57.png

参考URL:https://www.codereading.com/algo_and_ds/algo/binary_search.html

任意の値が、配列の真ん中の値よりも小さいか大きいかを判断して、探索対象を狭めていくアルゴリズムです。

具体的手順

  1. 配列をソートする(ここでは昇順でソートされたとする)
  2. 配列の中央にある要素を調べる
  3. 探索
  4. 中央の要素が目的の値ではなく、目的のデータが中央の値より大きい場合、中央より後半の部分を調べる
  5. 中央の要素が目的の値ではなく、目的のデータが中央の値より小さい場合、中央より前半の部分を調べる
  6. 2.に戻る

実際のコード

以上を実際に実装してみます。

sort.rb
def binary_search(array, target)
  left = 0
  right =  array.length - 1
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end

array=[1,3,5,6,9,10,13,20,26,31]

puts "検索したい数字を入力してください"
target = gets.to_i


result = binary_search(array,target)

if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result + 1}番目に存在します "
end

これでは長いので、肝心の関数部分にだけ着目します

関数.rb
def binary_search(array, target)
  left = 0
  right =  array.length - 1
  while left <= right
    center = (left + right) / 2
    if array[center] == target
      return center
    elsif array[center] < target
      left = center + 1
    else
      right = center - 1
    end
  end
  return -1 
end

4〜13行目で「中央の要素の定義」を行なって、「検索したい値が中央の要素の左右どちらにあるか」を確かめながら検索を行っています。14行目のreturn -1は何も当てはまるものがないときに、最終的な返り値になります。
ポイントは、配列の方を加工するのではなく中央値として定義している部分を更新して行っているという点です。
仮に、いちいち不要となった部分の配列を削除して新しい配列を用意するようにすると、最終的に有無の判定はできてもどこにあったかが分からなくなります。(インデックスが変わるため)
だからこそ、元の配列を変更しないで、中央値の更新のみで探索をしているのです。

おわりに

今回、学生ぶりにバイナリーソートを実装しました。
この他にも、順番を並び替えるバブルソートだったりと他のアルゴリズムにも触れてみようと思います!

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0