SlideShare a Scribd company logo
1 of 57
Download to read offline
直交領域探索
okuraofvegetable
まずはじめに
• 皆さんよく長方形の内部に含まれ
る点を列挙したくなりますよね?
というのは冗談で
• 世の中の問題にはしばしばn次元空間における直交領域
のクエリに帰着できるものが存在する
• というわけでこれを高速に行いたい
Simple is Best
• 𝑑次元平面の𝑁点の中から与えられた直交領域内の点を
列挙したい(𝑑 ≪ 𝑁)
• ケースによってはすべての点を列挙することになるので
最悪𝑂(𝑁)
• すべての点について領域内か判定すれば𝑂(𝑁)
• よって愚直解が最適
Simple is Best
• 𝑑次元平面の𝑁点の中から与えられた直交領域内の点を
列挙したい(𝑑 ≪ 𝑁)
• ケースによってはすべての点を列挙することになるので
最悪𝑂(𝑁)
• すべての点について領域内か判定すれば𝑂(𝑁)
• よって愚直解が最適
• 優勝
ご清聴ありがとうございました
というのは冗談で
• お分かりのとおり、すべての点の数Nだけでなく領域内
の点の数𝐾で評価すべき
• 出力サイズに敏感(𝑂𝑢𝑡𝑝𝑢𝑡 − 𝑠𝑒𝑛𝑠𝑖𝑡𝑖𝑣𝑒)というらしい
• これらのクエリにある程度高速に答えられるデータ構造
を紹介します
とりあえず1次元で
• これは点の座標を葉に持つような二分探索木を構築すれ
ば簡単に答えられる
• 二分探索木として平衡二分木を用い、二分木の全頂点で
座標を管理してもできる
こんな感じ
3 19 30 49 59 70 89 100
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
3 19 30 49 59 70 89 100
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
3 19 30 49 59 70 89 100
葉が各値に対応している
クエリがきたら
• クエリに答える際は、𝑠𝑒𝑔𝑚𝑒𝑛𝑡 𝑡𝑟𝑒𝑒の時とほぼ同様にし
て答えられる
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
[-∞、∞]
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
[-∞、∞]
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
[-∞、49]
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
[-∞、49]
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
[-∞、19]
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
[-∞、19]←重なりがない→
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
(19,49]完全に含まれている→
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
(19,49]
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
(49,∞]
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
[-∞、49]
残りも同様にして
こんな感じ
49
19 59
3 30 59 89
3 19 30 49 59 70 89 100
クエリ
[20,60]
見ている区間
[-∞、49]
残りも同様にして
求まった
計算量
• 構築 に
• 空間計算量 𝑂(𝑁)
• 時間計算量 𝑂(𝑁𝑙𝑜𝑔𝑁)
• クエリ毎に
• 𝑂 𝑙𝑜𝑔𝑁 + 𝐾
• (𝐾は答える点の数)
kD-Tree
• 2次元以上でも、同様に点を二分探索木で管理してクエ
リに答えたい。
• ではどうするか?
kD-Tree
• 2次元以上でも、同様に点を二分探索木で管理してクエ
リに答えたい。
• ではどうするか?
• 奇数回目はx座標で、偶数回目はy座標で、分割する
kD-Tree
kD-Tree
𝑙1
kD-Tree
𝑙1
𝑙2
kD-Tree
𝑙1
𝑙2
𝑙3
kD-Tree
𝑙1
𝑙2
𝑙3
𝑙5
𝑙6
𝑙4
𝑙9
𝑙7
𝑙8
kD-Tree
𝑙1
𝑙2 𝑙3
𝑙4 𝑙5 𝑙7 𝑙8
𝑙6 𝑙9
クエリがきたら
• 1次元の場合とほぼ同様にできる。
kD-Treeの計算量
• 2次元の場合
• 構成に
• 空間計算量𝑂(𝑁)
• 時間計算量𝑂(𝑁𝑙𝑜𝑔𝑁)
• クエリ毎に
• 𝑂( 𝑁 + 𝐾)
kD-Treeの計算量
• 一般に𝑑次元の場合(𝑑 ≥ 2)
• 構成に
• 空間計算量𝑂(𝑁)
• 時間計算量𝑂(𝑁𝑙𝑜𝑔𝑁)
• クエリ毎に
• 𝑂(𝑁1−
1
𝑑 + 𝐾)
領域木(Range Tree)
• まずx座標だけに着目して二分探索木で点を持つ
• 今回はkD木の時とは異なり葉だけが点の座標を管理して
いるわけではない
• そして、各頂点に対応するx座標を持った点達のy座標を
管理する二分探索木を頂点が持っている
こんな感じ
イメージ図
計算量
• x座標を管理する二分探索木を走査するのに𝑂(𝑙𝑜𝑔𝑁)
• 走査した各頂点からy座標を管理している二分探索木を
走査するのに𝑂(𝑙𝑜𝑔𝑁)
• あわせて𝑂(𝑙𝑜𝑔2 𝑁 + 𝐾)
計算量
• x座標を管理する二分探索木を走査するのに𝑂(𝑙𝑜𝑔𝑁)
• 走査した各頂点からy座標を管理している二分探索木を
走査するのに𝑂(𝑙𝑜𝑔𝑁)
• あわせて𝑂(𝑙𝑜𝑔2 𝑁 + 𝐾)
• よさみが深い
計算量
• x座標を管理する二分探索木を走査するのに𝑂(𝑙𝑜𝑔𝑁)
• 走査した各頂点からy座標を管理している二分探索木を
走査するのに𝑂(𝑙𝑜𝑔𝑁)
• あわせて𝑂(𝑙𝑜𝑔2 𝑁 + 𝐾)
• よさみが深い
• が、まだ早くできる
~断片的直列接続法~
フラクショナルカスケーディング
RangeTreeのムダ
• 𝑂(𝑙𝑜𝑔𝑁)個の二分探索木に対する探索の範囲はすべて同
じ
• うまいことやればいい感じにできそう
Fractional cascading
3 19 30 49 59 70 89 100
↑点たちをy座標でソート(枠内はy座標の値)
Fractional cascading
3 19 30 49 59 70 89 100
3 49 59 89 19 30 70 100
x座標が中央値以下のものとそれ以外のものに分ける
Fractional cascading
3 19 30 49 59 70 89 100
3 49 59 89 19 30 70 100
残りも同様に
3 59 49 89 19 100 30 70
Fractional cascading
3 19 30 49 59 70 89 100
3 49 59 89 19 30 70 100
3 59 49 89 19 100 30 70
3 59 49 89 19 100 30 70
3 19 30 49 59 70 89 100
3 49 59 89 19 30 70 100
3 59 49 89 19 100 30 70
3 59 49 89 19 100 30 70
x座標の区間に対応する数列たち(例えば図の赤い部分)か
ら同じy座標の区間に入る数たちを探す
Fractional cascading
3 19 30 49 59 70 89 100
3 49 59 89 19 30 70 100
3 59 49 89 19 100 30 70
3 59 49 89 19 100 30 70
Fractional cascading
• あとは昨日のcatupperさんの講義で言っていたのと同
じ要領で、始めの1つだけ二分探索をしてあとはリンク
をたどっていけばよい
• 今回は特殊ケースで、元から1つ前の数列の半分が入っ
ているので扱う数の範囲に偏りがある心配はない
計算量
• 始めの二分探索に𝑂(𝑙𝑜𝑔𝑁)
• リンクをたどるのに𝑂(𝑙𝑜𝑔𝑁)
• あわせて𝑂(𝑙𝑜𝑔𝑁 + 𝐾)
計算量
• 始めの二分探索に𝑂(𝑙𝑜𝑔𝑁)
• リンクをたどるのに𝑂(𝑙𝑜𝑔𝑁)
• あわせて𝑂(𝑙𝑜𝑔𝑁 + 𝐾)
• ありえんよさみが深い
競プロの問題を解きたい
• せっかくやし競プロの問題といてAcceptedの文字が見
たい
• AOJのDSLくらいしかない…
使う問題あるよ!
Codeforces Round #118
Div1 E Soap Time! – 2
• 問題概要
• 座標平面上のN点に人がおり、どこか一点に集まりたい。
• 人は1単位時間ごとに上下左右に1進むことができる
• 座標平面上のK点に駅があり、これらの任意の2点間は相
互に瞬間移動可能である
• 全員が1点に集まるのにかかる時間の最小値を求めよ
ごめんなさい
• 今回は時間がたりなかったため通すのを断念しました
• また時間があるときに解こうと思います
ご清聴ありがとうございました

