SlideShare a Scribd company logo
1 of 40
凸包
平木 康傑
114514
次元凸包を紹介します!
• テキスト見本
2
2
次元凸包を紹介します!
• テキスト見本
3
3
次元凸包を求めるアルゴリズム
•
2
方法 計算量
愚直 (Naive) 𝑂(𝑁3)
包装法 (Gift wrapping) 𝑂(𝑛 × 辺の数)
Graham Scan / Andrew's Monotone Chain 𝑂(𝑛 log 𝑛)
逐次構成法 (Incremental) 𝑂(𝑛 log 𝑛)
分割統治法 (Divide&Conquer) 𝑂(𝑛 log 𝑛)
4
次元凸包を求めるアルゴリズム
•
3
方法 計算量
愚直 (Naive) 𝑂(𝑁4)
包装法 (Gift wrapping) 𝑂(𝑛 × 面の数)
Graham Scan / Andrew's Monotone Chain -
逐次構成法 (Incremental) 気になる
分割統治法 (Divide&Conquer) 気になる
5
逐次構築法 (Incremental)
• 10 分に収まらないので省略します
• あとでアップロードしとくので
6
逐次構築法 (Incremental)
• まず同一平面上にない 4 点をとってくる
• とれなかったら全点が同一平面上なので実質 2 次元凸包
• 残りの点をランダムな順に付け加えていく(つまり乱択)
•
7
逐次構築法 (Incremental)
• 凸包 𝐶 に点 𝑣 を付け加えて新たな凸包 𝐶′ にすることを考える
• 𝑣 が 𝐶 の内部にあったら何もしなくてよい.以下,𝑣 は 𝐶 の外部とする
• 𝑣 の位置から 𝐶 を見たとき,見える面と見えない面に分けられる
•
•
8
逐次構築法 (Incremental)
• 凸包 𝐶 に点 𝑣 を付け加えて新たな凸包 𝐶′ にすることを考える
• 𝑣 が 𝐶 の内部にあったら何もしなくてよい.以下,𝑣 は 𝐶 の外部とする
• 𝑣 の位置から 𝐶 を見たとき,見える面と見えない面に分けられる
• 𝐶 の辺から成る,可視領域を囲む閉曲線のことを 地平面(horizon) と呼ぶ
• 見える面を全て消し,地平面の各点と 𝑣 を結ぶ
9
逐次構築法 (Incremental)
• 愚直に書くと 𝑂 𝑁2
• 工夫すると平均計算量が落ちる
10
逐次構築法 (Incremental)
• 「いまある面」と「これから追加する点」をそれぞれ頂点として
左右においた2部グラフを考える
• お互いに見える面と点の間に辺を張る
• この2部グラフを 衝突グラフ(conflict graph) と呼ぶ
• これは,辺で結ばれた面と点に関して,
最終的な凸包に両方とも含まれることが無いことからいう
11
逐次構築法 (Incremental)
• 衝突グラフの初期化は簡単 (4つの面に対して愚直にやる)
• 点 𝑣 を追加するときの更新を考えよう
• まず,追加した点 𝑣 と消した面を衝突グラフから消し去る
• 追加した面を衝突グラフに加え,各面について,その面が見える点との
間に辺を張る
• これ以外の面に変化はない
• 下線部の操作をどうするか?
12
追加した面が見える点を列挙する
• 面 𝑓 を追加したとする
• 既にある面と同一平面上にあって統合される場合は,
見える点のリストが変化することはないので無視できる
• 統合されない場合,その面が接している地平線の 1 辺 𝑒 に注目する
13
追加した面が見える点を列挙する
• その面が接している地平線の 1 辺 𝑒 に注目する
• 𝑓 が見える点からは,少なくとも辺 𝑒 が見えるはず
• ここで,
• 面 𝑓 を追加する直前にも辺 𝑒 はあった
• 辺 𝑒 が見える条件 = その辺を持つ 2 つの面の少なくとも片方が見える
• ということから,辺 𝑒 を持っていた 2 つの面の衝突リストの点だけ
調べればよいとわかる
14
計算量
• この工夫によって,平均計算量が 𝑂(𝑁 log 𝑁) に落ちる
• ただし最悪計算量は 𝑂(𝑁3
)
• 証明は難しいし時間もかかるので省略
15
方法 計算量
愚直 (Naive) 𝑂(𝑁4)
包装法 (Gift wrapping) 𝑂(𝑛 × 面の数)
Graham Scan / Andrew's Monotone Chain -
逐次構成法 (Incremental) 平均𝑂(𝑁 log 𝑁)
分割統治法 (Divide&Conquer) 気になる
分割統治法 (Divide&Conquer)
• みなさんご存じ分割統治法
• 2 次元でも 3 次元でも使えます
16
17
話の流れ
• merge の仕方
• merge の計算量
• ちょっとした工夫
• 辺の数を抑える
分割統治法 (Divide&Conquer)
• 𝑁 ≤ 7 のときは分けてもしょうがないので愚直にやる
• 𝑁 ≥ 8 のとき,𝑥 座標の小さい方と大きい方で半々で分割し,
再帰的に作ってからそれを merge する
18
How to merge?
• 𝐿 と 𝑅 の間に辺をつける
• それらの辺によって面ができるが,
それに包まれて不要になった点を消し去る
19
How to merge? (もっと詳しく)
• 凸包の 1 辺を見つける(一応簡単にできる)
• そこからギフト包装法の要領で,AB->CB->CD->ED->FD->FG->…->AB と
辺を追加する(ここがキモ)
• 消さない点と消す点は地平面できれいに二分されるので,
不要になった点の消去は簡単にできる
20
包装のしかた
• 直前に追加した辺を 𝑎 − 𝑏 とする
• 明らかに,点 𝑎 か点 𝑏 と隣接している点のうちから選ぶのがよい
• 直感的には「角度」の最も大きな点を選ぶのがよい
• 適切に「角度」を設定することで実際にそのようにできる
21
包装のしかた
• 直前に追加した辺を 𝑎 − 𝑏 とする
• 明らかに,点 𝑎 か点 𝑏 と隣接している点のうちから選ぶのがよい
• 直感的には「角度」の最も大きな点を選ぶのがよい
• 適切に「角度」を設定することで実際にそのようにできる
• 愚直に全て試すと 𝑂(𝑁2
) だが,
工夫によって落ちる
22
23
包装の工夫
• 𝐿 側の点 𝑣 𝐿 と結ばれた場合,愚直だと 𝑅 側の点をもう 1 周
調べることになるが,これは無駄そう
• 前の辺からはじめて反時計回りに見ていき,
「角度」が最大になった時点でその辺を選ぶ
• ここで飛ばした辺は,以後凸包の内部に含まれてしまう
• したがって,すべての辺は高々定数回しか
調べる必要が無い
24
マージの計算量
• よって merge の計算量は 𝑂(𝑉 + 𝐸)
•
25
Steinitz の定理
• ところで,以下が成り立ちます
• ある単純で連結な無向グラフが,凸多面体のスケルトングラフたりえる
必要十分条件は,「3 連結な平面的グラフ」であること
•
26
Steinitz の定理
• ところで,以下が成り立ちます
• ある単純で連結な無向グラフが,凸多面体のスケルトングラフたりえる
必要十分条件は,「3 連結な平面的グラフ」であること
• したがって,凸包のグラフは平面的です
• (Wikipedia に証明が書いてます)
27
Steinitz の定理
• ところで,以下が成り立ちます
• ある単純で連結な無向グラフが,凸多面体のスケルトングラフたりえる
必要十分条件は,「3 連結な平面的グラフ」であること
• したがって,凸包のグラフは平面的です
• 余談ですが,グラフが 3 連結かも平面的かも DFS と同じ計算量で判定できる
• つまり 𝑂(𝑉 + 𝐸)
• 3 連結かの判定: 下とは別の,Hopcroft と Tarjan の論文
• 平面的かの判定: Hopcroft-Tarjan のアルゴリズム
28
Euler の定理
• ついでに,以下が成り立ちます
• 平面的グラフを交差しないよう平面に埋め込んだとき,
(頂点数) − 辺の数 + 面の数 = 2
が成り立つ
• 証明は昨年のスライドを参照
29
つまり
• 凸多面体について,
(頂点数) − 辺の数 + 面の数 = 2
が成り立つ
• まあわざわざ先の 2 つを組み合わせなくても
Euler の多面体定理で一発なんですけどね,初見さん
30
つまり
• 凸多面体について,
(頂点数) − 辺の数 + 面の数 = 2
が成り立つ
• 全ての面は 3 角形であるとしてよい
• 厳密に凸ではなくなるが,多角形を分割しても上の式に影響はない
• このとき 面の数 =
2
3
(辺の数)
• 上の 2 式から 辺の数 = 3 頂点数 − 6 = 𝑂(頂点数) がわかる
31
マージの計算量
• さっき merge の計算量は 𝑂 𝑉 + 𝐸 と言ったが,𝐸 = 𝑂(𝑉) なので
結局 𝑂(𝑉) となり,実家のような安心感を得る
32
実装?
• ここで紹介した分割統治法は,3 次元凸包を 𝑂(𝑁 log 𝑁) で求める最初の手法
• Preparata と Hong によって 1977 年に提案された
• お察しの通り実装が重い
• 2003 年になってより実装量の少ない(100 行ほど)手法が現れた
• 提案者 Timothy M. Chan の論文の末尾に実際の実装がなされている 超短い
• A Minimalist’s Implementation of the 3-d Divide-and-Conquer Convex Hull Algorithm
33
より高次元の凸包?
• 2, 3 次元の凸包は(出力に依存しないとき) 𝑂(𝑁 log 𝑁) で最適
← 2 次元の東方
次元が増えても
𝑂(𝑁 log 𝑁) 時間で
できないかな?
34
より高次元の凸包?
• 2, 3 次元の凸包は(出力に依存しないとき) 𝑂(𝑁 log 𝑁) で最適
• できない
次元が増えても
𝑂(𝑁 log 𝑁) 時間で
できないかな?
35
より高次元の凸包
• 𝑑 次元 (𝑑 ≤ 4) の凸包を求めるアルゴリズムの計算量は
Θ 𝑉
𝑑
2
が最適とわかっている
36
より高次元の凸包
• 𝑑 次元 (𝑑 ≤ 4) の凸包を求めるアルゴリズムの計算量は
Θ 𝑉
𝑑
2
が最適とわかっている
• (Voronoi 図についてもなんかあった気がする)
37
まとめ
• 分割統治はあなたの後ろにいます
38
参考文献
• 4人ぐらい, “Computational Geometry: Algorithms and Applications 第2版”, 2008
• 杉原厚吉, “計算幾何工学”, 1994
• F. P. Preparata & S. J. Hong, “Convex Hulls of Finite Sets of Points in Two and Three
Dimensions”, 1977
39
参考文献
• J. E. Hopcroft & R. E. Tarjan, “Dividing a Graph into Triconnected Components”, 1973
• 同上, “Efficient planarity testing”, 1974
• Timothy M. Chan, “A Minimalist’s Implementation of the 3-d Divide-and-Conquer
Convex Hull Algorithm”, 2003
• Bernard Chazelle, “An Optimal Convex Hull Algorithm in Any Fixed Dimension”, 1993
40
画像出典
• いらすとや
• p.2 車,p.9,11 ずんだもち,p.11 ビーム,p.25-27 パイナップル,p25-27 ペン,p-28 ペン
• Wikipedia
• p.16 とんかつ
• square1001 の AtCoder プロフィール
• p.28 二つのりんご
• dairi さん
• p.33 チルノ

