Introduction To Algorithms.§11. Hash Tables.2010 / 06
Why Hash Tables ?探索したい @配列
先頭にあれば… O(1)
末尾にあれば… O(N)
いつもO(1)ぐらいだったら嬉しいHash TableHash : 細かく切る
Key と Value の 組合せ
(Key, Value) で 表に格納する
同じKeyだったらどうしようHash Table ( SIZE M )同じKeyが出にくい方がいい
出来れば高速で計算して…
F : Data -> { 0, 1, 2, … , M-1 }Hash Table ( SIZE M )Hash Function はおおまかなグループ分けをするKey:2Key:0Key:M-1Key:1DATA
Example.人の誕生日を覚える(1〜31)
同じ日の人って…そんなにいないはず
M = 7 : 素数
経験的に素数を使う方がいいらしい
数字の総和 mod 7 を 関数に使うExample.
Question.Keyが重複したときの対処方法
チェイン法/クローズドハッシュ法
どんなハッシュ関数がいいのかここから本文(?)
チェイン法Keyが同じならチェイン(鎖)にする(78/11/4, C)(01/5/12, E)O(1)(87/2/1, B)(85/10/5, A)(68/8/4, C)O(長さ)
§11.2〜データの個数n , 表の大きさm
一つのチェイン長は平均してn / m = α : 占有率
仮定:ハッシュ関数はすぐ計算出来る O(1)
そのまま挿入出来る or リストをたどる
O( 1 + α )§11.3.1  The Division Method大前提1. 同じKeyがなかなか出ない
大前提2. 上手くばらける
Mod: 割り算だけなので高速
(再掲)経験的に素数を使う方がいいらしい§11.3.2 The Multiplication MethodHash(k) = floor( m ( k A mod 1 ) ) , 0 < A < 1

Hash Table