データ構造とアルゴリズム

第九回 (2009年12月 4日)

ハッシュ関数とハッシュ法

http://www.sw.it.aoyama.ac.jp/2009/DA/lecture9.html

Martin J. Dürst

duerst@it.aoyama.ac.jp

AGU

© 2008-09 Martin J. Dürst 青山学院大学

目次

辞書のこれまでの実装

方法 探索 挿入 削除
整列済み配列 O(log n) O(n) O(n)
整列無し配列・連結リスト O(n) O(1) O(1)
平衡木 O(log n) O(log n) O(log n)

改良の可能性?

直接アドレス表

(direct addressing)

問題点: 配列の大きさ

ハッシュ法の概要

(hashing, scatter storage technique, 挽き混ぜ法など)

問題点 1: ハッシュ関数の設計

問題点 2: 激突対策

ハッシュ関数の概要

(hash function)

2. は単純なので 1. に注目

ハッシュ関数の注意点

特殊なハッシュ関数

暗号技術的ハッシュ関数

(cryptographic hash function)

激突の問題と対応

チェイン法

(chaining, 連鎖法)

開番地法

(open addressing, オープン法)

ハッシュ表の拡大・縮小

拡大の計算量の分析

(償却分析 (amortized analysis) の簡単な一例)

ハッシュ法の評価

利点:

問題点:

辞書の実装の比較

方法 探索 挿入 削除 整列
整列済み配列 O(log n) O(n) O(n) O(n)
整列無し配列・連結リスト O(n) O(1) O(1) O(n log n)
平衡木 O(log n) O(log n) O(log n) O(n)
ハッシュ表 O(1) O(1) O(1) O(n log n)

Ruby の Hash クラス

Ruby でのハッシュの実装

今回のまとめ

次回のための準備

いつも通り (?) の復習

来週のテーマ: 文字列探索