# 1. 为什么需要逼近算法?

# 1.1 计算难度:NP-Hard

  • 很多现实中的优化问题都是 NP-hard,即没有已知的多项式时间算法。
  • 例如:Euclidean TSP(旅行商问题)、Quadratic Assignment(二次指派问题)等。
  • 这些问题只能在小规模实例上通过精确算法解决。

# 1.2 运算成本高

  • 即使问题不是 NP-hard,在高维空间或大规模数据下,精确算法也往往太慢。
  • 举例:
    • 2D 最小生成树:O(nlogn)O(n \log n)
    • 高维 kkD 最小生成树:O(n2)O(n^2)
    • 使用逼近算法可将其降至 O(nlogn)O(n \log n)

# 2. 示例:欧几里得旅行商问题(Euclidean TSP)

# 2.1 问题描述

  • 输入:一组点,目标是构造一条闭合路径经过每个点一次,总长度最小。
  • 此问题已被证明为 NP-hard [Papadimitrou’77]

# 2.2 常见逼近方法

方法近似比思路说明
MST 翻倍法22最小生成树边翻倍成回路
Christofides 算法1.51.5基于 MST 和最小匹配
(1+ε)(1+\varepsilon)- 近似近似最优Arora 和 Mitchell 提出,复杂度 nlogO(1/ε)nn \log^{O(1/\varepsilon)} n

# 2.3 实际求解进展

  • 2006 年:成功解出含 85,900 城市的 TSP,耗费 136 年 CPU 时间
  • 2013 年:近似解出全球 1,904,711 城市的路径,误差约为 1.0474 倍

# 3. 示例:kk - 中心聚类(k-Center Clustering)

# 3.1 问题定义(更通俗地解释)

我们有一堆点(比如城市、传感器、顾客的位置),现在要从中选出 kk 个点当作 “中心”,并把所有点都分配给离它最近的那个中心。

目标是让最远的那个点,也就是 “离它最近中心最远的点”,距离尽可能短。

换句话说:

kk 个代表点,使得所有点都离它们最近的中心不会太远,最大距离最小。


📌 举个例子:

假设你要在城市中设 kk 个仓库,客户从最近的仓库取货。

你希望的是:

  • 所有客户离最近的仓库都不太远。
  • 特别是:最远的那个客户也不能太远

这就是典型的 kk - 中心问题


🔍 数学上定义为:

  • 给定点集 PP 和整数 kk
  • 选出点集 CPC \subseteq PC=k|C| = k
  • 最小化 maxpPmincCpc\max_{p \in P} \min_{c \in C} |p - c|

即:最大距离最小。


# 3.2 问题难度与逼近性

# 📌 为什么这个问题很难?

这个问题是经典的 NP-hard 问题,意思是:

没有已知的多项式时间算法可以总是找到最优解,尤其当点数 nn 很大时,就算有高性能电脑也搞不定。

具体地:

  • 早在 1979 年,Kariv 和 Hakimi 就证明了这个问题是 NP-hard。
  • 后来还有人证明了:
    • 除非 P = NP,不可能设计出比 2 倍更好的逼近算法
    • 也就是说,想做到 1.99 倍最优解都不可能(Hsu 和 Nemhauser, 1979)。

# ✅ 所以我们能做什么?

我们退而求其次,追求一个 “不错” 的结果,比如:

  • 距离最优解不超过两倍;
  • 算法很快,不需要爆炸时间。

幸运的是:

Gonzalez(1985)提出了一个简单又优雅的 2 - 逼近算法,叫做 Farthest-First Traversal


# 3.3 Farthest-First Traversal 算法(最远优先遍历)

# 🌟 核心思想:

这是一种非常直观的 “贪心” 策略:

每一步都挑 “最不满意的点” 作为新的中心。

换句话说,我们从一个点开始,然后每次挑那个离当前所有中心最远的点,直到选够 kk 个中心为止。


# 🧩 算法步骤:

  1. 随便选一个点,设为第一个中心 c1c_1
  2. 从剩下的点里找出一个:
    • 它到当前所有中心中最近的那个距离最大;
    • 把它作为下一个中心 c2c_2
  3. 重复上一步,直到选了 kk 个中心。

# 🧠 举个例子:

假设我们要选 3 个学校建在城市里:

  • 第一个学校随便选;
  • 第二个建在 “离第一个学校最远的居民区”;
  • 第三个建在 “离前两个学校最远的居民区”。

最终,选择的学校能很好地覆盖全城。


# ⏱️ 时间复杂度:

  • 每次找 “最远点” 要看所有点:O(n)O(n)
  • kk 次,总共是 O(kn)O(kn)

