Next Sec.: About this document
Upper Sec.: B木とハッシング
Prev. Sec.: B木
ハッシングの考え方
与えられた各キーkに対して,そのレコードの格納アドレスをkの関数として計算によって求める方法で,キー変換ともいう.これは,連想メモリを計算によってシミュレートする方法と考えることもできる.
- K ----> A = f(k)
- Kに対応するレコード・アドレス
f:ハッシュ関数
- 一般にキー空間はアドレス空間に比して極めて大
N >> n
- アドレス空間での衝突(collision)は避けられない
k1 != k2, f(k1) = f(k2)
基本的な問題は次の2つ
ハッシュ関数の条件
- f(k) がアドレス空間の中で,できるだけ一様に分布すること
- f(k) の計算が簡単で時間を要しないこと
ハッシュ関数の例
- 合同法(除算法)
f(K) = K mod n
0 <= f(K) < n-1
ただし,nは素数(実用上は,十分大きな素数の積)
K = 134075
f(K) = 134075 mod 293 = 174
- 平方抽出法(Middle of Square)
f(K) = EXTRr(K)
n = 2r
ただし,EXTRrは中位のrビットを抽出することを示す.
K = 134075 * 134075 17976103625
f(K) = 610
- 重ね合わせ法(Folding)
kを数字列としてこれをいくつかに分け,
それらを加えたものを f(K) とする.
K=134075
f(K) = 13+40+75 = 128
処理の衝突
- 衝突(collision)
-
K1 != K2 , f(K1) = f(K2)
K1 , K2 : シノニム(synonim)
衝突の処理法
- パケット法
各ハッシュ・アドレス対応に数個のシノニムを格納するパケットを用意する.
パケットをあふれたシノニムのためにオーバフロー領域が必要である.
- 直接チェイニング
各ハッシュ・アドレスに対応するシノニムをポインタでチェイニングする.
ハッシュ・テーブルにはそれらのチェインの先頭を示すポインタを格納
- オープン・アドレッシング
ハッシュ・テーブルの各ハッシュ・アドレスには,キーを一個だけ直接格納する.
あるキーをハッシュしたとき,
そのアドレスにはすでに他のキーが格納されていた場合は,
一定のルールで他のあいているアドレスを見つけ,そこに格納する.
キーを探索する場合も同様の手順に従う.
- 線形検査法(linear probing)
アドレスの大きい方へ順番にアドレスを検査していく.
最後のアドレスは最初のアドレスに隣接していると考える.
- 2次検査法(quadratic probing)
バラツキを増すために,最初1つ隣,次は4つ隣,
次は9つ隣というように,
一般に i (i=1,2,3,....)の間隔で検査する.ただし,
上と同様最後のアドレスは最初のアドレスに隣接していると考える.
Next Sec.: About this document
Upper Sec.: B木とハッシング
Prev. Sec.: B木