nazoki
DESCRIPTION
about van Emde Boas tree @JOIkakisemi2012TRANSCRIPT
![Page 1: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/1.jpg)
van Emde Boas Trees〜明日から使えない謎の速い木〜
catupper
![Page 2: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/2.jpg)
van Emde Boas Treesとは
● 読み:ばん えんで ぼーす● 以下「謎木」● 集合(set)● 非常に速い● あらゆる操作がO(lg lg u)● 実装が重い
![Page 3: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/3.jpg)
機能要件
● MAXIMUM 最大値● MINIMUM 最小値● MEMBER 有無● INSERT 挿入● DELETE 削除● SUCCESSOR それより大きい最小の要素● PREDECESSOR それより小さい最大の要素
![Page 4: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/4.jpg)
平衡二分探索木
● 葉にビットを立てて有無を表現● 親は全子孫のORの結果を保持(Summary)
1
0 1
0 0 0 1
0 0 0 0 0 0 1 0
0 1 2 3 4 5 6 7
![Page 5: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/5.jpg)
各オーダー
● MAXIMUM log u● MINIMUM log u● MEMBER log u● INSERT log u● DELETE log u● SUCCESSOR log u● PREDCESSOR log u● 木の深さに依存
![Page 6: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/6.jpg)
深さを
log log uにしたい
![Page 7: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/7.jpg)
平方兵法
● サイズu の親は サイズ√uの子を√u個持つ● 最小サイズは2● 深さはlog log u
サイズ256
サイズ4 サイズ4 サイズ4 サイズ4
サイズ2 サイズ2
![Page 8: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/8.jpg)
各ノードのデータ
● サイズuのノード
● 最大値● 最小値● 子へのポインタ● Summary
– 各子に対する そのノードとその子孫のOR値
サイズ U
Summary 木
Cluster
木 木 木 木 木
最大値 max 最小値 min
![Page 9: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/9.jpg)
全体図
![Page 10: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/10.jpg)
各オペレーションのオーダー
![Page 11: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/11.jpg)
MIN,MAX,MEMBER
● MIN、MAX– 子孫の最大値と最小値を各親が持ってる
– O(1)
● MEMBER– 該当箇所へ降りて行って確認するだけ
– 処理数は深さ分
– O(log log u)
![Page 12: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/12.jpg)
SUCCESSOR,PREDCESSOR
● SUCCESSOR
– 木を下りながら
– minより小さくなったらminを返す
– maxより大きくなったら次の兄弟のminを返す
– 次の兄弟はsummaryからSUCCESSORで探す
– 処理数は深さ分
– O(log log u)● PREDCESSOR
– 逆も然り
![Page 13: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/13.jpg)
INSERT
● INSERT– 該当場所へ向かって木を降りて行って
– minもmaxも未定義だったら両方に入れてsummaryを更新して終わる
– minより小さかったら値を交換して再帰続行
– maxより大きかったらmaxを更新
– 処理数は深さ分
– O(log log u)
![Page 14: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/14.jpg)
DELETE
● DELETE– 該当箇所に向かって降りていく
– minとmaxが等しかったら削除して終了
– minと等しかったらsummaryのminのminで更新
– maxと等しかったらsummaryのmaxのmaxで更新
– いた木のminとmaxが等しかったらsummary更新
– O(log log u)
![Page 15: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/15.jpg)
超ややこしい
![Page 16: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/16.jpg)
要するに
● maxとminで要素数が0か1か2以上かを判断– Summaryの更新が必要かを判断
● どの要素もいずれかの木のmin– min maxを中心にオペレーションを回せる
● Summaryはminを扱わない– 削除のとき更新が楽になる
● 要素数が2未満ならそこで再帰終了– 必要メモリが減る
![Page 17: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/17.jpg)
空間計算量
● 扱う数字の範囲分(u)必要● よってO(u)● Int型なら32bit● 大きい
![Page 18: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/18.jpg)
使えない?
![Page 19: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/19.jpg)
工夫
● オペレーションは空の木の子に行かない● 空の木はINSERT時以外更新されない● INSERT時に動的につくればええやん● 木の数は要素数(n)を超えない● よって空間計算量O(n)
![Page 20: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/20.jpg)
やったねたえちゃん
二分ヒープと同じ
![Page 21: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/21.jpg)
まとめ
● ヒープ並のメモリ使用量でO(log log u)で同じ機能をサポート
● 実装– ややこしいオペレーション関数
– ややこしい構造
– 動的ハッシュ
– スクリプト言語に向いてない
– デバッグ大変でした
![Page 22: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/22.jpg)
まとめ
使えるまでメモリを削減するには動的ハッシュが必要
![Page 23: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/23.jpg)
実装が重い!
結論
![Page 24: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/24.jpg)
結論
実装できんかった><
![Page 25: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/25.jpg)
謎木速いんだけど
微妙にバグる
結論
![Page 26: Nazoki](https://reader034.vdocuments.mx/reader034/viewer/2022052619/5561558dd8b42a780d8b5271/html5/thumbnails/26.jpg)
ご清聴ありがとうございました