0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

rubyの検索問題 バイナリーリサーチ

Last updated at Posted at 2022-12-19

問題

  • 以下の配列に任意の値が存在するかどうか、そして何番目に存在するのか、検索するコードを作成する。

  • 添字が0の要素、つまり以下の配列における「1」は「配列の0番目に存在する」と表現します。

array=[1,3,5,6,9,10,13,20,26,31]
  • 任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と出力する。
  • 存在する場合は、配列の何番目に存在するのか表示する。

検索にはバイナリーリサーチ(2分割検索)を使用して行う。

補足(バイナリーリサーチとは?)

ソート済みのリストや配列に入ったデータに対する
検索を行う時に用いられる手法のこと
まず中央の値を確認し、検索したい値との大小関係を用いて
検索したい値が中央の右にあるか左にあるかを判断する。
それを繰り返し、片側に存在しない事を確認しながら検索する方法。

解答

def binary_search(array, right, target)
  left = 0
  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
number_of_elements = array.length

result = binary_search(array, number_of_elements, target)

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

解説

def binary_search(array, right, target)
  left = 0
  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

この部分で中央値の設定と検索したい値の大小を条件分岐を用いて記述している。
target(検索したい値)が中央の値より大きい場合は、左から+1する。
target(検索したい値)が中央の値より小さい場合は、右から-1する。

return -1の記述は検索したい値が配列内に存在しなかった場合の戻り値として記述している。

その結果を

result = binary_search(array, number_of_elements, target)

の変数resultに代入している。

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

上記で-1だった時、つまり配列内に存在しなかった場合と
配列内に存在した場合とに条件分岐している。

最後に

バイナリーリサーチの概念は非常に難渋したので、
備忘録として残しておきました。

0
0
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?