基本情報技術者 2017年 春期 午前(科目A) 問07
問題文
顧客番号をキーとして顧客データを検索する場合、2分探索を使用するのが適しているものはどれか。
選択肢
ア:顧客番号から求めたハッシュ値が指し示す位置に配置されているデータ構造
イ:顧客番号に関係なく、ランダムに配置されているデータ構造
ウ:顧客番号の昇順に配置されているデータ構造(正解)
エ:顧客番号をセルに格納し、セルのアドレス順に配置されているデータ構造
🔒 解説は解答すると表示されます
昇順配列による二分探索【午前解説】
正解の理由
正解: ウ
2分探索(二分探索)は「要素がキー順に整列されており、任意の位置に直接アクセスできる(ランダムアクセス)」ことが前提です。選択肢ウは「顧客番号の昇順に配置されているデータ構造」であり、この前提を満たします。そのため中央要素と比較して探索範囲を半分にでき、効率的に目的の顧客番号を見つけられます。
2分探索(二分探索)は「要素がキー順に整列されており、任意の位置に直接アクセスできる(ランダムアクセス)」ことが前提です。選択肢ウは「顧客番号の昇順に配置されているデータ構造」であり、この前提を満たします。そのため中央要素と比較して探索範囲を半分にでき、効率的に目的の顧客番号を見つけられます。
解法ステップ
- 問題の前提条件を確認:二分探索は「ソート済み」と「ランダムアクセス可能」が必要かを判定する。
- 各選択肢を前提に照らし合わせる:昇順・ランダム配置・ハッシュ位置などを区別する。
- 前提を満たす選択肢を選択する:昇順に配置されているもの(かつランダムアクセス可能)が正解となる。
選択肢別の誤答解説
- ア: 顧客番号から求めたハッシュ値が指し示す位置に配置されているデータ構造
- ハッシュ法はハッシュ関数とテーブルにより高速な平均探索が可能だが、キー順に並んでいるとは限らず二分探索の前提を満たさない。範囲検索にも不向き。
- イ: 顧客番号に関係なく、ランダムに配置されているデータ構造
- ランダム配置はソートされておらず、二分探索の中央比較による半減が成立しないため不適。
- ウ: 顧客番号の昇順に配置されているデータ構造
- 正解。昇順で連続配置されていればインデックスで中央要素に直接アクセスでき、二分探索が適用可能。
- エ: 顧客番号をセルに格納し、セルのアドレス順に配置されているデータ構造
- 「セルのアドレス順=キー順」とは限らないため、キーの昇順が保証されなければ二分探索は適用できない。アドレス順は物理配置であり論理キー順とは別概念。
よくある誤解
- 「昇順に並んでいればどんな構造でもいい」は誤りです。連結リストのようにランダムアクセスできない構造では二分探索は効率を発揮しません。
- 「ハッシュより常に速い」と考えるのも誤りです。ハッシュ探索は期待値で平均 を達成できますが、キー順検索や範囲検索が必要な場合は二分探索(ソート済み配列)が有利です。
補足コラム
- 二分探索が最も力を発揮するのは、読み出し主体でキーの順序が固定されている場合です。更新(挿入・削除)が頻繁だとソートの維持コストが高くなります。
- データ構造の選択は用途次第:単純探索や範囲検索(順序性が重要)にはソート済み配列+二分探索、等価探索で高速性が最優先ならハッシュ表、頻繁な挿入削除には平衡二分木(BST、B木など)を検討します。
- 連結リストは要素の挿入は容易でも、二分探索の前提であるO(1)ランダムアクセスを満たさないため不向きです。
コード例(昇順リストに対する二分探索、Python)
def binary_search(arr, key):
lo, hi = 0, len(arr) - 1
while lo <= hi:
mid = (lo + hi) // 2
if arr[mid] == key:
return mid
elif arr[mid] < key:
lo = mid + 1
else:
hi = mid - 1
return -1 # 見つからない場合
# 使用例
data = [1001, 1003, 1005, 1010, 1020] # 昇順
print(binary_search(data, 1010)) # 出力: 3
FAQ
Q: 二分探索は連結リストでも使えますか?
A: 理論的には可能ですが、連結リストはランダムアクセスが であるため二分探索の利点が消えます。配列やランダムアクセス可能な領域が前提です。
A: 理論的には可能ですが、連結リストはランダムアクセスが であるため二分探索の利点が消えます。配列やランダムアクセス可能な領域が前提です。
Q: ハッシュ探索とどちらが良いですか?
A: 等価検索(キー一致)が多く挿入・削除も頻繁ならハッシュが有利。キー範囲検索やソート順が重要ならソート済み配列+二分探索が適します。
A: 等価検索(キー一致)が多く挿入・削除も頻繁ならハッシュが有利。キー範囲検索やソート順が重要ならソート済み配列+二分探索が適します。
Q: ソート済みであれば配列以外でもよいですか?
A: ランダムアクセスが可能であればよい(例えばランダムアクセス可能なメモリテーブル)。ただし連結リストやポインタのみの並びでは不利です。
A: ランダムアクセスが可能であればよい(例えばランダムアクセス可能なメモリテーブル)。ただし連結リストやポインタのみの並びでは不利です。
関連キーワード: 二分探索、昇順ソート、ランダムアクセス、ハッシュ探索、探索アルゴリズム、探索性能、配列探索、O(log n)

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

