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