2011/4/26 アルゴリズムとデータ構造 96
ハッシュ表の探索(チェイン法)
ハッシュ表の探索
入力:ハッシュ表 (HT) ,キー (key)
出力:見つかったデータを返す(無かったら None )
def search(HT, key):
p = HT.heads[hashfn(key, HT.size)]
while p != None:
if p.key == key:
return p.data
else:
p = p.next
return None
ハッシュ表のインデッ
クスは 0 始まりとする
7.
2011/4/26 アルゴリズムとデータ構造 97
ハッシュ表への挿入(チェイン
法)
ハッシュ表への挿入
入力:ハッシュ表 (HT) ,キー (key) ,データ
(data)
def insert(HT, key, data):
h = hashfn(key, HT.size)
p = hnode()
p.key = key
p.data = data
p.next = HT.heads[h]
HT.heads[h] = p
8.
2011/4/26 アルゴリズムとデータ構造 98
練習問題
チェイン法の削除手続き DELETE(HT, key) を書け
キー (key) が見つからない場合はエラーとせよ
def delete(HT, key):
h = hashfn(key, HT.size)
prev = None
p = ???
while p != None and p.key != key:
prev = p
p = p.next
if p == None: error(“key not found”)
if prev == None:
???
else:
???
2011/4/26 アルゴリズムとデータ構造 910
ハッシュ関数
望ましいハッシュ関数
いろいろなキーの値を 0 から m-1 までの範囲にできるだけ一様
に散らばせる(ランダムになる)
簡単に計算できる
キーが正整数の場合
たいていの場合, m で割った余りをとる
ただし,ハッシュ関数をできるだけランダムなものにするには
, m が素数が望ましい.
キーが文字列の場合
何らかの手段で整数値を得て,それを m で割った余りをとる
長さ k の文字列 s に対して:
Ord は文字の順序数を得る関数とする
1 文字を 8 ビットで表す計算機では,定数 c=256(=28
) とすると良い
∑=
−
×=
k
i
ik
misOrdcsHash
1
mod])[()(
11.
2011/4/26 アルゴリズムとデータ構造 911
文字列用の簡単なハッシュ関数の例
入力:文字列 (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 アルゴリズムとデータ構造 912
チェイン法の計算量
平均的な計算量は,データ数 N と表(配列の
長さ) M に依存する.
ハッシュ関数がランダムに近く,値が適度に
バラけることを前提とすると,チェイン法に
おけるリストの長さは,平均 N/M と考えら
れる.
挿入も探索も N/M に比例する
N に対して, M を十分大きく取れば, O(1)
2011/4/26 アルゴリズムとデータ構造 914
ハッシュ表への挿入(開番地法)
ハッシュ表への挿入
入力:ハッシュ表 (HT) ,キー (key) ,データ (data)
def insert(HT, key, data):
for i in range(0, HT.size):
h = HASH(key, i, HT.size)
if HT.recds[h].mark == ‘FREE’:
HT.recds[h].mark = ‘USED’
HT.recds[h].key = key
HT.recds[h].data = data
return
error(“size over”)
15.
2011/4/26 アルゴリズムとデータ構造 915
ハッシュ表の探索(開番地法)
ハッシュ表の探索
入力:ハッシュ表 (HT) ,キー (key)
出力:見つかったデータを返す(無かったら None )
def search(HT, key):
i = 0
while True:
h = HASH(key, i, HT.size)
if HT.recds[h].key == key:
return HT.recds[h].data
i = i + 1
if (HT.recds[h].mark == ‘FREE’
or i == HT.size):
break
return None