More Related Content

What's hot

指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
 
「統計的学習理論」第1章
「統計的学習理論」第1章「統計的学習理論」第1章
「統計的学習理論」第1章Kota Matsui
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Inc.
 
Faster matroid intersection
Faster matroid intersectionFaster matroid intersection
Faster matroid intersectionga sin
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方Tsuneo Yoshioka
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Inc.
 
MLP輪読会 バンディット問題の理論とアルゴリズム 第3章
MLP輪読会 バンディット問題の理論とアルゴリズム 第3章MLP輪読会 バンディット問題の理論とアルゴリズム 第3章
MLP輪読会 バンディット問題の理論とアルゴリズム 第3章takashi usami
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Inc.
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
AutoEncoderで特徴抽出
AutoEncoderで特徴抽出AutoEncoderで特徴抽出
AutoEncoderで特徴抽出Kai Sasaki
 
パターン認識と機械学習入門
パターン認識と機械学習入門パターン認識と機械学習入門
パターン認識と機械学習入門Momoko Hayamizu
 
競技プログラミングでの線型方程式系
競技プログラミングでの線型方程式系競技プログラミングでの線型方程式系
競技プログラミングでの線型方程式系tmaehara
 
DLLab 異常検知ナイト 資料 20180214
DLLab 異常検知ナイト 資料 20180214DLLab 異常検知ナイト 資料 20180214
DLLab 異常検知ナイト 資料 20180214Kosuke Nakago
 