比穷举所有组合的 O(nk)O(n^k) 好太多!


# 3.4 正确性分析:为什么这是一个 2 - 逼近算法?

我们要说明:

无论输入点怎么分布,Farthest-First 算法得到的最大半径 2×\leq 2 \times 最优半径。


# ✅ 证明思路:

设:

  • 最优中心集合为 C={c1,c2,...,ck}C^* = \{c_1^*, c_2^*, ..., c_k^*\},最小半径为 rr^*
  • 我们算法选出的中心集合为 C={c1,c2,...,ck}C = \{c_1, c_2, ..., c_k\},最大半径为 rr
  • 目标是证明:r2rr \leq 2r^*

# 🧩 核心观察:

  1. 最优解把所有点分成 kk 个 “圆形区域”,半径不超过 rr^*
  2. 这些区域里,每个区域至少要包含一个我们选的中心,否则我们就漏选了一个重要的 “远点”。

# ✏️ 更具体的想法:

  • 如果某个最优簇 CiC_i^* 没有任何我们选的中心落进去,
    • 那么在我们选中心的时候,两个中心可能落在同一个簇里;
    • 根据最远优先策略,这两个中心间距离一定大于 rr^*
    • 这说明它们太远了,不应该在同一个最优簇里 ⇒ 矛盾!

# ✅ 推论:

因此,我们的 kk 个贪心中心最多比最优半径大两倍:

Radius(C)2Radius(C)\text{Radius}(C) \leq 2 \cdot \text{Radius}(C^*)


# 📌 总结:

  • 算法简单、运行快(O(kn)O(kn));
  • 有理论保证:不比最优解差超过两倍;
  • 在实际应用中效果也不错。

# 4. Well-Separated Pair Decomposition(WSPD)

# 4.1 什么是 WSPD?(直观理解)

WSPD 是一个用来处理 “所有点对之间关系” 的聪明方法。

如果你有 nn 个点,要比较所有的点对,总共有 n(n1)/2n(n-1)/2 对,太多了!

WSPD 把这些点对 “分组”,变成少量的、有代表性的点对集合,叫做 “well-separated pairs”。


# 🧠 举个例子:

假设你有一堆人住在城市中不同地方,你不需要比较每一对人的距离。你可以把他们分成 “住得差不多的一堆堆”,然后只比较 “这些堆之间” 的距离。

WSPD 就是这个思想的几何实现。


# 4.2 正式定义(简化版)

给定点集 PP 和分离常数 s>0s > 0,WSPD 是一组点对集合:

{(A1,B1),(A2,B2),...,(Am,Bm)}\{(A_1, B_1), (A_2, B_2), ..., (A_m, B_m)\}

满足:

  • 每个 (Ai,Bi)(A_i, B_i)PP 的两个子集;
  • AiA_iBiB_i 之间 “距离足够远” ⇒ 称为 well-separated;
  • 对于任意一对点 (p,q)P(p, q) \in P存在唯一一个 (Ai,Bi)(A_i, B_i),使得 pAip \in A_iqBiq \in B_i(或反过来)。

# 4.3 什么叫 “well-separated”?

AABB 是两个点集:

  • 包住 AABB 的球半径为 rr
  • 两个球之间的最近距离 sr\geq s \cdot r,即远远分开。

这就叫 “well-separated”(分得开、看得清)。


# 4.4 WSPD 的关键好处

  • 可以将 O(n2)O(n^2) 个点对压缩为 O(sn)O(sn) 个 well-separated pairs;
  • 可以用在最近点对、直径、图构建等很多问题中;
  • 构造时间 O(nlogn+sn)O(n \log n + sn),非常高效!

# 5. WSPD 应用实例:最近点对(Closest Pair)

# 5.1 问题描述

给定一组 nn 个点,找出其中距离最近的一对点 (p,q)(p, q)

这是计算几何中的经典问题之一,常规算法时间复杂度为 O(nlogn)O(n \log n)


# 5.2 用 WSPD 来解决这个问题

# 步骤如下:

  1. 构建 WSPD

    • 对点集 PP 构造一个以 s=4s = 4 为分离常数的 WSPD,得到一组 (Ai,Bi)(A_i, B_i)
  2. 遍历所有 pair

    • 对每个 (Ai,Bi)(A_i, B_i),如果 AiA_iBiB_i 都是单个点(即大小为 1),就比较它们的距离。
  3. 记录最小距离

    • 保留目前为止遇到的最近点对。
  4. 返回最终最近点对


# 5.3 正确性解释

可能你会想:

“万一最近点对 (p,q)(p, q) 落在一个不是单点对的 (Ai,Bi)(A_i, B_i) 里面怎么办?”

