10. 2011/4/26 アルゴリズムとデータ構造 9 10
ハッシュ関数
望ましいハッシュ関数
いろいろなキーの値を 0 から m-1 までの範囲にできるだけ一様
に散らばせる(ランダムになる)
簡単に計算できる
キーが正整数の場合
たいていの場合, m で割った余りをとる
ただし,ハッシュ関数をできるだけランダムなものにするには
, m が素数が望ましい.
キーが文字列の場合
何らかの手段で整数値を得て,それを m で割った余りをとる
長さ k の文字列 s に対して:
Ord は文字の順序数を得る関数とする
1 文字を 8 ビットで表す計算機では,定数 c=256(=28
) とすると良い
∑=
−
×=
k
i
ik
misOrdcsHash
1
mod])[()(
11. 2011/4/26 アルゴリズムとデータ構造 9 11
文字列用の簡単なハッシュ関数の例
入力:文字列 (s) ,ハッシュ表サイズ (m)
出力:ハッシュ値
def hashfn(s, m):
h = 0
for i in range(0, len(s)):
h = 256 * h + ord(s[i])
return h % m
12. 2011/4/26 アルゴリズムとデータ構造 9 12
チェイン法の計算量
平均的な計算量は,データ数 N と表(配列の
長さ) M に依存する.
ハッシュ関数がランダムに近く,値が適度に
バラけることを前提とすると,チェイン法に
おけるリストの長さは,平均 N/M と考えら
れる.
挿入も探索も N/M に比例する
N に対して, M を十分大きく取れば, O(1)