Hash Tables (Cousera Data Structure Week 4)
CouseraのData Strucureコースのweek4の内容です。
www.coursera.org
前回のweek3の内容の記事はこちら
rikeiin.hatenablog.com
Week4の内容はHash Tablesです。
Hashingの応用例
IP Addresses
あるWebサーバにアクセスしてきた各IPアドレスが過去一定期間にアクセスがあったか判定するという問題を考える。
単純に配列を使った実装の場合、考えうるIPアドレス数の長さの配列を用意し、該当するIPアドレスに対応するインデックスの要素をインクリメントする方法がある。
このとき、
- アクセスリストを更新する操作は(UpdateAccessList)は一つのログにつきO(1)
- 一定期間にアクセスがあったか判定する操作(AccessedLastHour)はO(1)
- IPv4でも2の32乗のメモリが必要
- IPv6では2の128乗であり、もはやメモリに乗らない
配列を使った実装はメモリを多く消費するため、リストを使った実装を考える。
List-based Mapping
過去一定期間にアクセスしてきたIPアドレスのみをリストに保存する。
このとき、アクセス順にリストにつなげていく。
- nは一定期間にアクセスがあったIPアドレスの数
- メモリ消費量は
- L.Append, L.Top, L.Popは
- L.Find, L.Eraseは
- UpdateAccessListは
- AccessedLastHourは
Hash Functions
ハッシュ関数の望ましい要件
- の計算が早い
- 異なるオブジェクトには異なる値
- メモリ使用量がでマップできる
- 基数は小さくしたい
- もしオブジェクトの数がより大きいとき、すべてを異なる値にマップすることは不可能である
Collisions
かつのとき、これを衝突(collision)と呼ぶ。
Chaining
Map
マップはあるオブジェクトからあるオブジェクトへのマッピングを行う。
例えば、以下のような例がある。
- ファイル名→ディスク上のファイルの場所
- 学生ID→学生名
- 契約名→契約電話番号
からへのマップはHashKey(O), Get(O), Set(O, v)の操作を持つデータ構造である。このとき、
Chaining
マップに関する各操作の疑似コードを以下に示す。
- の最大のチェインの長さをとすると、HashKey, Get, Setの時間計算量は
- のとき
- を現在のマップの異なるキーの数、をハッシュ関数の基数とするとメモリの消費量は
Hash Tables
Set
SetはAdd(O), Remove(O), Find(O)の操作を持つデータ構造である。
chainingを使ったSetの実装方法は二通りある。
- Setはからへのマップと等しい
- のペアを保存する代わりにのみを保存する
Setに対する各操作の疑似コードを以下に示す。
SetもしくはMapを用いたhashingの実装をHash tableと呼ぶ。
各プログラミング言語では以下のようなクラスに実装されている。
まとめ
- Chainingはhash tableを実装するためのテクニックのひとつである
- メモリ消費量は
- 各操作の時間計算量は
- どのようにmとcの両方を小さくするか?