More Related Content

What's hot

プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズムTakuya Akiba
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化yosupo
 
図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』Proktmr
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話Nagisa Eto
 
モデル高速化百選
モデル高速化百選モデル高速化百選
モデル高速化百選Yusuke Uchida
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドMasaki Hara
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換AtCoder Inc.
 
3次元の凸包を求める
3次元の凸包を求める3次元の凸包を求める
3次元の凸包を求めるabc3141
 
最適化超入門
最適化超入門最適化超入門
最適化超入門Takami Sato
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろHiroshi Yamashita
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxpsMITSUNARI Shigeo
 
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Yusuke Uchida
 

What's hot (20)

プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』
 
Rolling Hashを殺す話
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
 
Fractional cascading
Fractional cascadingFractional cascading
Fractional cascading
 
目指せグラフマスター
目指せグラフマスター目指せグラフマスター
目指せグラフマスター
 
モデル高速化百選
モデル高速化百選モデル高速化百選
モデル高速化百選
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
高速フーリエ変換
高速フーリエ変換高速フーリエ変換
高速フーリエ変換
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
3次元の凸包を求める
3次元の凸包を求める3次元の凸包を求める
3次元の凸包を求める
 
最適化超入門
最適化超入門最適化超入門
最適化超入門
 
