# 1. 为什么需要逼近算法?
# 1.1 计算难度:NP-Hard
- 很多现实中的优化问题都是 NP-hard,即没有已知的多项式时间算法。
- 例如:Euclidean TSP(旅行商问题)、Quadratic Assignment(二次指派问题)等。
- 这些问题只能在小规模实例上通过精确算法解决。
# 1.2 运算成本高
- 即使问题不是 NP-hard,在高维空间或大规模数据下,精确算法也往往太慢。
- 举例:
- 2D 最小生成树:
- 高维 D 最小生成树:
- 使用逼近算法可将其降至
# 2. 示例:欧几里得旅行商问题(Euclidean TSP)
# 2.1 问题描述
- 输入:一组点,目标是构造一条闭合路径经过每个点一次,总长度最小。
- 此问题已被证明为 NP-hard [Papadimitrou’77]
# 2.2 常见逼近方法
方法 | 近似比 | 思路说明 |
---|---|---|
MST 翻倍法 | 最小生成树边翻倍成回路 | |
Christofides 算法 | 基于 MST 和最小匹配 | |
- 近似 | 近似最优 | Arora 和 Mitchell 提出,复杂度 |
# 2.3 实际求解进展
- 2006 年:成功解出含 85,900 城市的 TSP,耗费 136 年 CPU 时间
- 2013 年:近似解出全球 1,904,711 城市的路径,误差约为 1.0474 倍
# 3. 示例: - 中心聚类(k-Center Clustering)
# 3.1 问题定义(更通俗地解释)
我们有一堆点(比如城市、传感器、顾客的位置),现在要从中选出 个点当作 “中心”,并把所有点都分配给离它最近的那个中心。
目标是让最远的那个点,也就是 “离它最近中心最远的点”,距离尽可能短。
换句话说:
找 个代表点,使得所有点都离它们最近的中心不会太远,最大距离最小。
📌 举个例子:
假设你要在城市中设 个仓库,客户从最近的仓库取货。
你希望的是:
- 所有客户离最近的仓库都不太远。
- 特别是:最远的那个客户也不能太远。
这就是典型的 - 中心问题。
🔍 数学上定义为:
- 给定点集 和整数 ;
- 选出点集 ,;
- 最小化
即:最大距离最小。
# 3.2 问题难度与逼近性
# 📌 为什么这个问题很难?
这个问题是经典的 NP-hard 问题,意思是:
没有已知的多项式时间算法可以总是找到最优解,尤其当点数 很大时,就算有高性能电脑也搞不定。
具体地:
- 早在 1979 年,Kariv 和 Hakimi 就证明了这个问题是 NP-hard。
- 后来还有人证明了:
- 除非 P = NP,不可能设计出比 2 倍更好的逼近算法。
- 也就是说,想做到 1.99 倍最优解都不可能(Hsu 和 Nemhauser, 1979)。
# ✅ 所以我们能做什么?
我们退而求其次,追求一个 “不错” 的结果,比如:
- 距离最优解不超过两倍;
- 算法很快,不需要爆炸时间。
幸运的是:
Gonzalez(1985)提出了一个简单又优雅的 2 - 逼近算法,叫做 Farthest-First Traversal。
# 3.3 Farthest-First Traversal 算法(最远优先遍历)
# 🌟 核心思想:
这是一种非常直观的 “贪心” 策略:
每一步都挑 “最不满意的点” 作为新的中心。
换句话说,我们从一个点开始,然后每次挑那个离当前所有中心最远的点,直到选够 个中心为止。
# 🧩 算法步骤:
- 随便选一个点,设为第一个中心 。
- 从剩下的点里找出一个:
- 它到当前所有中心中最近的那个距离最大;
- 把它作为下一个中心 。
- 重复上一步,直到选了 个中心。
# 🧠 举个例子:
假设我们要选 3 个学校建在城市里:
- 第一个学校随便选;
- 第二个建在 “离第一个学校最远的居民区”;
- 第三个建在 “离前两个学校最远的居民区”。
最终,选择的学校能很好地覆盖全城。
# ⏱️ 时间复杂度:
- 每次找 “最远点” 要看所有点:;
- 做 次,总共是 。
比穷举所有组合的 好太多!
# 3.4 正确性分析:为什么这是一个 2 - 逼近算法?
我们要说明:
无论输入点怎么分布,Farthest-First 算法得到的最大半径 最优半径。
# ✅ 证明思路:
设:
- 最优中心集合为 ,最小半径为 ;
- 我们算法选出的中心集合为 ,最大半径为 ;
- 目标是证明:。
# 🧩 核心观察:
- 最优解把所有点分成 个 “圆形区域”,半径不超过 ;
- 这些区域里,每个区域至少要包含一个我们选的中心,否则我们就漏选了一个重要的 “远点”。
# ✏️ 更具体的想法:
- 如果某个最优簇 没有任何我们选的中心落进去,
- 那么在我们选中心的时候,两个中心可能落在同一个簇里;
- 根据最远优先策略,这两个中心间距离一定大于 ;
- 这说明它们太远了,不应该在同一个最优簇里 ⇒ 矛盾!
# ✅ 推论:
因此,我们的 个贪心中心最多比最优半径大两倍:
# 📌 总结:
- 算法简单、运行快();
- 有理论保证:不比最优解差超过两倍;
- 在实际应用中效果也不错。
# 4. Well-Separated Pair Decomposition(WSPD)
# 4.1 什么是 WSPD?(直观理解)
WSPD 是一个用来处理 “所有点对之间关系” 的聪明方法。
如果你有 个点,要比较所有的点对,总共有 对,太多了!
WSPD 把这些点对 “分组”,变成少量的、有代表性的点对集合,叫做 “well-separated pairs”。
# 🧠 举个例子:
假设你有一堆人住在城市中不同地方,你不需要比较每一对人的距离。你可以把他们分成 “住得差不多的一堆堆”,然后只比较 “这些堆之间” 的距离。
WSPD 就是这个思想的几何实现。
# 4.2 正式定义(简化版)
给定点集 和分离常数 ,WSPD 是一组点对集合:
满足:
- 每个 是 的两个子集;
- 和 之间 “距离足够远” ⇒ 称为 well-separated;
- 对于任意一对点 ,存在唯一一个 ,使得 且 (或反过来)。
# 4.3 什么叫 “well-separated”?
设 和 是两个点集:
- 包住 和 的球半径为 ;
- 两个球之间的最近距离 ,即远远分开。
这就叫 “well-separated”(分得开、看得清)。
# 4.4 WSPD 的关键好处
- 可以将 个点对压缩为 个 well-separated pairs;
- 可以用在最近点对、直径、图构建等很多问题中;
- 构造时间 ,非常高效!
# 5. WSPD 应用实例:最近点对(Closest Pair)
# 5.1 问题描述
给定一组 个点,找出其中距离最近的一对点 。
这是计算几何中的经典问题之一,常规算法时间复杂度为 。
# 5.2 用 WSPD 来解决这个问题
# 步骤如下:
构建 WSPD:
- 对点集 构造一个以 为分离常数的 WSPD,得到一组 。
遍历所有 pair:
- 对每个 ,如果 和 都是单个点(即大小为 1),就比较它们的距离。
记录最小距离:
- 保留目前为止遇到的最近点对。
返回最终最近点对
# 5.3 正确性解释
可能你会想:
“万一最近点对 落在一个不是单点对的 里面怎么办?”
WSPD 的构造方式确保不会发生这种情况!
- 假设 是最近点对;
- 如果它们出现在某个不全是单点的 pair 中,那这个 pair 的点之间距离应当比 更大(因为是 well-separated);
- 这就矛盾了 ⇒ 所以最近点对一定会出现在某个 “单点对” 中。
# 5.4 时间复杂度
- 构造 WSPD:
- 遍历 个单点 pair ⇒ 总体
# ✅ 总结
通过 WSPD,我们避免了检查所有 个点对,依然能高效正确地找出最近点对。
# 6. WSPD 应用实例:近似直径(Diameter Approximation)
# 6.1 问题描述
给定一个点集 ,我们想知道:
哪两个点之间的距离最远? —— 也就是整个点集的 “直径”。
# 6.2 精确算法 vs. 逼近算法
- 精确做法:枚举所有点对,时间复杂度 。
- 对于大规模数据,这太慢了。
所以我们采用 WSPD 来快速计算一个近似值,误差控制在 范围内。
# 6.3 算法步骤
给定误差 ,我们这样做:
- 设分离常数为 ;
- 构建 WSPD,得到一组 ;
- 遍历每个 pair:
- 对每个 ,任意取 ,;
- 计算 ,记录最大值;
- 返回最大距离作为近似直径
# 6.4 正确性保证
假设真正的直径是 :
WSPD 会包含一个 pair 把 和 分到两侧;
对应任意取的 满足:
所以我们不会错过重要的 pair,得到的最大距离不会小太多。
# 6.5 时间复杂度
- 构造 WSPD:
- 遍历 pair:也是
总时间:
# ✅ 总结
使用 WSPD,可以在线性或亚线性时间内,快速逼近点集直径,误差可控,非常适合处理大规模几何数据。
# 7. WSPD 应用实例:几何图构建与 t-Spanner 网络
# 7.1 背景介绍:什么是几何图?
- 给定一个点集 (例如地图上的站点),我们想连接一些边,使得:
- 每两个点之间通过图中的路径都 “不是太远”;
- 但又不希望连接所有点对(太多边);
# 7.2 t-Spanner 的定义
一个图 是一个 -spanner,如果对所有点对 ,图中最短路径满足:
也就是说,图中的路径不会比欧几里得直线距离长超过 倍。
- 越小,图越 “紧凑”;
- 时是最理想(但通常要全连边);
- 实际应用中, 取 ~ 比较常见。
# 7.3 如何用 WSPD 构建 t-Spanner?
# 算法步骤:
- 给定点集 和一个 ;
- 设置分离常数 ;
- 构造 WSPD,得到一组 ;
- 对每个 ,从 和 中各选一个点 ,添加边 到图中;
- 最终图 就是一个 -spanner。
# 7.4 正确性简要说明
对每一对点 ,它们一定会出现在某个 WSP 中;
利用三角不等式和 WSPD 的几何性质,可以证明:
即:所有路径的长度不会超过 倍。
# 7.5 特点与复杂度
- 构建时间:
- 边数:
- 总边长:(有界)
- 可以进一步 “裁剪” 为 条边的 -spanner
# ✅ 总结
WSPD 提供了一种优雅高效的方法,用于构造稀疏但 “距离保真度” 高的几何网络,适用于地图、无线网络、机器人路径规划等场景。
# 8. 近似最小生成树(MST Approximation)
# 8.1 问题背景
- 给定点集 ,我们希望构建一棵最小生成树(MST);
- 目标是最小化连接所有点的总边长;
- 欧几里得空间中,精确算法时间复杂度通常是 (2D),甚至 (高维);
- 我们希望在更快时间内构造一个近似的 MST。
# 8.2 主要想法
利用已经构造好的 -spanner 图作为 “候选图”,然后在上面运行 Kruskal 或 Prim 算法。
因为:
- -spanner 中包含的边是经过筛选的、有代表性的;
- 虽然不含所有边,但仍然可以连接所有点,并且总边长不会太糟。
# 8.3 算法步骤
- 给定点集 和误差参数 ;
- 构造一个 -spanner 图 (用 WSPD);
- 在 上运行标准的 Kruskal 算法或 Prim 算法,得到最小生成树 ;
- 返回 作为近似最小生成树。
# 8.4 正确性与误差控制
设最优 MST 的边长为 ,那么近似生成树 满足:
- 因为所有原始边的 “路径替代” 不会长于 倍;
- Kruskal 在子图中取最短边,也保证不超过原图中最短路径。
# 8.5 复杂度分析
- 构造 -spanner:
- Kruskal 算法:,
- 总体时间:
相比精确算法,在高维空间或大规模数据上快得多。
# ✅ 总结
利用 t-spanner 作为 “稀疏近似图”,可以在更低时间复杂度下构造接近最优的 MST,非常适合需要快速近似的应用场景。
# 9. 历史发展与开放问题
# 9.1 WSPD 与几何逼近算法的历史地位
WSPD(Well-Separated Pair Decomposition)由 Callahan 和 Kosaraju 在 1995 年提出。
它成为了几何算法中的一个核心工具,广泛应用于:
- 距离计算(最近点对、直径);
- 图构建(t-spanner、近似 MST);
- 高维数据处理;
- 空间数据压缩与索引。
WSPD 的优点:
- 构造快();
- 空间小();
- 可用于控制误差,支持 近似。
# 9.2 更进一步的结构:SSPD
- SSPD(Semi-Separated Pair Decomposition)是对 WSPD 的改进;
- 它在某些应用中可以进一步减少空间使用和加速查询;
- 不过实现复杂度更高,应用相对较少。
# 9.3 仍未解决的开放问题
# ❓ 欧几里得最小生成树(EMST)
是否存在一个 空间、 时间的算法来求解任意维度的 EMST?
- 目前 2D 情况是 ,但高维仍困难;
- 近似算法(基于 spanner)是一个可行方向;
- 高维几何数据结构仍是研究热点。
# ❓ 更快的 - 近似 TSP?
- 虽然 Arora 和 Mitchell 已提出 时间算法;
- 是否存在 线性时间的 - 近似 TSP 算法?(极具挑战性)
# ✅ 总结与展望
- 本节介绍了几种常见几何优化问题的逼近算法;
- 利用了一个强大工具 —— WSPD;
- 在时间、空间和精度三者之间取得了平衡;
- 同时也展示了计算几何领域中开放而重要的研究方向。