WSPD 的构造方式确保不会发生这种情况!

  • 假设 (p,q)(p, q) 是最近点对;
  • 如果它们出现在某个不全是单点的 pair 中,那这个 pair 的点之间距离应当比 (p,q)(p, q) 更大(因为是 well-separated);
  • 这就矛盾了 ⇒ 所以最近点对一定会出现在某个 “单点对” 中。

# 5.4 时间复杂度

  • 构造 WSPD:O(nlogn)O(n \log n)
  • 遍历 O(n)O(n) 个单点 pair ⇒ 总体 O(nlogn)O(n \log n)

# ✅ 总结

通过 WSPD,我们避免了检查所有 n(n1)/2n(n-1)/2 个点对,依然能高效正确地找出最近点对。


# 6. WSPD 应用实例:近似直径(Diameter Approximation)

# 6.1 问题描述

给定一个点集 PP,我们想知道:

哪两个点之间的距离最远? —— 也就是整个点集的 “直径”。


# 6.2 精确算法 vs. 逼近算法

  • 精确做法:枚举所有点对,时间复杂度 O(n2)O(n^2)
  • 对于大规模数据,这太慢了。

所以我们采用 WSPD 来快速计算一个近似值,误差控制在 (1ε)(1 - \varepsilon) 范围内。


# 6.3 算法步骤

给定误差 ε>0\varepsilon > 0,我们这样做:

  1. 设分离常数为 s=4(1ε)εs = \frac{4(1 - \varepsilon)}{\varepsilon}
  2. 构建 WSPD,得到一组 (Ai,Bi)(A_i, B_i)
  3. 遍历每个 pair
    • 对每个 (Ai,Bi)(A_i, B_i),任意取 pAip \in A_iqBiq \in B_i
    • 计算 pq|pq|,记录最大值;
  4. 返回最大距离作为近似直径

# 6.4 正确性保证

假设真正的直径是 D=pqD = |pq|

  • WSPD 会包含一个 pair (Ai,Bi)(A_i, B_i)ppqq 分到两侧;

  • 对应任意取的 p,qp', q' 满足:

    pq(1ε)D|p'q'| \geq (1 - \varepsilon) \cdot D

所以我们不会错过重要的 pair,得到的最大距离不会小太多。


# 6.5 时间复杂度

  • 构造 WSPD:O(nlogn+nεd)O(n \log n + \frac{n}{\varepsilon^d})
  • 遍历 pair:也是 O(nεd)O(\frac{n}{\varepsilon^d})

总时间:O(nεd+nlogn)O(\frac{n}{\varepsilon^d} + n \log n)


# ✅ 总结

使用 WSPD,可以在线性或亚线性时间内,快速逼近点集直径,误差可控,非常适合处理大规模几何数据。


# 7. WSPD 应用实例:几何图构建与 t-Spanner 网络

# 7.1 背景介绍:什么是几何图?

  • 给定一个点集 PP(例如地图上的站点),我们想连接一些边,使得:
    • 每两个点之间通过图中的路径都 “不是太远”;
    • 但又不希望连接所有点对(太多边);

# 7.2 t-Spanner 的定义

一个图 G=(P,E)G = (P, E) 是一个 tt-spanner,如果对所有点对 (u,v)(u, v),图中最短路径满足:

dG(u,v)tuvd_G(u, v) \leq t \cdot |uv|

也就是说,图中的路径不会比欧几里得直线距离长超过 tt 倍。

  • tt 越小,图越 “紧凑”;
  • t=1t = 1 时是最理想(但通常要全连边);
  • 实际应用中,tt1.11.122 比较常见。

# 7.3 如何用 WSPD 构建 t-Spanner?

# 算法步骤:

  1. 给定点集 PP 和一个 t>1t > 1
  2. 设置分离常数 s=4(t+1)t1s = \frac{4(t + 1)}{t - 1}
  3. 构造 WSPD,得到一组 (Ai,Bi)(A_i, B_i)
  4. 对每个 (Ai,Bi)(A_i, B_i),从 AiA_iBiB_i 中各选一个点 p,qp, q,添加边 (p,q)(p, q) 到图中;
  5. 最终图 G=(P,E)G = (P, E) 就是一个 tt-spanner。

# 7.4 正确性简要说明

  • 对每一对点 (u,v)(u, v),它们一定会出现在某个 WSP 中;

  • 利用三角不等式和 WSPD 的几何性质,可以证明:

    dG(u,v)tuvd_G(u, v) \leq t \cdot |uv|

即:所有路径的长度不会超过 tt 倍。


