# 为什么要用

因为如类似于最小生成树这样的问题,当量级上去了,时间复杂度也会以非常夸张的形式提升,所以有些时候,我们宁可牺牲一点选择近似的方式,但是时间复杂度会快非常多

# 两种近似方法

# 启发式

启发式方法在实际中很好用,比如用 AI、贪心、局部优化等等。但问题是 —— 你无法证明这个方法一定能给出好结果,有时候甚至什么都算不出来

# 近似算法

而我们要讲的,是有保证的近似算法。这些算法有一个好处 —— 无论多难的题,它至少不会比最好的答案差太多,比如最多差 2 倍。
但同时 如果我们只能证明他最多差 100 倍,那么这也就说明可能存在差 100 倍的情况。不过大多数情况下并不会差太多。

# δ- 近似算法

# k-center clustering (重心聚类) 问题

Gonzalez 算法:
这个算法以一个城市为例,我们每次选择的重心都是以目前最远的点为中心,所以理论上这样肯定可以包含两个点之间的所有点。
然后可以分为两种情况讨论。
1. 如果最优圆恰好包含某个中心点。
那么这样就好解决了,因为如果这个最优圆包含了中心点的话,那么说明只要以我们选中的这个中心点为圆心,并以最优圆两倍半径为半径的话,肯定可以包含所有的点。这就说明我们可以以两倍成本包含所有点。

2. 如果最优圆没有包含任何中心点。
那么这就是另一种情况了,说明那一部分点到中心点太远了以至于无法包含进去,但是既然我们画的中心点也会包含所有的点,那么说明这一部分点一定是被两个中心点所构成的圆所包含了。即被夹住了。那么我们以这两个中心点的最优半径两倍大小的圆,一定可以直接包含这两个中心点,那么也解决了问题。所以也可以以两倍成本包含所有点。

# WSPD

接下来用到一个工具,用来解决这一类问题

WSPD 是一个用来处理 “所有点对之间关系” 的聪明方法。
如果你有 nn 个点,要比较所有的点对,总共有 n(n1)/2n(n-1)/2 对,太多了!
WSPD 满足一个条件,即
AABB 是两个点集:

  • 包住 AABB 的球半径为 rr
  • 两个球之间的最近距离 sr\geq s \cdot r,即远远分开。
  • 这称为分的很好
    WSPD 还满足两个性质
  1. 对于任意 p,p′∈A
    pp2spq|pp'| \leq \frac{2}{s} \cdot |pq|
    其中 q∈B
  2. 对于任意 p∈A,q∈B
    pq(1+4s)pq|p'q'| \leq \left(1 + \frac{4}{s} \right) \cdot |pq|

这两点都很好理解,这两个数值都是在极端情况下的距离比例,因此其他情况的比例都会小于这两个值

接下来我们来解决一些问题

# 最近点对问题(Closest Pair)

我们可以假设,我们仅仅需要考虑最近点对存在于由单一点组成的集合 A 和另一个单一点 B 组成的集合。
为什么?我们可以来证明
#TODO 我不清楚为什么这么证明
由于 WSPD 的性质,如果我们选择的点对不是单个点组成的,那么根据性质
pp2spq|pp'| \leq \frac{2}{s} \cdot |pq|
就可以得到 pp' < pq
这显然不合理,所以我们需要选择单个点对

# “直径(Diameter)” 问题

这个同样可以用性质来解决
这个问题允许我们拥有一定的误差 1−ε
我们可以挑选 A,B 中的随意两个点 p,q
算法步骤:

  1. 初始化 diam:=0

  2. 构造 P 的 WSPD,使用 s = \frac{4(1 - \varepsilon)}

  3. 对于 WSPD 中每一对 (Ai,Bi)(A_i, B_i)(Ai​,Bi​):

    • 随便从 Ai 里选一个点 p,从 Bi​ 里选一个点 q

    • 更新 diam:=max(diam,pq)\text{diam} := \max(\text{diam}, |pq|)

  4. 返回 diam

还记得之前讲的 WSPD 性质 2 吗?

pq(1+4s)pq|p′q′| \leq (1 + \frac{4}{s}) \cdot |pq| 反过来就有
pq11+4spq|p′q′| \geq \frac{1}{1 + \frac{4}{s}} \cdot |pq|
如果我们把 s=4(1ε)εs = \frac{4(1 - \varepsilon)}{\varepsilon} 带入,就能推导出:
pq(1ε)pq|p′q′| \geq (1 - \varepsilon) \cdot |pq|

# t-spanner