2022 サンプル問題7テクノロジ系

基本情報 2022 サンプル問題 問7:テクノロジ系に関する問題

10 進法で5 桁の数a 1 a 2 a 3 a 4 a 5 を,ハッシュ法を用いて配列に格納したい。ハ ッシュ関数をmod ( a 1+a 2+a 3+a 4+a 5 ,13 ) とし,求めたハッシュ値に対応する 位置の配列要素に格納する場合,54321 は配列のどの位置に入るか。ここで, mod ( x ,13 ) は,x を13 で割った余りとする。 位置 配列 0 1 2 … … 11 12

  • a1
  • b2正答
  • c7
  • d11
正答:B2

AI解説(初心者・標準・上級)

理解度に合わせて3レベルの解説を無料で読めます。

初心者向けまずはここから。やさしく要点を解説

答えは b「2」 です。

ハッシュ法は 「数字を計算して、その答えを“しまう場所”にする」 という収納術。

計算ルールは「各桁を全部足して、13で割った余り」。

54321 でやってみると:

1. 各桁を足す: 5 + 4 + 3 + 2 + 1 = 15

2. 15を13で割る: 15 ÷ 13 = 1 余り 2 → 答えは 2

だから配列の 位置2 に格納します。

👉 覚え方: 「ハッシュ=計算でしまう場所を決める」。データを探すときも同じ計算をすれば一発で見つかる(=超速で検索できる)のが強み。

割り算の余りを使う方法(mod)は、しまう場所を「13個の引き出し」のどれかに振り分ける役割。

標準試験対策の基準レベル

なぜこれが正解か

正解は b「2」。問題のハッシュ関数は `mod(a₁ + a₂ + a₃ + a₄ + a₅, 13)`。

54321 の各桁: a₁=5, a₂=4, a₃=3, a₄=2, a₅=1

  • 合計: 5 + 4 + 3 + 2 + 1 = 15
  • 15 ÷ 13 = 商1 余り 2

ゆえに配列位置 2 に格納される。

各選択肢の解説

  • a「1」: 15 ÷ 13 の商を答えとしている。ハッシュ値は余りなので誤り。
  • c「7」: 計算ミスの可能性(例: 各桁の積を取った 5×4×3×2×1 = 120, mod 13 = 3 等も該当せず)。
  • d「11」: 計算経路が異なる。例えば桁数を含めた別計算等の混同。

覚え方・ひっかけ注意

ハッシュ関数の基本形は 「何らかの計算 → mod(配列サイズ)」 で、結果は必ず [0, サイズ−1] の範囲。本問は配列サイズ13なので結果は0〜12。

衝突(コリジョン)に注意: 別の数 12345 でも各桁の合計は15、ハッシュ値2で同じ位置になる。実際のハッシュ表ではこの衝突をチェイン法(同じ位置に連結リスト)やオープンアドレス法(空くまで隣を探す)で解決する。本問では衝突は問われていないが、ハッシュ法の必須知識として押さえる。

上級誤答論破・背景理論まで深掘り

ハッシュ法の理論

ハッシュ法はキー集合 K を配列インデックス集合 [0, m-1] へ写像する手法。理想的なハッシュ関数は 均等性(uniformity) を持ち、各バケットにほぼ均等にキーが分布する。平均探索時間は O(1+α)(αは負荷率 n/m)、最悪は O(n)(全衝突時)。

ハッシュ関数の設計原則

1. 除算法(division method): h(k) = k mod m。本問のスタイル。m は 2^x や 10^x を避け、素数を選ぶ のが定石(13が素数なのはこの設計通り)。これは、m が合成数だとキーの分布に偏りがあった場合、その偏りが直接ハッシュ値に伝播するため。

2. 乗算法(multiplication method): h(k) = ⌊m × (k×A mod 1)⌋。A=(√5-1)/2(黄金比の逆数)が経験的に良い分散を生む(Knuth推奨)。

3. 暗号学的ハッシュ: SHA-256, BLAKE3 等。ハッシュ表用には過剰だが、データ整合性検証で必須。

衝突解決法

  • チェイン法(separate chaining): 各バケットに連結リスト。実装容易、削除しやすい。Java HashMap, C++ unordered_map で採用。
  • オープンアドレス法: 線形探索/二次探索/ダブルハッシュ。メモリ局所性が良く高速だが削除が複雑(tombstone必要)。Pythonの dict, Rustの HashMap で採用。
  • Robin Hood hashing: 探査距離を平準化する変種。最近の高性能実装で採用増加。
  • Cuckoo hashing: 2つのハッシュ関数で2箇所候補、空くまで「追い出し」連鎖。O(1)最悪保証。

試験での位置づけ

データ構造の頻出単元。基本情報技術者試験では本問のような基本計算 + 衝突回数計算が定番。応用情報以降ではブルームフィルタ、コンシステントハッシュ法(分散システム)、HyperLogLog(基数推定)、Count-Min Sketch(頻度推定)など確率的データ構造へ展開。

選択肢の発展補足

  • 桁数和ハッシュの弱点: アナグラム(54321 と 12345, 13524 等)が全て同じハッシュ値になり衝突多発。本問でもこの設計は教育用で、実用ではない。
  • 負荷率(load factor) α = n/m: αが0.7を超えると性能が劣化する経験則。Javaの HashMap はα=0.75で自動リサイズ。
  • DoS攻撃: 既知のハッシュ関数に対して衝突を狙ったキーを大量送信し、O(n)に劣化させる Hash flooding 攻撃。対策として SipHash など seed をランダム化したハッシュが標準化された(PHP 7+, Python 3.4+)。
  • 完全ハッシュ法(perfect hashing): キー集合が静的なら衝突0のハッシュ関数を構築可能。コンパイラのキーワード認識、辞書アプリで活用。
出典・引用について

出典:IPA(情報処理推進機構)公式 基本情報技術者試験 2022 サンプル問題7/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。

テクノロジ系の他の過去問

1
テクノロジ系
2
テクノロジ系
3
テクノロジ系
4
テクノロジ系
5
テクノロジ系

あなたの弱点を診断して、合格までの最短ルートを

この分野を連続演習し、AIがあなたの弱点を分析。合格ナビなら基本情報の過去問を解きながら学べます。