狠狠撸

狠狠撸Share a Scribd company logo
van Emde Boas Trees
           ?明日から使えない謎の速い木?




catupper
van Emde Boas Treesとは
● 読み:ばん えんで ぼーす
● 以下「謎木」


● 集合(set)


● 非常に速い


● あらゆる操作がO(lg lg u)


● 実装が重い
機能要件
●   MAXIMUM   最大値
●   MINIMUM   最小値
●   MEMBER    有無
●   INSERT     挿入
●   DELETE     削除
●   SUCCESSOR  それより大きい最小の要素
●   PREDECESSOR それより小さい最大の要素
平衡二分探索木
●   葉にビットを立てて有無を表現
●   親は全子孫の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
各オーダー
●   MAXIMUM     log u
●   MINIMUM     log u
●   MEMBER      log u
●   INSERT      log u
●   DELETE      log u
●   SUCCESSOR   log u
●   PREDCESSOR log u
●   木の深さに依存
深さを
log log u
 にしたい
平方兵法
●   サイズu の親は サイズ√uの子を√u個持つ
●   最小サイズは2
●   深さはlog log u
                       サイズ256




         サイズ4      サイズ4         サイズ4   サイズ4




                サイズ2      サイズ2
各ノードのデータ
●   サイズuのノード

               サイズ      U   最大値 max      最小値 min


                               Cluster

●   最大値       Summary   木      木  木  木  木  木

●   最小値
●   子へのポインタ
●   Summary
      –   各子に対する そのノードとその子孫のOR値
全体図
各オペレーションの
  オーダー
MIN,MAX,MEMBER
●   MIN、MAX
      –   子孫の最大値と最小値を各親が持ってる
      –   O(1)
●   MEMBER
      –   該当箇所へ降りて行って確認するだけ
      –   処理数は深さ分
      –   O(log log u)
SUCCESSOR,PREDCESSOR
●   SUCCESSOR
       – 木を下りながら
       – minより小さくなったらminを返す
       – maxより大きくなったら次の兄弟のminを返す
       – 次の兄弟はsummaryからSUCCESSORで探す
       – 処理数は深さ分
       – O(log log u)
●   PREDCESSOR
       –   逆も然り
INSERT
●   INSERT
       –   該当場所へ向かって木を降りて行って
       –   minもmaxも未定義だったら両方に入れて
            summaryを更新して終わる
       –   minより小さかったら値を交換して再帰続行
       –   maxより大きかったらmaxを更新
       –   処理数は深さ分
       –   O(log log u)
DELETE
●   DELETE
      –   該当箇所に向かって降りていく
      –   minとmaxが等しかったら削除して終了
      –   minと等しかったらsummaryのminのminで更新
      –   maxと等しかったらsummaryのmaxのmaxで更新
      –   いた木のminとmaxが等しかったらsummary更新
      –   O(log log u)
超ややこしい
要するに
●   maxとminで要素数が0か1か2以上かを判断
      –   Summaryの更新が必要かを判断
●   どの要素もいずれかの木のmin
      –   min maxを中心にオペレーションを回せる
●   Summaryはminを扱わない
      –   削除のとき更新が楽になる
●   要素数が2未満ならそこで再帰終了
      –   必要メモリが減る
空間计算量
● 扱う数字の範囲分(u)必要
● よってO(u)

● Int型なら32bit

● 大きい
使えない?
工夫
● オペレーションは空の木の子に行かない
● 空の木はINSERT時以外更新されない


● INSERT時に動的につくればええやん


● 木の数は要素数(n)を超えない


● よって空間计算量O(n)
やったねたえちゃん




二分ヒープと同じ
まとめ
●   ヒープ並のメモリ使用量でO(log log u)で同じ機能
    をサポート
●   実装
      –   ややこしいオペレーション関数
      –   ややこしい構造
      –   動的ハッシュ
      –   スクリプト言語に向いてない
      –   デバッグ大変でした
まとめ



使えるまでメモリを削減するには
   动的ハッシュが必要
結論




実装が重い!
結論



