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

第九回 (2010年12月3日)

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

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

Martin J. Dürst

AGU

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

目次

B 木

(B-tree)

B+木関連の変数の定義

B+木: ページごとの項目数

(以下、整数に丸める部分は省略)

B+木のノードの数

辞書のこれまでの実装

方法 探索 挿入 削除
整列済み配列 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 クラス

(Perl: hash; Java: HashMap; Python: dict)

Ruby でのハッシュの実装

今回のまとめ