yuuki blog

プログラミング をアプトプットしています。

Ruby 検索問題 binary_search

問題.1

以下の配列に任意の値が存在するかどうか、そして何番目に存在するのか、検索するコードを作成します。
添字が0の要素、つまり以下の配列における「1」は「配列の0番目に存在する」と表現します。

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

任意の値が配列内に存在しない場合は、「値は配列内に存在しません」と表示し、存在する場合は、配列の何番目にあるかを表示する問題です。

 

自分の回答

def binary_search(array, num, value)
  min_num = 0
  max_num = num - 1
  #両端の要素が何番かを決めています。(左端"0",0から始まるので右端"合計-1") while min_num <= max_num do #両端の数を比べます center_num = (min_num + max_num) / 2 
  #中央の要素を求めます奇数の場合は自動的に四捨五入されます
if array[center_num] == value return center_num elsif array[center_num] < value min_num = center_num +1 else max_num = center_num -1
#半分に分け、左右どちらを検索するかを決めています。中央の要素が探したい番号ならば、出力されます。
#中央の要素が探したい番号でなければ、大小でどちらから決めていくか決めます。
#値の方が大きければ、左端から検索,値の方が小さければ、右端から検索します。
#while文で繰り返します。
end end return -1
#当てはまる値がなかった場合の返り値となります end array=[1,3,5,6,9,10,13,20,26,31] puts "検索したい数字を入力してください" value = gets.to_i num = array.length         #arrayの配列を数えます int = binary_search(array, num, value) if int == value puts "#{value}は配列の#{int}番目に存在します" else puts "#{value}は配列内に存在しません" end

 

模範回答

def binary_search(array, number_of_elements, target)
  left = 0
  right = number_of_elements - 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 number_of_elements = array.length result = binary_search(array, number_of_elements, target) if result == -1 puts "#{target}は配列内に存在しません" else puts "#{target}は配列の#{result}番目に存在します " end

 

模範回答の例文

#1回目のループ
leftは0
rightは9
5行目:centerは4(小数点以下は切り捨てされます)
6行目:if array[center]==31
          #=>array[center]は9なのでfalse
8行目:elsif array[center] < target
          #=>array[center]は9であり、31より小さいのでtrue
11行目:leftはcenterに+1して5となる 

#2回目のループ
leftは5
rightは9
5行目:centerは7
6行目:if array[center]==31
          #=>array[center]は20なのでfalse
8行目:elsif array[center] < target
          #=>array[center]は20であり、31より小さいのでtrue
11行目:leftはcenterに+1して8となる 

#3回目のループ
leftは8
rightは9
5行目:centerは8
6行目:if array[center]==31
          #=>array[center]は26なのでfalse
8行目:elsif array[center] < target
          #=>array[center]は26であり、31より小さいのでtrue
11行目:leftはcenterに+1して9となる 

#4回目のループ
leftは9
rightは9
5行目:centerは9
6行目:if array[center]==31
          #=>array[center]は31なのでtrue