# 为什么要用
因为如类似于最小生成树这样的问题,当量级上去了,时间复杂度也会以非常夸张的形式提升,所以有些时候,我们宁可牺牲一点选择近似的方式,但是时间复杂度会快非常多
# 两种近似方法
# 启发式
启发式方法在实际中很好用,比如用 AI、贪心、局部优化等等。但问题是 —— 你无法证明这个方法一定能给出好结果,有时候甚至什么都算不出来
# 近似算法
而我们要讲的,是有保证的近似算法。这些算法有一个好处 —— 无论多难的题,它至少不会比最好的答案差太多,比如最多差 2 倍。
但同时 如果我们只能证明他最多差 100 倍,那么这也就说明可能存在差 100 倍的情况。不过大多数情况下并不会差太多。
# δ- 近似算法
# k-center clustering (重心聚类) 问题
Gonzalez 算法:
这个算法以一个城市为例,我们每次选择的重心都是以目前最远的点为中心,所以理论上这样肯定可以包含两个点之间的所有点。
然后可以分为两种情况讨论。
1. 如果最优圆恰好包含某个中心点。
那么这样就好解决了,因为如果这个最优圆包含了中心点的话,那么说明只要以我们选中的这个中心点为圆心,并以最优圆两倍半径为半径的话,肯定可以包含所有的点。这就说明我们可以以两倍成本包含所有点。
2. 如果最优圆没有包含任何中心点。
那么这就是另一种情况了,说明那一部分点到中心点太远了以至于无法包含进去,但是既然我们画的中心点也会包含所有的点,那么说明这一部分点一定是被两个中心点所构成的圆所包含了。即被夹住了。那么我们以这两个中心点的最优半径两倍大小的圆,一定可以直接包含这两个中心点,那么也解决了问题。所以也可以以两倍成本包含所有点。
# WSPD
接下来用到一个工具,用来解决这一类问题
WSPD 是一个用来处理 “所有点对之间关系” 的聪明方法。
如果你有 个点,要比较所有的点对,总共有 对,太多了!
WSPD 满足一个条件,即
设 和 是两个点集:
- 包住 和 的球半径为 ;
- 两个球之间的最近距离 ,即远远分开。
- 这称为分的很好
WSPD 还满足两个性质
- 对于任意 p,p′∈A
其中 q∈B - 对于任意 p∈A,q∈B
这两点都很好理解,这两个数值都是在极端情况下的距离比例,因此其他情况的比例都会小于这两个值
接下来我们来解决一些问题
# 最近点对问题(Closest Pair)
我们可以假设,我们仅仅需要考虑最近点对存在于由单一点组成的集合 A 和另一个单一点 B 组成的集合。
为什么?我们可以来证明
#TODO 我不清楚为什么这么证明
由于 WSPD 的性质,如果我们选择的点对不是单个点组成的,那么根据性质
就可以得到 pp' < pq
这显然不合理,所以我们需要选择单个点对
# “直径(Diameter)” 问题
这个同样可以用性质来解决
这个问题允许我们拥有一定的误差 1−ε
我们可以挑选 A,B 中的随意两个点 p,q
算法步骤:
初始化 diam:=0
构造 P 的 WSPD,使用 s = \frac{4(1 - \varepsilon)}
对于 WSPD 中每一对 (Ai,Bi)(A_i, B_i)(Ai,Bi):
随便从 Ai 里选一个点 p,从 Bi 里选一个点 q
更新
返回 diam
还记得之前讲的 WSPD 性质 2 吗?
反过来就有
如果我们把 带入,就能推导出: