基本情報技術者 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に何が入るかを確定する。
- 必要なら簡単な表や番号付きリストでアドレス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始まりのアドレスに合わせるためです。
A1. 問題のアドレスが1始まり(1〜6)なので、剰余をして1始まりのアドレスに合わせるためです。
Q2. テーブルが満杯になったらどうする?
A2. 実装上は再ハッシュ(テーブル拡張)や別の衝突解決(チェイニング)を行います。本問題では空きがある前提です。
A2. 実装上は再ハッシュ(テーブル拡張)や別の衝突解決(チェイニング)を行います。本問題では空きがある前提です。
Q3. もしハッシュ関数が違えば結果は変わる?
A3. はい。ハッシュ関数が異なれば各キーの初期位置が変わるため、衝突連鎖も変わり最終配置が変わります。
A3. はい。ハッシュ関数が異なれば各キーの初期位置が変わるため、衝突連鎖も変わり最終配置が変わります。
関連キーワード: 直接編成, 線形探査, オープンアドレッシング, ハッシュ関数, 衝突解決, 余り法, 連続探索, 配列ラップアラウンド

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

