0%

计算几何(九)

杂项

皮克定理

顶点坐标均是整点的简单多边形,其面积 $A$ 和内部格点数目 $i$ 和边上格点数目 $b$ 的关系为 $A=i+\frac{b}{2}-1$。

平面最近点对

问题描述:给出平面上 $n$ 个点,求距离最近的点对。

引理:如果平面上 $n$ 个点的最近点对距离为 $d$,那么将这 $n$ 个点放进 $d\times d$ 的网格中,每个网格中的点数不超过 4。

法一:经典分治算法

  • 分:画一条垂直的线将点集均分为左右两个子集。
  • 治:分别求出左右两个子集的最近点对。
  • 合:求出跨越分界线的最近点对,与子问题的最近点对比较取最优。

令两个子问题中的最近点对距离为 $d$。

找出所有离分界线距离 $d$ 以内的所有点,并按纵坐标(y) 坐标排序。

对每个范围内的点,遍历与其纵坐标(y)之差 d 以内的所有点,更新最近点对。

根据引理,此范围内的点能更新的最近点对是常数级别的。

时间复杂度:$O(n\log n)$

法二:扫描线

对所有点按横坐标(x)排序,从左到右扫描,记录当前的最近点对距离 $d$。

对于一个新的点,遍历之前的点中所有与其横坐标(x)之差小于 d 且纵坐标(y)之差小于 d 的所有点,更新最近点对。

用一个 multiset 存放与新点横坐标(x)之差小于 d 的点,内部按纵坐标(y)排序。

使用队列按 x 坐标顺序入队各点,当队首与新点横坐标(x)之差大于 d 时出队,并且将其从 multiset 中移除。

在 multiset 中二分找到纵坐标(y)之差小于 d 的分界点。

时间复杂度:$O(n\log n)$

法三:随机化算法

令前 $i-1$ 个点的最近点对距离为 $d$,作 $d\times d$ 的网格图,使用哈希表记录每个格子内有哪些点。

对第 $i$ 个点,找到其所在的格子,并找到以此格子为中心的九宫格内的所有点,更新最近点对。

如果最近点对被更新,以新的最近点对距离 $d’$ 重构网格图。

若点的顺序为随机打乱的。那么期望时间复杂度为 $O(n)$。

最小圆覆盖

问题描述:给定平面上 $n$ 个点,求一个半径最小的圆,能覆盖所有的点。

引理:过三个不共线的点可以唯一确定一个圆。

定理:如果点 $p$ 不在点集 S 的最小圆覆盖圆内,那么它一定在 $\lbrace p\rbrace\bigcup S$ 的最小覆盖圆上,即最小覆盖圆一定经过点 $p$。

算法:

1
2
3
4
5
6
7
8
最小圆覆盖(点集 p,边界点集 R)
如果 P 为空 或 |R|==3
返回 R 确定的圆
p = P 中随机选一点
D = 最小圆覆盖(P-{p},R)
如果 p 不在 D 中
D = 最小圆覆盖(P-{p},R ∪ {p})
返回 D

时间复杂度:$O(n)$