What's hot (20)

指数時間アルゴリズム入門
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
「統計的学習理論」第1章
「統計的学習理論」第1章「統計的学習理論」第1章
「統計的学習理論」第1章
 
直交領域探索
直交領域探索直交領域探索
直交領域探索
 
abc032
abc032abc032
abc032
 
AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説AtCoder Beginner Contest 012 解説
AtCoder Beginner Contest 012 解説
 
Faster matroid intersection
Faster matroid intersectionFaster matroid intersection
Faster matroid intersection
 
2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方2SAT(充足可能性問題)の解き方
2SAT(充足可能性問題)の解き方
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説AtCoder Regular Contest 033 解説
AtCoder Regular Contest 033 解説
 
MLP輪読会 バンディット問題の理論とアルゴリズム 第3章
MLP輪読会 バンディット問題の理論とアルゴリズム 第3章MLP輪読会 バンディット問題の理論とアルゴリズム 第3章
MLP輪読会 バンディット問題の理論とアルゴリズム 第3章
 
AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
 
Convex Hull Trick
Convex Hull TrickConvex Hull Trick
Convex Hull Trick
 
ドロネー三角形分割
ドロネー三角形分割ドロネー三角形分割
ドロネー三角形分割
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
AutoEncoderで特徴抽出
AutoEncoderで特徴抽出AutoEncoderで特徴抽出
AutoEncoderで特徴抽出
 
