Backyard Cuckoo Hashing:Constant Worst-Case Operationswith a Succinct Representation
Yuriy Arbitman, Moni Naory, and Gil Segev
東京大学 情報科学科 今井研究室 B4
秋葉 拓哉<[email protected]>
動的辞書• キーの集合や,キーと値の関係を管理するデータ構造
• 普段から皆よく使っているはず– C++ → std::set, std::map, …– Java → java.util.TreeMap, java.util.HashMap, ...– Ruby → ハッシュ– Python → 辞書型
• Ruby の例 (キーを文字列とした)h[“apple”] = 150h[“banana”] = 200puts h[“apple”]
動的辞書の教科書的な実現方法平衡二分探索木
• 各種操作 O(log n) 時間• 順序に関係した操作が行える
ハッシュ表
ハッシュ値 キー0
1 Apple
2
3 Banana, Orange
4 Strawberry
5
• 各種操作 O(1) 期待時間
今日はこっち
本論文の貢献
• 今までは,片方を実現するものは知られていた• しかし,両方は同時に実現されていなかった
– ならし定数時間ですら実現されていなかった
• 例えば,チェイン法のハッシュ表は,領域効率が悪い– ポインタを陽に持つせい
• 高い確率で,全ての操作は最悪定数時間
• 領域効率が情報理論的限界に近い ( 簡潔 , Succinct)
以上を同時に実現する動的辞書を初めて提案する
意義
• コンピュータネットワークでの応用– ルーターでの IP アドレス等の表引き– ネットワークを止めてしまっては困る
• セキュリティ– システムの応答時間を利用した攻撃を防ぐ
• もちろん,ならしで構わない応用も多い
なぜ最悪定数時間?ならし定数時間ではダメ?
話の流れ
De-amortized Cuckoo Hashing[ANS09]
時間:最悪 O(1)領域: (2 + ε) n ワード
BackyardCuckoo Hashing
時間:最悪 O(1)領域: (1 + ε) n ワード
Permutation-BasedBackyard Cuckoo Hashing
時間:最悪 O(1)領域: (1 + o(1)) B ビット ( B : 情報理論的下限)
Cuckoo Hashing[PR01]
時間:ならし O(1)領域: (2 + ε) n ワード
CUCKOO HASHING時間:ならし O(1) ,領域: (2 + ε) n ワード
今ここ!
De-amortized Cuckoo Hashing[ANS09]
BackyardCuckoo Hashing
Permutation-BasedBackyard Cuckoo Hashing
Cuckoo Hashing[PR01]
Cuckoo Hashing[Pagh Rodler 2001]
2 つのテーブルと 2 つのハッシュ関数
検索
x が対応する 2 つの場所を見る
必ず 2 回のアクセスで済む → 高速
[PR01, Fig.1]
高々 n 要素が挿入されるとする
ε は小さい定数
サイズ n + ε の表
2 つのハッシュ関数 f1, f2 が示す値
y
Cuckoo Hashing[Pagh Rodler 2001]
挿入
ぐるぐると追い出す,無理なら再構築
解析を行うと,ならし O(1) 時間
[PR01, Fig.1]
DE-AMORTIZED CUCKOO HASHINGならし O(1) 時間 → 最悪 O(1) 時間
時間:最悪 O(1) ,領域: (2 + ε) n ワード
今ここ! De-amortized Cuckoo Hashing[ANS09]
BackyardCuckoo Hashing
Permutation-BasedBackyard Cuckoo Hashing
Cuckoo Hashing[PR01]
De-Amortized Cuckoo Hashing[Arbitman Naory Segev 2009]
• サイズ L ( 定数 ) のキューを用意– O(1) で検索ができる
• 挿入時の大きな仕事を避けたい
• 挿入で追い出すことを一定回数繰り返す• 解決しなければ,一度キューに挿入
• 仕事が小さかった際は,キューから取り出す
...Queue
T1
T2
Newelements
Head
Back
...
...
BACKYARD CUCKOO HASHING(2+Ε) ワード → (1+Ε) ワード
時間:最悪 O(1) ,領域: (1 + ε) n ワード
De-amortized Cuckoo Hashing[ANS09]
BackyardCuckoo Hashing
Permutation-BasedBackyard Cuckoo Hashing
Cuckoo Hashing[PR01]
今ここ!
Backyard Cuckoo Hashing の概要
• 2 レベルに分かれている– レベル 1 :バケツを並べておく– レベル 2 : De-amortized Cuckoo Hash
• レベル 1 から溢れた要素をレベル 2 に格納
[ANS10, Fig.1]
レベル 1 の詳細• バケツサイズ d = 1/ε2
• バケツ個数 m = (1+ε) n/d– レベル 1 には d×m = (1+ε)n ワード
• 各要素をどのバケツに入れる?– 値域が [0, m) のハッシュ関数を用意
• レベル 1 からあふれるのは?– 高い確率で εn 個以下– de-amortized cuckoo hashing で管理
[ANS10, Fig.1]
高々 n 要素が挿入される
ε は任意の小さい定数
改善
現状• 領域: (1 + ε’) n ワード (ε’ は ε の定数倍 )• 操作: O(d) = O(1/ε2) 時間 ( バケツ内を全部見る )
さらに
操作の時間が ε によらないようにできる
ε への依存を断ち切る• バケツの中も効率的に管理したい
• バケツ内で完全ハッシュ関数を利用– 完全ハッシュ関数 = 単射のハッシュ関数– “2 つの条件” を満たすハッシュなら何でも利用可– De-amortize のため,キューを用意– キューは,全バケツで共通
• ただし, ε の値に制限をした上での構成のみを議論していた– ε = θ(√(log log n / log n))
PERMUTATION-BASEDBACKYARD CUCKOO HASHING(1+Ε) ワード → (1+o(1))B ビット
時間:最悪 O(1) ,領域: (1 + o(1)) B ビット
De-amortized Cuckoo Hashing[ANS09]
BackyardCuckoo Hashing
Permutation-BasedBackyard Cuckoo Hashing
Cuckoo Hashing[PR01]
今ここ!
情報理論的限界
• 先ほどは (1+ε)n ワードの領域を使っていた– これも今までの物より遥かに効率的
• でも, u 個の物から n 個を選ぶのは u C n 通り– キーの定義域が u 個からなるとした
• よって,情報理論的な領域の限界は
B = log(u C n) ≒ n log(u / n) ビット
これに近づくことを目指したい
簡潔データ構造
• (1 + o(1)) B ビットに収まるデータ構造–漸近的に領域が最善–それでして,効率的な操作を提供
• ハッシュ法に限らずよく研究されている–ビットベクトル–ツリー
鍵となるアイディア• ハッシュ関数の代わりに,ランダムな置換を用いる
– [0, u) への全単射– かつ,逆変換ができるものとする
• 自分が入っているバケツの情報を利用する
もともとのキー1010101010
置換を適用001011011
バケツ001
011011
置換の活用
• バケツの番号を活用– バケツ番号がキー情報の一部となる– n log (n / d) ビットを保存すれば OK となる
• レベル 2 の Cukcoo Hashing でも置換を利用– やはり場所の情報をキー情報の一部とする
今日話さなかったこと
• ハッシュ関数・置換のランダム性に関する議論– 完全にランダムなハッシュ関数を効率的に得ることは容易でない
– 条件を緩めたハッシュ関数等で解析を行なっている
• ハッシュ関数・置換の構成に関する議論– 解析に用いた条件を満たすハッシュ関数の実現に関して
も議論している
• 複雑な解析– 実際にはもっと変数が入り乱れた議論になる
まとめ
De-amortized Cuckoo Hashing[ANS09]
時間:最悪 O(1)領域: (2 + ε) n ワード
BackyardCuckoo Hashing
時間:最悪 O(1)領域: (1 + ε) n ワード
Permutation-BasedBackyard Cuckoo Hashing
時間:最悪 O(1)領域: (1 + o(1)) B ビット ( B : 情報理論的下限)
Cuckoo Hashing[PR01]
時間:ならし O(1)領域: (2 + ε) n ワード
キュー
バケツ & 2 レベル
ハッシュ関数 → 置換