基本情報技術者 2024年 科目A 問02
問題文
キーが小文字のアルファベット1文字(a, b, …, zのいずれか)であるデータを、大きさが10のハッシュ表に格納する。ハッシュ関数として、アルファベットのASCIIコードを10進表記法で表したときの1の位の数を用いることにする。衝突が起こるキーの組合せはどれか。ASCIIコードでは、昇順に連続した2進数が、アルファベット順にコードとして割り当てられている。
選択肢
ア:aとi
イ:bとr
ウ:cとl
エ:dとx(正解)
🔒 解説は解答すると表示されます
ハッシュ衝突の判定【午前解説】
正解の理由
ハッシュ関数は「英字のASCIIコードの10進表記での1の位」を使っており、これは数値で言うところの「ASCIIコードを10で割った余り(mod 10)」です。小文字英字はASCIIで連続して割り当てられているため、衝突はASCIIコードの差が10の倍数になると起きます。
選択肢のうち、エのdとxはそれぞれASCIIが と であり、1の位はどちらも なので衝突します。よって エ が正解です。
選択肢のうち、エのdとxはそれぞれASCIIが と であり、1の位はどちらも なので衝突します。よって エ が正解です。
解法ステップ
- 文字のASCIIコードを調べる(小文字は 'a' = から連続)。
- そのASCIIコードの1の位(すなわち )を求める。
- 2つの文字の値が等しければ衝突、異なれば非衝突。
具体例(主要文字のみ):
- 'a' = → 1の位
- 'b' = → 1の位
- 'c' = → 1の位
- 'd' = → 1の位
- 'i' = → 1の位
- 'l' = → 1の位
- 'r' = → 1の位
- 'x' = → 1の位
上記より、'd' と 'x' は同じ1の位 で衝突します。
(補助としての計算例)
for ch in ['a','i','b','r','c','l','d','x']:
print(ch, ord(ch), ord(ch) % 10)
選択肢別の誤答解説
- ア: aとi
- 'a' は 、'i' は 。1の位が異なるため衝突しません。
- イ: bとr
- 'b' は 、'r' は 。異なるので衝突しません。
- ウ: cとl
- 'c' は 、'l' は 。異なるので衝突しません。
- エ: dとx
- 'd' は 、'x' は 。同じ1の位で衝突します(正答)。
よくある誤解
- ASCIIコードを文字の順序番号(a=1など)だけで考えてしまい、末尾の0〜9の繰り返しという観点を見落とす。
- 「文字が離れていると衝突しない」と誤信するが、差が10の倍数であれば離れていても衝突する(例:dとxは差20で衝突する)。
- ASCIIの十進数表記の「1の位」を見落として、16進(0x64など)で考えてしまう。問題は10進の1の位が基準。
補足コラム
小文字英字についてはASCIIが連続して割り当てられているため、一般に文字chのハッシュ値は
と書けます(posは 'a' を0とする位置)。したがって位置差が10の倍数であれば必ず衝突します。ハッシュ関数の評価では、このような単純な下位桁だけを使う方式は偏り(ある桁に衝突が集中する)を招くことがあり、実際の設計ではより均等化する工夫(乗算法や良好な分散を持つ関数)が必要です。
FAQ
Q: 「1の位」を使うことは同じく「10で割った余り」と考えていいですか?
A: はい。1の位は十進での剰余(mod 10)と同値です。
A: はい。1の位は十進での剰余(mod 10)と同値です。
Q: 大文字と小文字でASCIIはどう違いますか?
A: 大文字は 'A' = から、小文字は 'a' = からで互いに別のコード域です。問題文が小文字に限定しているため上記の連続性が使えます。
A: 大文字は 'A' = から、小文字は 'a' = からで互いに別のコード域です。問題文が小文字に限定しているため上記の連続性が使えます。
Q: 他のハッシュ表サイズ(例えば7や16)の場合はどう判断しますか?
A: ハッシュ表サイズが の場合はASCIIを で割った余りを見ることになります(mod m)。表のサイズに応じた剰余を計算してください。
A: ハッシュ表サイズが の場合はASCIIを で割った余りを見ることになります(mod m)。表のサイズに応じた剰余を計算してください。
関連キーワード: ハッシュ関数、衝突、ASCIIコード、剰余演算、単純ハッシュ

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

