Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Hash Table

1,747 views

Published on

Introduction to Algorithms, section11 Hash Table.

Published in: Technology, Education
  • Be the first to comment

  • Be the first to like this

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>

×