実装できんかった
   ><
結論



謎木速いんだけど
 微妙にバグる
ご清聴ありがとうございました

More Related Content

What's hot (20)

文字列アルゴリズム
文字列アルゴリズム文字列アルゴリズム
文字列アルゴリズム
HCPC: 北海道大学競技プログラミングサークル
?
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
京大 マイコンクラブ
?
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
HCPC: 北海道大学競技プログラミングサークル
?
指数时间アルゴリズム入门
指数时间アルゴリズム入门指数时间アルゴリズム入门
指数时间アルゴリズム入门
Yoichi Iwata
?
色々なタ?イクストラ高速化
色々なタ?イクストラ高速化色々なタ?イクストラ高速化
色々なタ?イクストラ高速化
yosupo
?
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
?
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
?
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
HCPC: 北海道大学競技プログラミングサークル
?
プログラミングコンテストでの动的计画法
プログラミングコンテストでの动的计画法プログラミングコンテストでの动的计画法
プログラミングコンテストでの动的计画法
Takuya Akiba
?
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
Hibiki Yamashiro
?
指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端
Yoichi Iwata
?
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
AtCoder Inc.
?
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
HCPC: 北海道大学競技プログラミングサークル
?
动的计画法を极める!
动的计画法を极める!动的计画法を极める!
动的计画法を极める!
HCPC: 北海道大学競技プログラミングサークル
?
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
AtCoder Inc.
?
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
AtCoder Inc.
?
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
Yuma Inoue
?
双対性
双対性双対性
双対性
Yoichi Iwata
?
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
AtCoder Inc.
?
指数时间アルゴリズム入门
指数时间アルゴリズム入门指数时间アルゴリズム入门
指数时间アルゴリズム入门
Yoichi Iwata
?
色々なタ?イクストラ高速化
色々なタ?イクストラ高速化色々なタ?イクストラ高速化
色々なタ?イクストラ高速化
yosupo
?
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
?
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba
?
プログラミングコンテストでの动的计画法
プログラミングコンテストでの动的计画法プログラミングコンテストでの动的计画法
プログラミングコンテストでの动的计画法
Takuya Akiba
?
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
Hibiki Yamashiro
?
指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端指数时间アルゴリズムの最先端
指数时间アルゴリズムの最先端
Yoichi Iwata
?
AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説AtCoder Beginner Contest 015 解説
AtCoder Beginner Contest 015 解説
AtCoder Inc.
?
AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説AtCoder Regular Contest 039 解説
AtCoder Regular Contest 039 解説
AtCoder Inc.
?
AtCoder Regular Contest 046
AtCoder Regular Contest 046AtCoder Regular Contest 046
AtCoder Regular Contest 046
AtCoder Inc.
?
LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~LCA and RMQ ~簡潔もあるよ!~
LCA and RMQ ~簡潔もあるよ!~
Yuma Inoue
?
AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説AtCoder Beginner Contest 034 解説
AtCoder Beginner Contest 034 解説
AtCoder Inc.
?

Viewers also liked (20)

