5.4 ハッシュ法 ハッシュとは • ハッシュ法 – ハッシュ関数 h:データ → 格納場所(添え字) – ハッシュ表 配列 t[0..m-1] • 格納場所(添え字)を計算で求める 関数 h 0 1 … 配列 t 衝突 i … m-1 ハッシュ関数の原則 • キーのすべての情報を利用することが基本 • 一部の情報だけでハッシュ値を決めることは 避ける ナイーブなハッシュ関数の例 | s| s s1s2 s s ord si mod m ord : 文字 整数 i 1 h yamada 何の情報が欠けて ord ( y ) ord (a ) ord (a ) いるのか? 25 1 14 1 4 1 46 humeda ord (u ) ord (m) ord (a ) 21 14 5 4 1 45 h yoda ord ( y ) ord (o) ord (a ) 25 15 4 1 45 梅田と与田が衝突 ナイーブなハッシュ関数の例 s s1s2 s s | s| ord si mod m i 1 ord : 文字 整数 ord (n) ord (a) ord (a) hnakataどう変更すれば よいか? 13 1 11 1 20 1 47 htanaka ord (t ) ord (a) ord (a) 20 1 13 1 11 1 47 順番の情報が活きてい ない ハッシュ関数の例 • 例えば以下の型を使う | s| i b ord si mod m i 1 b 10, m 107 h yamada ord ( y ) ord (a ) ord (a ) (101 25) (10 2 1) (103 14) 4 mod 107 5 6 (10 1) (10 4) (10 1) 62 同じ誕生日の確率 • 何人いたら,その中に少なくとも2人が同じ誕生日を 持つ確率が50%以上になるか? • 全員異なる確率: 1 × (364/365) × (363/365 ) × ( 362/365 ) × ... × ((365-k+1)/365) • k=23のとき、全員異なる誕生日である確率は0.4927 • 365個の記憶場所のうちの10%も使われないうちに、 少なくとも1回の衝突が起こる確率は1/2を以上 衝突に対する処理 配列 t 関数 h 0 1 2 … 衝突 • 良いハッシュ → 均等に格納される m-1 ハッシュ関数の例 • 例えば以下の型を使う | s| i b ord si mod m i 1 b 10, m 107 h yamada ord ( y ) ord (a ) ord (a ) (101 25) (10 2 1) (103 14) 4 mod 107 5 6 (10 1) (10 4) (10 1) 62 bとmの取り方の注意点 | s| i ・ b ord si mod m i 1 ・ b m 1とすると何の情報が失 われることになるか? ・ m 2 kとすると何の情報が失 われることになるか? bとmの取り方の注意点 | s| i ・ b ord si mod m i 1 ・ b m 1とすると文字の位置情 報が失われる ∵ b i mod m 1より ・ m 2 kとすると下桁しかみて いないことになる 以下部品 bとmの取り方の注意点 | s| i ・ b ord si mod m i 1 ・ b m 1とすると文字の位置情 報が失われる r n 1 ∵ 等比級数の和の公式 r から r n 1は r 1で割切れる r 1 i 0 n -1 i i文字目と j文字目(i j )が入替わった文字列 xと yを考える x y ( xi yi )b i 1 ( x j y j )b j 1 b i 1 xi (b j i 1) b i 1 yi (b j i 1) 上式はで b 1, つまり mで割切れる ということは xと yは mod m で同じ ・ m 2 kとすると下桁しかみて いないことになる
© Copyright 2024 ExpyDoc