More Related Content
PPTX
PDF
PDF
PDF
AtCoder Beginner Contest 023 解説 PDF
PDF
PDF
PDF
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015 What's hot
PDF
PDF
ARM CPUにおけるSIMDを用いた高速計算入門 PDF
PDF
PDF
PDF
PPT
PDF
言葉のもつ広がりを、モデルの学習に活かそう -one-hot to distribution in language modeling- PDF
PDF
PDF
AtCoder Regular Contest 045 解説 PPTX
PDF
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~ PDF
PDF
PPT
PDF
PDF
PDF
組み込み関数(intrinsic)によるSIMD入門 Viewers also liked
PPTX
PPTX
PPTX
PPT
PPTX
PPTX
PPT
PPT
PPTX
What is jubatus? How it works for you? PPTX
PPTX
PDF
Similar to よくわかるHopscotch hashing
PDF
PDF
DSIRNLP #3 LZ4 の速さの秘密に迫ってみる PDF
論文紹介: Cuckoo filter: practically better than bloom PDF
[アルゴリズムイントロダクション勉強会] ハッシュ PPTX
katagaitai CTF勉強会 #3 crypto PPT
PPTX
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
PDF
Data-Intensive Text Processing with MapReduce ch4 PDF
PDF
"What Does Your Code Smell Like?"で学ぶPerl6 PDF
PDF
よくわかるHopscotch hashing
- 1.
- 2.
Locking!!!!
このアルゴリズムは
Lock-freeではありません!
Lock-freeを期待して見にきた方は回れ右!
- 3.
Hashmapとは?
• みんな大好き連想配列!
–RubyでもPerlでもPythonでも人気者!
– C++でならunordered_map、JavaならHashMap
• 何かの値をキーとして別の値を保存・検索できるデータ構造
– 「山!」→「川!」
• とにかく高速!
– O(1)で動作するデータ構造
• 大量のデータを入れても検索速度が変わらないただ一つのデータ
構造
- 4.
その仕組み
山! 8番目!
川!
Hash関数に通すだけで
保存or検索すべき場所が判明する!
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
選べる探索バリエーション(併用不
可)
Liner Probing
Quadratic Probing
±1, 2, 4, 8, 16…
Double Hashing
±Hash(x)
- 14.
Open Addressing
• 一つのHash値に対して配列上の複数の場所が該当しうるの
でOpenと名がつくんだと思う
• 利点
– キャッシュの局所性を生かせるので速い(特にLinear Probing)
– ポインタの分だけ省メモリ
• 欠点
– 削除時にはデータを消さずに削除フラグを立てて再利用させる
だけ
• データが存在している事そのものが「まだ配列の続きにあるかも
よ」という状態を表しているので完全に消しちゃうとマズい
• よって挿入・削除で密度が上がってくると入ってるデータが少な
い時でも検索・挿入・削除の性能がガタ落ちする
- 15.
- 16.
- 17.
- 18.
• 利点
Cuckoo Hashing
– 検索は2つの配列の一箇所ずつを探すだけなので高速
– 多少ハッシュ値が偏ってももう一つのハッシュ値が散れば問題
ない
• 欠点
– 密度に応じて挿入のコストが上がる
– 2つの配列を使う分メモリを食う
• チェインのポインタを持たなくてよいのでそんなに問題でないか
も
– 特性上、全体の半分が埋まったところで性能がガタ落ちする
• タチが悪いと円環して終わらない事もあり得るのかな
– つまり半分埋まる前に拡大する必要がある
• スッカスカのテーブルを維持しなきゃいけないからありがたみ少
ない
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
挿入
• およそ8ワード分のビット数先のバケットまで配列を舐めな
がら、アイテムが入っていない空バケットが無いかを探す
– 空バケットとはHop情報部分はともかくアイテム部分が空の物
• 空バケットをswapしながら左に移動させていく
– バケットからHop情報で飛べる1wordビット範囲でしかswapは
しない アイテム
01010100
ここに入れたいけ
ど空きが無い
ビッシ
リ swap
- 28.
挿入
• およそ8ワード分のビット数先のバケットまで配列を舐めな
がら、アイテムが入っていない空バケットが無いかを探す
– 空バケットとはHop情報部分はともかくアイテム部分が空の物
• 空バケットをswapしながら左に移動させていく
– バケットからHop情報で飛べる1wordビット範囲でしかswapは
しない アイテム
00010110
ここに入れたいけ
ど空きが無い
ビッシ
リ swap完了
- 29.
挿入
• およそ8ワード分のビット数先のバケットまで配列を舐めな
がら、アイテムが入っていない空バケットが無いかを探す
– 空バケットとはHop情報部分はともかくアイテム部分が空の物
• 空バケットをswapしながら左に移動させていく
– バケットからHop情報で飛べる1wordビット範囲でしかswapは
しない
• 挿入したい位置から1word幅になるまで続ける
ここに入れたいけ
ど空きが無い
ビッシ
リ swap
- 30.
挿入
• およそ8ワード分のビット数先のバケットまで配列を舐めな
がら、アイテムが入っていない空バケットが無いかを探す
– 空バケットとはHop情報部分はともかくアイテム部分が空の物
• 空バケットをswapしながら左に移動させていく
– バケットからHop情報で飛べる1wordビット範囲でしかswapは
しない
• 挿入したい位置から1word幅になるまで続ける
ここに入れたいけ
ど空きが無い
ビッシ
リ swap完了
- 31.
- 32.
- 33.
- 34.
- 35.
ポイント
• バケットそれぞれにアイテムとHop情報が入っている。
– Hash値を算出して配列の該当部分にアクセスした瞬間に、その
周辺もキャッシュラインに同時に載るためキャッシュミスが減
る
• 検索時は必ずそのバケットから1wordのbit数以内の距離にあ
る
– カッコウハッシュはバケット2つしか1つのアイテムが入りうる
候補が無かったのに対して、1word幅bit個まで候補が増えてい
る
• 配列を拡張しなくても入る量が多い
• そんなわけで実装してみた。Boost::unordered_mapより速
い。
– https://gist.github.com/2943289