最近の顿蚕狈
最近の顿蚕狈最近の顿蚕狈
最近の顿蚕狈
mooopan
?
プログラムを高速化する话
プログラムを高速化する话プログラムを高速化する话
プログラムを高速化する话
京大 マイコンクラブ
?
How To Become A Rubyist
How To Become A RubyistHow To Become A Rubyist
How To Become A Rubyist
masayoshi takahashi
?
素集合データ构造
素集合データ构造素集合データ构造
素集合データ构造
京大 マイコンクラブ
?
竞技プログラミングにおける惭补箩辞谤颈锄补迟颈辞苍
竞技プログラミングにおける惭补箩辞谤颈锄补迟颈辞苍竞技プログラミングにおける惭补箩辞谤颈锄补迟颈辞苍
竞技プログラミングにおける惭补箩辞谤颈锄补迟颈辞苍
skyaozora
?
ARC#003D
ARC#003DARC#003D
ARC#003D
nullmineral
?
パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋
Kazuma Mikami
?
セグツリーイメージ
セグツリーイメージセグツリーイメージ
セグツリーイメージ
Kazuma Mikami
?
データ构造と全探索
データ构造と全探索データ构造と全探索
データ构造と全探索
京大 マイコンクラブ
?
グラフと木
グラフと木グラフと木
グラフと木
京大 マイコンクラブ
?
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
?
部内勉强会 数え上げの基础
部内勉强会 数え上げの基础部内勉强会 数え上げの基础
部内勉强会 数え上げの基础
Kazuma Mikami
?
颁辞辩の公理
颁辞辩の公理颁辞辩の公理
颁辞辩の公理
Masaki Hara
?
竞技プログラミングでの线型方程式系
竞技プログラミングでの线型方程式系竞技プログラミングでの线型方程式系
竞技プログラミングでの线型方程式系
tmaehara
?
动的计画法
动的计画法动的计画法
动的计画法
京大 マイコンクラブ
?
ソーティングと贪欲法
ソーティングと贪欲法ソーティングと贪欲法
ソーティングと贪欲法
京大 マイコンクラブ
?
计算量とオーダー
计算量とオーダー计算量とオーダー
计算量とオーダー
京大 マイコンクラブ
?
実践?最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践?最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)実践?最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践?最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
AtCoder Inc.
?
Kolte Patil Mirabilis
 Kolte Patil Mirabilis Kolte Patil Mirabilis
Kolte Patil Mirabilis
360 Realtors
?
最近の顿蚕狈
最近の顿蚕狈最近の顿蚕狈
最近の顿蚕狈
mooopan
?
竞技プログラミングにおける惭补箩辞谤颈锄补迟颈辞苍
竞技プログラミングにおける惭补箩辞谤颈锄补迟颈辞苍竞技プログラミングにおける惭补箩辞谤颈锄补迟颈辞苍
竞技プログラミングにおける惭补箩辞谤颈锄补迟颈辞苍
skyaozora
?
パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋パソコン甲子園 ケーキ屋
パソコン甲子園 ケーキ屋
Kazuma Mikami
?
セグツリーイメージ
セグツリーイメージセグツリーイメージ
セグツリーイメージ
Kazuma Mikami
?
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
?
部内勉强会 数え上げの基础
部内勉强会 数え上げの基础部内勉强会 数え上げの基础
部内勉强会 数え上げの基础
Kazuma Mikami
?
竞技プログラミングでの线型方程式系
竞技プログラミングでの线型方程式系竞技プログラミングでの线型方程式系
竞技プログラミングでの线型方程式系
tmaehara
?
実践?最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践?最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)実践?最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
実践?最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
AtCoder Inc.
?
Kolte Patil Mirabilis
 Kolte Patil Mirabilis Kolte Patil Mirabilis
Kolte Patil Mirabilis
360 Realtors
?

More from Ken Ogura (20)

Amortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 StackAmortize analysis of Deque with 2 Stack
Amortize analysis of Deque with 2 Stack
Ken Ogura
?
Deque with Haskel
Deque with HaskelDeque with Haskel
Deque with Haskel
Ken Ogura
?
Trianguler
TriangulerTrianguler
Trianguler
Ken Ogura
?
Npc april fool2014
Npc april fool2014Npc april fool2014
Npc april fool2014
Ken Ogura
?
辺彩色
辺彩色辺彩色
辺彩色
Ken Ogura
?
かけざん
かけざんかけざん
かけざん
Ken Ogura
?
人间対笔肠2
人间対笔肠2人间対笔肠2
人间対笔肠2
Ken Ogura
?
笔颁解体
笔颁解体笔颁解体
笔颁解体
Ken Ogura
?
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
Ken Ogura
?
Shio dtm
Shio dtmShio dtm
Shio dtm
Ken Ogura
?
颁をやりましょう
颁をやりましょう颁をやりましょう
颁をやりましょう
Ken Ogura
?
April2013
April2013April2013
April2013
Ken Ogura
?
April2013
April2013April2013
April2013
Ken Ogura
?
Mage
MageMage
Mage
Ken Ogura
?
Imo
ImoImo
Imo
Ken Ogura
?
Hairetu2
Hairetu2Hairetu2
Hairetu2
Ken Ogura
?
Moon
MoonMoon
Moon
Ken Ogura
?
Jissou
JissouJissou
Jissou
Ken Ogura
?
Lunch
LunchLunch
Lunch
Ken Ogura
?
Divisor
DivisorDivisor
Divisor
Ken Ogura
?

