戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2016年 秋期 午前(科目A)20


問題文

格納アドレスが1〜6の範囲の直接編成ファイルにおいて、次の条件でデータを格納した場合、アドレス1に格納されているデータのキー値はどれか。   〔条件〕  (1) キー値が3, 4, 8, 13, 14, 18の順でデータを格納する。  (2) データのキー値を5で割った余りに1を加えた値を格納アドレスにする。  (3) 格納アドレスに既にデータがある場合には、次のアドレスに格納する。これを格納できるまで繰り返す。最終アドレスの次は先頭とする。  (4) 初期状態では、ファイルは何も格納されていない。

選択肢

8
13(正解)
14
18

直接編成ファイルにおける格納アドレス計算【午前2 解説】

要点まとめ

  • 結論:アドレス1に格納されるキー値は13であり、選択肢は (13)が正解です。
  • 根拠:ハッシュ関数は「キー値を5で割った余りに1を加える」アドレス$= (key \bmod 5)+1$$)で、衝突時は次のアドレスへ順に格納(線形探査)します。
  • 差がつくポイント:初回配置順に従い順次線形探査で埋めていくため、ハッシュ先が同じキー群では最初の空きスロットを正確に追うことが合否を分けます。

正解の理由

正解は (13)です。各キーを順にハッシュして配置すると、キー13はハッシュ先がアドレス4で既に満杯の状態となり、線形に次へ進んで最初に空いているアドレス1に格納されるため、アドレス1の値は13になります。

よくある誤解

  • 「余りに1を加えるとアドレスは1〜5だけになる」と考えて5つしか候補がないと思い込み、表の6番目を使う可能性を見落とす。実際は衝突で次のアドレス(6や1へラップ)を使います。
  • 「格納順を一括で考える」ために個別の衝突処理を順序無視で計算して誤答になる。与えられた順序で逐次配置する点を忘れないこと。
  • 「ハッシュ値だけで最終配置を判断」してしまい、先に入ったデータによる連鎖的な空き位置移動を考慮しない誤り。

解法ステップ

  1. ハッシュ関数を確認する:アドレス =
  2. 指定の順序でキーを一つずつ格納する。空いていればそのアドレスへ、埋まっていれば次のアドレスへ(最後は先頭に戻る)。
  3. 各キーの配置を追跡し、最終的にアドレス1に何が入るかを確定する。
  4. 必要なら簡単な表や番号付きリストでアドレス1〜6の状態を逐一書き出す。
(配置の流れ)
  • 3 → に格納(4:3)
  • 4 → に格納(5:4)
  • 8 → は満杯 → 5満杯 → 6空き → 6:8
  • 13 → は満杯 → 5,6満杯 → 1空き → 1:13
  • 14 → は満杯 → 6,1満杯 → 2空き → 2:14
  • 18 → は満杯 → 5,6,1,2満杯 → 3空き → 3:18
したがってアドレス1は13。

選択肢別の誤答解説

  • ア: 8
    誤りの理由は、8のハッシュ先はアドレス4で、そこが占有されているため次に回って6に入る点を見落としている場合が多い。8は最終的にアドレス6に配置されます。
  • イ: 13(正解)
    正答の根拠は上記の通り。13のハッシュ先4は先行データで埋まっており、線形探査で最初に空いた1に入ります。
  • ウ: 14
    14のハッシュ先は5ですが、5・6・1が埋まっているため実際はアドレス2に入ります。アドレス1ではありません。
  • エ: 18
    18のハッシュ先は4で、線形探査により最終的にアドレス3に配置されるため、アドレス1と混同してはなりません。

補足コラム

本問題は「直接編成ファイル(オープンアドレッシング)」と「線形探査(linear probing)」の典型問題です。ハッシュ関数が の形で与えられる場合、テーブルの添字範囲とハッシュの剰余範囲のずれ(ここでは剰余が0〜4でして1〜5に)に注意してください。衝突解決で「次のアドレスへ進む」動作は配列の末尾でラップアラウンドするため、表全体の状態を環状に考えるのが重要です。
簡単なシミュレーションコード(参考)
keys = [3,4,8,13,14,18]
table = [None]*6  # addresses 1..6 (index0->addr1)
def addr(k): return (k % 5)
for k in keys:
    i = addr(k)
    while table[i] is not None:
        i = (i+1) % 6
    table[i] = k
print(table)  # -> [13,14,18,3,4,8]

FAQ

Q1. ハッシュ関数の「余りに1を加える」は何のためですか?
A1. 問題のアドレスが1始まり(1〜6)なので、剰余して1始まりのアドレスに合わせるためです。
Q2. テーブルが満杯になったらどうする?
A2. 実装上は再ハッシュ(テーブル拡張)や別の衝突解決(チェイニング)を行います。本問題では空きがある前提です。
Q3. もしハッシュ関数が違えば結果は変わる?
A3. はい。ハッシュ関数が異なれば各キーの初期位置が変わるため、衝突連鎖も変わり最終配置が変わります。

関連キーワード: 直接編成, 線形探査, オープンアドレッシング, ハッシュ関数, 衝突解決, 余り法, 連続探索, 配列ラップアラウンド
← 前の問題へ次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

基本情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について