充足可能性問題のいろいろ
充足可能性問題のいろいろ充足可能性問題のいろいろ
充足可能性問題のいろいろ
 
ドロネー三角形分割
ドロネー三角形分割ドロネー三角形分割
ドロネー三角形分割
 
Chokudai search
Chokudai searchChokudai search
Chokudai search
 
PCL
PCLPCL
PCL
 
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
 
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
 

Similar to 直交領域探索

楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながりMITSUNARI Shigeo
 
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Inc.
 
At coder regular contest 013 解説
At coder regular contest 013 解説At coder regular contest 013 解説
At coder regular contest 013 解説光喜 濱屋
 
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)Kensuke Otsuki
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説AtCoder Inc.
 
ニューラル論文を読む前に
ニューラル論文を読む前にニューラル論文を読む前に
ニューラル論文を読む前にHayahide Yamagishi
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかMasami Yabushita
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Inc.
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版Masami Yabushita
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章Hiroki Mizukami
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説AtCoder Inc.
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説AtCoder Inc.
 
130323 slide all
130323 slide all130323 slide all
130323 slide allikea0064
 
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical SearchWSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Searchsleepy_yoshi
 
AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Inc.
 
はじめてのパターン認識 第1章
はじめてのパターン認識 第1章はじめてのパターン認識 第1章
はじめてのパターン認識 第1章Prunus 1350
 

Similar to 直交領域探索 (20)

楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
 
AtCoder Regular Contest 017
AtCoder Regular Contest 017AtCoder Regular Contest 017
AtCoder Regular Contest 017
 
凸包
凸包凸包
凸包
 
At coder regular contest 013 解説
At coder regular contest 013 解説At coder regular contest 013 解説
At coder regular contest 013 解説
 
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
 
WUPC2012
WUPC2012WUPC2012
WUPC2012
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説CODE THANKS FESTIVAL 2014 A日程 解説
CODE THANKS FESTIVAL 2014 A日程 解説
 
ニューラル論文を読む前に
ニューラル論文を読む前にニューラル論文を読む前に
ニューラル論文を読む前に
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
 
AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説AtCoder Beginner Contest 035 解説
AtCoder Beginner Contest 035 解説
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
 
自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章自然言語処理のための機械学習入門1章
自然言語処理のための機械学習入門1章
 
CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説CODE FESTIVAL 2015 沖縄ツアー 解説
CODE FESTIVAL 2015 沖縄ツアー 解説
 
Naivebayes
NaivebayesNaivebayes
Naivebayes
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
130323 slide all
130323 slide all130323 slide all
130323 slide all
 
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical SearchWSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
WSDM2012読み会: Learning to Rank with Multi-Aspect Relevance for Vertical Search
 
AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説AtCoder Regular Contest 027 解説
AtCoder Regular Contest 027 解説
 
はじめてのパターン認識 第1章
はじめてのパターン認識 第1章はじめてのパターン認識 第1章
はじめてのパターン認識 第1章
 

More from okuraofvegetable

More from okuraofvegetable (9)

Monadic second-order logic
Monadic second-order logicMonadic second-order logic
Monadic second-order logic
 
パタヘネゼミ 第6章
パタヘネゼミ 第6章パタヘネゼミ 第6章
パタヘネゼミ 第6章
 
パタヘネゼミ 第2回
パタヘネゼミ 第2回パタヘネゼミ 第2回
パタヘネゼミ 第2回
 
グレブナー基底
グレブナー基底グレブナー基底
グレブナー基底
 
NPCA summer 2014
NPCA summer 2014NPCA summer 2014
NPCA summer 2014
 
JOI summer seminar 2014
JOI summer seminar 2014JOI summer seminar 2014
JOI summer seminar 2014
 
Lecture2
Lecture2Lecture2
Lecture2
 
LT
LTLT
LT
 
Wrapping potato chips is fun
Wrapping potato chips is funWrapping potato chips is fun
Wrapping potato chips is fun
 

直交領域探索