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

Hash Table

1,517

Published on

Introduction to Algorithms, section11 Hash Table.

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,517
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Hash Table

  1. 1. Introduction To Algorithms.§11. Hash Tables.<br />2010 / 06 <br />
  2. 2. Why Hash Tables ?<br /><ul><li>探索したい @配列
  3. 3. 先頭にあれば… O(1)
  4. 4. 末尾にあれば… O(N)
  5. 5. いつもO(1)ぐらいだったら嬉しい</li></li></ul><li>Hash Table<br /><ul><li>Hash : 細かく切る
  6. 6. Key と Value の 組合せ
  7. 7. (Key, Value) で 表に格納する
  8. 8. 同じKeyだったらどうしよう</li></li></ul><li>Hash Table ( SIZE M )<br /><ul><li>同じKeyが出にくい方がいい
  9. 9. 出来れば高速で計算して…
  10. 10. F : Data -> { 0, 1, 2, … , M-1 }</li></li></ul><li>Hash Table ( SIZE M )<br /><ul><li>Hash Function はおおまかなグループ分けをする</li></ul>Key:2<br />Key:0<br />Key:M-1<br />Key:1<br />DATA<br />
  11. 11. Example.<br /><ul><li>人の誕生日を覚える(1〜31)
  12. 12. 同じ日の人って…そんなにいないはず
  13. 13. M = 7 : 素数
  14. 14. 経験的に素数を使う方がいいらしい
  15. 15. 数字の総和 mod 7 を 関数に使う</li></li></ul><li>Example.<br />
  16. 16. Question.<br /><ul><li>Keyが重複したときの対処方法
  17. 17. チェイン法/クローズドハッシュ法
  18. 18. どんなハッシュ関数がいいのか</li></li></ul><li>ここから本文(?)<br />
  19. 19. チェイン法<br /><ul><li>Keyが同じならチェイン(鎖)にする</li></ul>(78/11/4, C)<br />(01/5/12, E)<br />O(1)<br />(87/2/1, B)<br />(85/10/5, A)<br />(68/8/4, C)<br />O(長さ)<br />
  20. 20. §11.2〜<br /><ul><li>データの個数n , 表の大きさm
  21. 21. 一つのチェイン長は平均してn / m = α : 占有率
  22. 22. 仮定:ハッシュ関数はすぐ計算出来る O(1)
  23. 23. そのまま挿入出来る or リストをたどる
  24. 24. O( 1 + α )</li></li></ul><li>§11.3.1 The Division Method<br /><ul><li>大前提1. 同じKeyがなかなか出ない
  25. 25. 大前提2. 上手くばらける
  26. 26. Mod: 割り算だけなので高速
  27. 27. (再掲)経験的に素数を使う方がいいらしい</li></li></ul><li>§11.3.2 The Multiplication Method<br /><ul><li>Hash(k) = floor( m ( k A mod 1 ) ) , 0 < A < 1
  28. 28. kA mod 1 … kA – floor(kA)
  29. 29. A ~ (√5-1) / 2 ~ 0.6180339887</li></li></ul><li>§11.3.3 Universal Hash<br /><ul><li>要約1:乱数とハッシュ関数族
  30. 30. 要約2:乱数で毎回別のハッシュ関数を生成</li></li></ul><li>チェイン法まとめ<br /><ul><li>上手くハッシュ関数を選ぶ
  31. 31. 基本的に O(1)
  32. 32. リストで管理
  33. 33. リストが長くなると遅くなる</li></li></ul><li>§11.4 Open addressing<br /><ul><li>又の名をClosed hash.
  34. 34. アイデア:Keyが重複したら横にずらす</li></li></ul><li>§11.4 Open Addressing (Figure)<br />(68/8/4, C)<br />Key 5<br />(78/11/4, C)<br />(01/5/12, E)<br />(87/2/1, B)<br />(85/10/5, A)<br />もう使ってる!<br />
  35. 35. §11.4 Open Addressing (Figure)<br />(78/11/4, C)<br />(01/5/12, E)<br />(87/2/1, B)<br />(85/10/5, A)<br />ずらす<br />(68/8/4, C)<br />
  36. 36. §11.4 Open addressing<br /><ul><li>どのように場所をずらすか?
  37. 37. +1していく:Linear Probing, 線形探査法
  38. 38. 2次関数:Quadratic Probing, 二次関数探査法
  39. 39. 関数2つ:Double Hashing, ダブルハッシュ法</li></li></ul><li>§11.4 Linear, Quadratic Probing<br /><ul><li>パラメータI : I回目のKey生成
  40. 40. Hash(data, i) = ( Hash(k) + I ) mod m
  41. 41. H(k,i) = (H’(k) + c1 i + c2 i*I) mod m
  42. 42. Mod mで表の外に飛び出ない (closed)</li></li></ul><li>§11.4 Double hashing<br /><ul><li>ハッシュ関数 H1, H2
  43. 43. i回目の生成
  44. 44. Hash(data, i) = ( H1(data) + i * H2(data) ) mod m</li></li></ul><li>§11.4 Analysis.<br /><ul><li>占有率α = n / m
  45. 45. ずらすので、高々1要素がスロットにある
  46. 46. 基本的にα = 1 になってしまうと格納出来ない
  47. 47. 1 / ( 1 – α ) だけ再生成するかも(平均で)</li></li></ul><li>§11.4 Analysis<br /><ul><li>M = 6 の表
  48. 48. α = 0.5
  49. 49. 1 / ( 1- α ) = 2</li></li></ul><li>§11.4 Analysis<br /><ul><li>上手くばらけていない
  50. 50. 0~2なら2回以上
  51. 51. 3~5なら1回
  52. 52. 平均的に 1 / ( 1 – α)
  53. 53. 真面目な解析:P247.</li></li></ul><li>§11.5 Perfect Hashing<br /><ul><li>本:245~にはちゃんと書いてあるはず
  54. 54. 要約:ハッシュ関数が単射
  55. 55. 重複しないので、いつも O(1)</li></li></ul><li>実際の実装<br /><ul><li>C#:Dictionary
  56. 56. Java:HashMap
  57. 57. いわゆる、連想配列に使われてます</li></li></ul><li>最後<br /><ul><li>ハッシュ表とか結構基本的なアイデア
  58. 58. 途中の詳しいところ、思い切り飛ばした!
  59. 59. 簡単なのなら直ぐ作れます</li>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×