网页链接:http://bbit.vip/service/main.php?version=1&type=article&id=117
这一部分要介绍的亚线性时间算法总共有四个,这篇短文介绍的是其中之一,求点集合的直径。
我们先来看一下问题定义:
定义:
已知:有 m m m个点,点与点之间的距离使用邻接矩阵表示,则 D i j D_{ij} Dij表示点 i i i到点 j j j的距离, D D D是一个对称矩阵,并且满足三角不等式 D i j ≤ D i k + D k j D_{ij} \leq D_{ik} + D_{kj} Dij≤Dik+Dkj。
求出:点对 ( i , j ) (i,j) (i,j)使得 D i j D_{ij} Dij是最大的,则 D i j D_{ij} Dij是这 m m m个点的集合的直径。
普通求解方法
当数据量小的时候这个问题非常简单,只需要把矩阵中所有的数字都扫一遍,复杂度是 O ( m 2 ) O(m^2) O(m2),记作 O ( n ) O(n) O(n)。
或者数据量再稍微大一些,也可以用并行的方法将时间进一步地缩小,但是这样做就比较依赖于硬件资源。
当数据量进一步扩大,我们则希望用一个亚线性的方法来解决这个问题,也就是说时间复杂度为 O ( n ) O(\sqrt{n}) O(n),当然我们之前说过我们采取的是一个近似的算法,那么我们所估计的结果有多精确,也要给出一个衡量。
近似比
算法给出的结果与理论最优结果的一个比较
求解算法:The Indyk’s Algorithm
- 任选 k ∈ [ 1 , m ] k \in [1,m] k∈[1,m]
- 选出 l l l,使得 ∀ i , D k i ≤ D k l \forall i,D_{ki} \leq D_{kl} ∀i,Dki≤Dkl
- 返回 ( k , l ) , D k l (k,l),D_{kl} (k,l),Dkl
算法分析之近似比分析
最优解记为 o p t opt opt,是点 i i i 和点 j j j 之间的距离
则有 o p t 2 ≤ D k l ≤ o p t \frac{opt}{2} \leq D_{kl} \leq opt 2opt≤Dkl≤opt。
算法分析之近似比证明不等式
关于不等式的右侧易证,左侧的证明如下所示:
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ opt = &D_{ij}\…
算法评价
算法的时间复杂度为 O ( m ) = O ( n ) O(m) = O(\sqrt{n}) O(m)=O(n)。读完整个算法之后会发现其实只做了一件事情(一转化成数学语言看起来就比较抽象了),就是在邻接矩阵中随便选出一行,然后求出其最大值,而这个值便具有 1 / 2 1/2 1/2的近似比,同时算法也是一个亚线性时间复杂度的算法。
计算点集合的直径是一个简单的问题,而后面将要讲解的连通分量等就比较麻烦了,这将会在接下里的短文中慢慢分析,敬请期待~