基本情報技術者 2018年 春期 午前(科目A) 問07
問題文
表探索におけるハッシュ法の特徴はどれか。
選択肢
ア:2分木を用いる方法の一種である。
イ:格納場所の衝突が発生しない方法である。
ウ:キーの関数値によって格納場所を決める。(正解)
エ:探索に要する時間は表全体の大きさにほぼ比例する。
🔒 解説は解答すると表示されます
ハッシュ法による表探索【午前解説】
正解の理由
正解:ウ
ハッシュ法は「キーをハッシュ関数で関数値に変換して、その関数値を元に格納場所(配列のインデックス)を決める」手法です。選択肢ウが述べる「キーの関数値によって格納場所を決める」という記述はハッシュ法の本質を正しく表しています。
衝突が生じる可能性がある点や、平均探索時間が である一方最悪は になる点など、ハッシュ法の性質もウの説明と整合します。
ハッシュ法は「キーをハッシュ関数で関数値に変換して、その関数値を元に格納場所(配列のインデックス)を決める」手法です。選択肢ウが述べる「キーの関数値によって格納場所を決める」という記述はハッシュ法の本質を正しく表しています。
衝突が生じる可能性がある点や、平均探索時間が である一方最悪は になる点など、ハッシュ法の性質もウの説明と整合します。
解法ステップ
- 問題文のキーワードを探す:「関数値」「格納場所」「衝突」「2分木」などを確認する。
- 各選択肢をキーワードで照合する:「関数値によって格納場所を決める」はハッシュ法の定義に一致する。
- 残りの選択肢を排除する:2分木は木構造、衝突が発生しないは誤、探索時間が表全体比例は配列線形探索の説明に近い。
- 正解を確定する:ハッシュ法の定義に一致する選択肢を選ぶ。
選択肢別の誤答解説
- ア: 2分木を用いる方法の一種である。
→ 誤り。2分木(二分探索木)はノードとポインタで構成する木構造の探索法であり、ハッシュ法とは根本的に異なります。 - イ: 格納場所の衝突が発生しない方法である。
→ 誤り。ハッシュ法では衝突は一般に発生し得るため、チェイニングやオープンアドレッシング等の衝突解決が必要です。 - ウ: キーの関数値によって格納場所を決める。
→ 正解。キーをハッシュ関数で写像してインデックスを決定するという記述がハッシュ法の本質を示しています。 - エ: 探索に要する時間は表全体の大きさにほぼ比例する。
→ 誤り。線形探索は表全体の大きさに比例しますが、ハッシュ法の平均探索時間は (定数時間)であり、表全体に比例するとは言えません。
よくある誤解
- 「ハッシュ法では衝突が発生しない」:衝突(異なるキーが同じインデックスに写像される)は一般に発生し得るため、衝突解決手法が必須です。
- 「探索は常に一定時間(完全に O(1))」:平均は でも、衝突が偏ると最悪で になります。
- 「ハッシュ関数は何でもよい」:不適切なハッシュ関数は衝突増加や偏りを生み、実行性能を大きく低下させます。
補足コラム
ハッシュ法の実装で重要な点は以下です。
- 衝突解決法:チェイニング(バケットにリストを使う)やオープンアドレッシング(線形探索・二次探索・再ハッシュ)があります。
- 負荷率(load factor)α = 要素数 / バケット数 は性能指標で、α が大きいと衝突が増え性能低下します。動的リサイズ(リハッシュ)で管理します。
- ハッシュ関数は均一分布を目指し、キーの偏りを避けること。暗号学的ハッシュと実用的ハッシュ(高速で分布が良いもの)を使い分けます。
簡単なPython例(チェイニング風の概念示例):
class SimpleHashTable:
def __init__(self, size=8):
self.size = size
self.table = [[] for _ in range(size)]
def _hash(self, key):
return hash(key) % self.size
def insert(self, key, value):
idx = self._hash(key)
for i, (k, v) in enumerate(self.table[idx]):
if k == key:
self.table[idx][i] = (key, value)
return
self.table[idx].append((key, value))
def find(self, key):
idx = self._hash(key)
for k, v in self.table[idx]:
if k == key:
return v
return None
FAQ
Q1: ハッシュ法と二分探索木はどちらが優れている?
A1: 使用目的次第です。平均探索はハッシュ法が高速()ですが、順序を保持する必要がある場合や最悪ケースの保証が欲しい場合は平衡二分探索木が適します。
A1: 使用目的次第です。平均探索はハッシュ法が高速()ですが、順序を保持する必要がある場合や最悪ケースの保証が欲しい場合は平衡二分探索木が適します。
Q2: ハッシュ関数で衝突を完全に防げますか?
A2: 固定長のバケット数に対して無限のキー集合がある場合、衝突は避けられません。衝突を低減する工夫と解決手法が重要です。
A2: 固定長のバケット数に対して無限のキー集合がある場合、衝突は避けられません。衝突を低減する工夫と解決手法が重要です。
Q3: ハッシュ表の探索時間の最悪ケースは?
A3: 最悪ケースではすべてのキーが同一バケットに集まると になります。実運用では設計次第でほぼ常に平均 を維持できます。
A3: 最悪ケースではすべてのキーが同一バケットに集まると になります。実運用では設計次第でほぼ常に平均 を維持できます。
関連キーワード: ハッシュ法、ハッシュ関数、衝突解決、連想配列、探索アルゴリズム、負荷率、チェイニング、オープンアドレッシング、リハッシュ、平均探索時間

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