# 7.5 特点与复杂度

  • 构建时间:O(nlogn+n(t1)2)O(n \log n + \frac{n}{(t - 1)^2})
  • 边数:O(n(t1)2)O(\frac{n}{(t - 1)^2})
  • 总边长:O(logn)MST 权重O(\log n) \cdot \text{MST 权重}(有界)
  • 可以进一步 “裁剪” 为 O(n)O(n) 条边的 (1+ε)t(1 + \varepsilon)t-spanner

# ✅ 总结

WSPD 提供了一种优雅高效的方法,用于构造稀疏但 “距离保真度” 高的几何网络,适用于地图、无线网络、机器人路径规划等场景。


# 8. 近似最小生成树(MST Approximation)

# 8.1 问题背景

  • 给定点集 PP,我们希望构建一棵最小生成树(MST);
  • 目标是最小化连接所有点的总边长;
  • 欧几里得空间中,精确算法时间复杂度通常是 O(nlogn)O(n \log n)(2D),甚至 O(n2)O(n^2)(高维);
  • 我们希望在更快时间内构造一个近似的 MST

# 8.2 主要想法

利用已经构造好的 tt-spanner 图作为 “候选图”,然后在上面运行 Kruskal 或 Prim 算法。

因为:

  • tt-spanner 中包含的边是经过筛选的、有代表性的;
  • 虽然不含所有边,但仍然可以连接所有点,并且总边长不会太糟。

# 8.3 算法步骤

  1. 给定点集 PP 和误差参数 t>1t > 1
  2. 构造一个 tt-spanner 图 G=(P,E)G = (P, E)(用 WSPD);
  3. GG 上运行标准的 Kruskal 算法或 Prim 算法,得到最小生成树 TT
  4. 返回 TT 作为近似最小生成树。

# 8.4 正确性与误差控制

设最优 MST 的边长为 ww^*,那么近似生成树 TT 满足:

w(T)tww(T) \leq t \cdot w^*

  • 因为所有原始边的 “路径替代” 不会长于 tt 倍;
  • Kruskal 在子图中取最短边,也保证不超过原图中最短路径。

# 8.5 复杂度分析

  • 构造 tt-spanner:O(nlogn+n(t1)d)O(n \log n + \frac{n}{(t - 1)^d})
  • Kruskal 算法:O(Elogn)O(E \log n)E=O(n/(t1)2)E = O(n / (t - 1)^2)
  • 总体时间:O(nlogn+n(t1)d)O(n \log n + \frac{n}{(t - 1)^d})

相比精确算法,在高维空间或大规模数据上快得多。


# ✅ 总结

利用 t-spanner 作为 “稀疏近似图”,可以在更低时间复杂度下构造接近最优的 MST,非常适合需要快速近似的应用场景。


# 9. 历史发展与开放问题

# 9.1 WSPD 与几何逼近算法的历史地位

WSPD(Well-Separated Pair Decomposition)由 Callahan 和 Kosaraju 在 1995 年提出。

它成为了几何算法中的一个核心工具,广泛应用于:

  • 距离计算(最近点对、直径);
  • 图构建(t-spanner、近似 MST);
  • 高维数据处理;
  • 空间数据压缩与索引。

WSPD 的优点:

  • 构造快(O(nlogn+sn)O(n \log n + sn));
  • 空间小(O(sn)O(sn));
  • 可用于控制误差,支持 (1±ε)(1 \pm \varepsilon) 近似。

# 9.2 更进一步的结构:SSPD

  • SSPD(Semi-Separated Pair Decomposition)是对 WSPD 的改进;
  • 它在某些应用中可以进一步减少空间使用和加速查询
  • 不过实现复杂度更高,应用相对较少。

# 9.3 仍未解决的开放问题

# ❓ 欧几里得最小生成树(EMST)

是否存在一个 O(n)O(n) 空间、O(nlogn)O(n \log n) 时间的算法来求解任意维度的 EMST?

  • 目前 2D 情况是 O(nlogn)O(n \log n),但高维仍困难;
  • 近似算法(基于 spanner)是一个可行方向;
  • 高维几何数据结构仍是研究热点。

# ❓ 更快的 (1+ε)(1 + \varepsilon)- 近似 TSP?

  • 虽然 Arora 和 Mitchell 已提出 nlogO(1/ε)nn \log^{O(1/\varepsilon)} n 时间算法;
  • 是否存在 线性时间的 (1+ε)(1+\varepsilon)- 近似 TSP 算法?(极具挑战性)

# ✅ 总结与展望

  • 本节介绍了几种常见几何优化问题的逼近算法;
  • 利用了一个强大工具 —— WSPD;
  • 在时间、空间和精度三者之间取得了平衡;
  • 同时也展示了计算几何领域中开放而重要的研究方向