Joeの精進記録

旧:競プロ練習記録

Randomized Algorithms for Computational Geometry

とりあえずいくつか面白い論文をみつけた

Randomized Incremental Construction of Delaunay and Voronoi Diagrams

Randomized Algorithms for Geometric Optimization Problems

An Introduction to Randomization in Computational Geometry

ひとつ読んだのでまとめる。

 O(n\log n) randomized algorithm for slope selection

問題

二次元平面上に n点ある。このうち2点を選んで直線を引く時、 1 \le k \le {}_nC_2番目に小さい傾きを求めよ。

双対問題

 (a, b)を直線 y = -ax + bに写し、直線 y = \alpha x + \beta (\alpha, \beta)に写す操作を考えると、問題は以下と等価になる。

2次元平面上の L本のnon-verticalな直線について、それらの交点のうち、 x座標が k番目に小さいものを求めよ。

f:id:xuzijian629:20191024143431p:plain

簡単のため、どの3直線も1点で交わらないとし、どの2直線同士も同じ x座標で交わらないとする。

考察

答えの x座標が (\alpha, \beta)区間に存在するとする。このとき、 y軸に平行な帯 (\alpha, \beta) \times \mathbb{R}を考え、 x = \alphaにおける直線の順序と x = \betaにおける直線の順序を考える。前者の順序を 1, 2, \ldots, nとし、後者を \pi(1), \pi(2), \ldots, \pi(n)とすると、 i\lt jかつ \pi(i) \gt \pi(j)のとき、またそのときに限り2直線は交わる。つまり区間内にいくつ交点があるかはこの順列の点灯数を求まることで決まる。

これを何度か繰り返して区間を狭めていくことができるが、乱択と組み合わせるともうすこし賢くできるらしい。