Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

ハッシュテーブル

ハッシュテーブル(Hash Table) は、キーと値のペアを格納するデータ構造 (例:Pythonのdict)

ハッシュ関数でキーをインデックスに変換し、配列に値を格納することで高速なアクセスを実現する

特徴:

  • 検索・挿入・削除の平均計算量は O(1)O(1)

  • ハッシュ衝突が発生すると最悪 O(n)O(n) になる

  • キーの順序は保持されない

操作:

  • insert(key, value): キーと値のペアを挿入する

  • search(key): キーに対応する値を返す

  • delete(key): キーに対応するエントリを削除する

ハッシュ関数

ハッシュ関数はキーを受け取り、配列のインデックスを返す関数

良いハッシュ関数の条件:

  • 決定性: 同じキーには常に同じハッシュ値を返す

  • 一様分布: ハッシュ値が均一に分散される

  • 高速計算: 計算コストが低い

最もシンプルな例として、整数キーに対する除算法(Division Method)がある:

h(k)=kmod  mh(k) = k \mod m

mm はハッシュテーブルのサイズ(素数が望ましい)

衝突(コリジョン)

異なるキーが同じハッシュ値を持つことを 衝突(collision) という

衝突の解決策:

方法概要長所短所
チェイン法同じインデックスの要素をリストで管理実装が簡単、負荷率に柔軟キャッシュ効率が低い
オープンアドレス法空きスロットを探して格納キャッシュ効率が良い負荷率が高いと性能劣化

チェイン法による実装

オープンアドレス法(線形探索)による実装

衝突時に次の空きスロットを線形にたどる方法(Linear Probing)

h(k,i)=(h′(k)+i)mod  mh(k, i) = (h'(k) + i) \mod m

ii は探索回数、h′h' は補助ハッシュ関数

クラスタリング(連続した埋まりスロット)が発生しやすいため、二次探索(Quadratic Probing)やダブルハッシングが代替として使われる

計算量まとめ

負荷率 α=n/m\alpha = n / m(nn: 要素数, mm: テーブルサイズ)

操作平均最悪
検索O(1+α)O(1 + \alpha)O(n)O(n)
挿入O(1)O(1)O(n)O(n)
削除O(1)O(1)O(n)O(n)

負荷率を一定以下(例: α≤0.7\alpha \le 0.7)に保つことで平均 O(1)O(1) を維持できる

NOTE: Pythonのdictはハッシュテーブル

CPythonのdictはオープンアドレス法(ランダム探索)で実装されており、Python 3.7以降は挿入順序を保持する

特性Python dict
検索・挿入・削除(平均)O(1)O(1)
順序の保持挿入順(3.7以降)
キーの制約ハッシュ可能(immutable)なオブジェクト