凸包4. 次元凸包を求めるアルゴリズム
•
2
方法 計算量
愚直 (Naive) 𝑂(𝑁3)
包装法 (Gift wrapping) 𝑂(𝑛 × 辺の数)
Graham Scan / Andrew's Monotone Chain 𝑂(𝑛 log 𝑛)
逐次構成法 (Incremental) 𝑂(𝑛 log 𝑛)
分割統治法 (Divide&Conquer) 𝑂(𝑛 log 𝑛)
4
8. 逐次構築法 (Incremental)
• 凸包 𝐶 に点 𝑣 を付け加えて新たな凸包 𝐶′ にすることを考える
• 𝑣 が 𝐶 の内部にあったら何もしなくてよい.以下,𝑣 は 𝐶 の外部とする
• 𝑣 の位置から 𝐶 を見たとき,見える面と見えない面に分けられる
•
•
8
9. 逐次構築法 (Incremental)
• 凸包 𝐶 に点 𝑣 を付け加えて新たな凸包 𝐶′ にすることを考える
• 𝑣 が 𝐶 の内部にあったら何もしなくてよい.以下,𝑣 は 𝐶 の外部とする
• 𝑣 の位置から 𝐶 を見たとき,見える面と見えない面に分けられる
• 𝐶 の辺から成る,可視領域を囲む閉曲線のことを 地平面(horizon) と呼ぶ
• 見える面を全て消し,地平面の各点と 𝑣 を結ぶ
9
12. 逐次構築法 (Incremental)
• 衝突グラフの初期化は簡単 (4つの面に対して愚直にやる)
• 点 𝑣 を追加するときの更新を考えよう
• まず,追加した点 𝑣 と消した面を衝突グラフから消し去る
• 追加した面を衝突グラフに加え,各面について,その面が見える点との
間に辺を張る
• これ以外の面に変化はない
• 下線部の操作をどうするか?
12
13. 追加した面が見える点を列挙する
• 面 𝑓 を追加したとする
• 既にある面と同一平面上にあって統合される場合は,
見える点のリストが変化することはないので無視できる
• 統合されない場合,その面が接している地平線の 1 辺 𝑒 に注目する
13
14. 追加した面が見える点を列挙する
• その面が接している地平線の 1 辺 𝑒 に注目する
• 𝑓 が見える点からは,少なくとも辺 𝑒 が見えるはず
• ここで,
• 面 𝑓 を追加する直前にも辺 𝑒 はあった
• 辺 𝑒 が見える条件 = その辺を持つ 2 つの面の少なくとも片方が見える
• ということから,辺 𝑒 を持っていた 2 つの面の衝突リストの点だけ
調べればよいとわかる
14
15. 計算量
• この工夫によって,平均計算量が 𝑂(𝑁 log 𝑁) に落ちる
• ただし最悪計算量は 𝑂(𝑁3
)
• 証明は難しいし時間もかかるので省略
15
方法 計算量
愚直 (Naive) 𝑂(𝑁4)
包装法 (Gift wrapping) 𝑂(𝑛 × 面の数)
Graham Scan / Andrew's Monotone Chain -
逐次構成法 (Incremental) 平均𝑂(𝑁 log 𝑁)
分割統治法 (Divide&Conquer) 気になる
19. How to merge?
• 𝐿 と 𝑅 の間に辺をつける
• それらの辺によって面ができるが,
それに包まれて不要になった点を消し去る
19
20. How to merge? (もっと詳しく)
• 凸包の 1 辺を見つける(一応簡単にできる)
• そこからギフト包装法の要領で,AB->CB->CD->ED->FD->FG->…->AB と
辺を追加する(ここがキモ)
• 消さない点と消す点は地平面できれいに二分されるので,
不要になった点の消去は簡単にできる
20
21. 包装のしかた
• 直前に追加した辺を 𝑎 − 𝑏 とする
• 明らかに,点 𝑎 か点 𝑏 と隣接している点のうちから選ぶのがよい
• 直感的には「角度」の最も大きな点を選ぶのがよい
• 適切に「角度」を設定することで実際にそのようにできる
21
22. 包装のしかた
• 直前に追加した辺を 𝑎 − 𝑏 とする
• 明らかに,点 𝑎 か点 𝑏 と隣接している点のうちから選ぶのがよい
• 直感的には「角度」の最も大きな点を選ぶのがよい
• 適切に「角度」を設定することで実際にそのようにできる
• 愚直に全て試すと 𝑂(𝑁2
) だが,
工夫によって落ちる
22
23. 23
包装の工夫
• 𝐿 側の点 𝑣 𝐿 と結ばれた場合,愚直だと 𝑅 側の点をもう 1 周
調べることになるが,これは無駄そう
• 前の辺からはじめて反時計回りに見ていき,
「角度」が最大になった時点でその辺を選ぶ
• ここで飛ばした辺は,以後凸包の内部に含まれてしまう
• したがって,すべての辺は高々定数回しか
調べる必要が無い
27. 27
Steinitz の定理
• ところで,以下が成り立ちます
• ある単純で連結な無向グラフが,凸多面体のスケルトングラフたりえる
必要十分条件は,「3 連結な平面的グラフ」であること
• したがって,凸包のグラフは平面的です
• 余談ですが,グラフが 3 連結かも平面的かも DFS と同じ計算量で判定できる
• つまり 𝑂(𝑉 + 𝐸)
• 3 連結かの判定: 下とは別の,Hopcroft と Tarjan の論文
• 平面的かの判定: Hopcroft-Tarjan のアルゴリズム
30. 30
つまり
• 凸多面体について,
(頂点数) − 辺の数 + 面の数 = 2
が成り立つ
• 全ての面は 3 角形であるとしてよい
• 厳密に凸ではなくなるが,多角形を分割しても上の式に影響はない
• このとき 面の数 =
2
3
(辺の数)
• 上の 2 式から 辺の数 = 3 頂点数 − 6 = 𝑂(頂点数) がわかる
32. 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. 33
より高次元の凸包?
• 2, 3 次元の凸包は(出力に依存しないとき) 𝑂(𝑁 log 𝑁) で最適
← 2 次元の東方
次元が増えても
𝑂(𝑁 log 𝑁) 時間で
できないかな?
34. 34
より高次元の凸包?
• 2, 3 次元の凸包は(出力に依存しないとき) 𝑂(𝑁 log 𝑁) で最適
• できない
次元が増えても
𝑂(𝑁 log 𝑁) 時間で
できないかな?
36. 36
より高次元の凸包
• 𝑑 次元 (𝑑 ≤ 4) の凸包を求めるアルゴリズムの計算量は
Θ 𝑉
𝑑
2
が最適とわかっている
• (Voronoi 図についてもなんかあった気がする)
38. 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. 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. 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 チルノ