Nazoki

  • 1. van Emde Boas Trees ?明日から使えない謎の速い木? catupper
  • 2. van Emde Boas Treesとは ● 読み:ばん えんで ぼーす ● 以下「謎木」 ● 集合(set) ● 非常に速い ● あらゆる操作がO(lg lg u) ● 実装が重い
  • 3. 機能要件 ● MAXIMUM   最大値 ● MINIMUM   最小値 ● MEMBER    有無 ● INSERT     挿入 ● DELETE     削除 ● SUCCESSOR  それより大きい最小の要素 ● PREDECESSOR それより小さい最大の要素
  • 4. 平衡二分探索木 ● 葉にビットを立てて有無を表現 ● 親は全子孫の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
  • 5. 各オーダー ● MAXIMUM  log u ● MINIMUM log u ● MEMBER log u ● INSERT log u ● DELETE log u ● SUCCESSOR log u ● PREDCESSOR log u ● 木の深さに依存
  • 6. 深さを log log u にしたい
  • 7. 平方兵法 ● サイズu の親は サイズ√uの子を√u個持つ ● 最小サイズは2 ● 深さはlog log u サイズ256 サイズ4 サイズ4 サイズ4 サイズ4 サイズ2 サイズ2
  • 8. 各ノードのデータ ● サイズuのノード サイズ U 最大値 max 最小値 min Cluster ● 最大値 Summary 木 木  木  木  木  木 ● 最小値 ● 子へのポインタ ● Summary – 各子に対する そのノードとその子孫のOR値
  • 11. MIN,MAX,MEMBER ● MIN、MAX – 子孫の最大値と最小値を各親が持ってる – O(1) ● MEMBER – 該当箇所へ降りて行って確認するだけ – 処理数は深さ分 – O(log log u)
  • 12. SUCCESSOR,PREDCESSOR ● SUCCESSOR – 木を下りながら – minより小さくなったらminを返す – maxより大きくなったら次の兄弟のminを返す – 次の兄弟はsummaryからSUCCESSORで探す – 処理数は深さ分 – O(log log u) ● PREDCESSOR – 逆も然り
  • 13. INSERT ● INSERT – 該当場所へ向かって木を降りて行って – minもmaxも未定義だったら両方に入れて summaryを更新して終わる – minより小さかったら値を交換して再帰続行 – maxより大きかったらmaxを更新 – 処理数は深さ分 – O(log log u)
  • 14. DELETE ● DELETE – 該当箇所に向かって降りていく – minとmaxが等しかったら削除して終了 – minと等しかったらsummaryのminのminで更新 – maxと等しかったらsummaryのmaxのmaxで更新 – いた木のminとmaxが等しかったらsummary更新 – O(log log u)
  • 16. 要するに ● maxとminで要素数が0か1か2以上かを判断 – Summaryの更新が必要かを判断 ● どの要素もいずれかの木のmin – min maxを中心にオペレーションを回せる ● Summaryはminを扱わない – 削除のとき更新が楽になる ● 要素数が2未満ならそこで再帰終了 – 必要メモリが減る
  • 19. 工夫 ● オペレーションは空の木の子に行かない ● 空の木はINSERT時以外更新されない ● INSERT時に動的につくればええやん ● 木の数は要素数(n)を超えない ● よって空間计算量O(n)
  • 21. まとめ ● ヒープ並のメモリ使用量でO(log log u)で同じ機能 をサポート ● 実装 – ややこしいオペレーション関数 – ややこしい構造 – 動的ハッシュ – スクリプト言語に向いてない – デバッグ大変でした