パターン認識と機械学習入門
パターン認識と機械学習入門パターン認識と機械学習入門
パターン認識と機械学習入門
 
競技プログラミングでの線型方程式系
競技プログラミングでの線型方程式系競技プログラミングでの線型方程式系
競技プログラミングでの線型方程式系
 
DLLab 異常検知ナイト 資料 20180214
DLLab 異常検知ナイト 資料 20180214DLLab 異常検知ナイト 資料 20180214
DLLab 異常検知ナイト 資料 20180214
 

Similar to 凸包

キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達Kumazaki Hiroki
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながりMITSUNARI Shigeo
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかMasami Yabushita
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版Masami Yabushita
 
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -MITSUNARI Shigeo
 
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)Kensuke Otsuki
 
20190725 taguchi decision_tree_for_pubshare
20190725 taguchi decision_tree_for_pubshare20190725 taguchi decision_tree_for_pubshare
20190725 taguchi decision_tree_for_pubsharetaguchi naoya
 
RBM、Deep Learningと学習(全脳アーキテクチャ若手の会 第3回DL勉強会発表資料)
RBM、Deep Learningと学習(全脳アーキテクチャ若手の会 第3回DL勉強会発表資料)RBM、Deep Learningと学習(全脳アーキテクチャ若手の会 第3回DL勉強会発表資料)
RBM、Deep Learningと学習(全脳アーキテクチャ若手の会 第3回DL勉強会発表資料)Takuma Yagi
 
コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用
コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用
コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用mosa siru
 
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)Ohsawa Goodfellow
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズムTakuya Akiba
 

Similar to 凸包 (12)

キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達キャッシュコヒーレントに囚われない並列カウンタ達
キャッシュコヒーレントに囚われない並列カウンタ達
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
 
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -
 
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
 
20190725 taguchi decision_tree_for_pubshare
20190725 taguchi decision_tree_for_pubshare20190725 taguchi decision_tree_for_pubshare
20190725 taguchi decision_tree_for_pubshare
 
RBM、Deep Learningと学習(全脳アーキテクチャ若手の会 第3回DL勉強会発表資料)
RBM、Deep Learningと学習(全脳アーキテクチャ若手の会 第3回DL勉強会発表資料)RBM、Deep Learningと学習(全脳アーキテクチャ若手の会 第3回DL勉強会発表資料)
RBM、Deep Learningと学習(全脳アーキテクチャ若手の会 第3回DL勉強会発表資料)
 
コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用
コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用
コミュニティ分類アルゴリズムの高速化とソーシャルグラフへの応用
 
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム
 

凸包