問題 #7 ・ 整列・探索 ・ 難易度 3
次の関数 binarySearch は、昇順に整列済みの整数型の配列 data から値 target を二分探索し、見つかった場合はその要素番号を、見つからなかった場合は -1 を返す。プログラム中の〔 a 〕と〔 b 〕に入れる字句の正しい組合せを、選択肢の中から選べ。 ここで、配列の要素番号は 1 から始まる。また、÷ は実数の除算を表すが、mid には小数点以下を切り捨てた整数値が格納されるものとする。
○整数型: binarySearch(整数型の配列: data, 整数型: target)整数型: low ← 1整数型: high ← dataの要素数整数型: midwhile (low ≦ high)mid ← (low + high) ÷ 2 // 小数点以下切捨てif (data[mid] = target)return midelseif (data[mid] < target)low ← 〔 a 〕elsehigh ← 〔 b 〕endifendwhilereturn -1
二分探索では、中央の要素 data[mid] と target を比較した後、mid 自体は既に確認済みであるため探索範囲から除外する必要がある。 【data[mid] < target の場合】 target は mid より右側にあるので、low を mid + 1 に更新する。 【data[mid] > target の場合】 target は mid より左側にあるので、high を mid - 1 に更新する。 【トレース例】data = {10, 20, 30, 40, 50}、target = 20 の場合 (1) low=1, high=5, mid=3 → data[3]=30 > 20 → high ← 3-1=2 (2) low=1, high=2, mid=1 → data[1]=10 < 20 → low ← 1+1=2 (3) low=2, high=2, mid=2 → data[2]=20 = 20 → return 2 正しく要素番号 2 が返される。 【見つからない場合の確認】target = 25 の場合 (1) low=1, high=5, mid=3 → data[3]=30 > 25 → high ← 2 (2) low=1, high=2, mid=1 → data[1]=10 < 25 → low ← 2 (3) low=2, high=2, mid=2 → data[2]=20 < 25 → low ← 3 (4) low=3 > high=2 → ループ終了 → return -1 mid を範囲に含めたまま(選択肢イ・ウ・エ)だと、上記のような場合に low = high = mid のまま条件が変わらず無限ループとなる。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。