论文 On the All-pairs-shortest-path Problem. Raimund Seidel, 1992 阅读笔记。这篇文章给出了一个在 O(M(n)logn) 时间复杂度内计算出无向无权图全源最短路长度的算法,和一个在 O(M(n)logn) 时间复杂度内找出全源最短路的随机算法,其中 M(n) 为对两个 n×n 的小整数矩阵做乘法的时间复杂度(注意:如果有 M(n)=O(n2),则找出全源最短路时间复杂度为 O(n2log2n))。该算法还可以推广到有向无权图上。
计算全源最短路长度的算法
设 G=⟨V,E⟩ 是一个顶点集合 V={1,2,…,n} 的无向无权连通图(先讨论这种情况,剩下情况在最后一节补充),而 An×n 为 G 的邻接矩阵。我们现在要计算 dij(1≤i,j≤n) 表示编号为 i,j 点之间的最短路长度。
命题 1:设矩阵 Z=A2,对于任何 1≤i,j≤n,如果 dij≤2,则 zij>0。
证明几乎显然。
然后让 G′=⟨V,E′⟩ 为一张新图,而一条边 (u,v)∈E′ 当且仅当 u=v 且 duv≤2。可以发现 (u,v)∈E′ 当且仅当 aij=1 或 zij>0。
再设 tij 为在 G′ 中编号为 i,j 点之间的最短路长度。
命题 2:对于任何 1≤i,j≤n:如果 dij 为偶数,则 dij=2tij;如果 dij 为奇数,则 dij=2tij−1。
证明:分两种情况讨论:
- 如果有:dij=2s(s∈N),则设在图 G 中 i,j 间最短路为 v0=i,v1…,v2s−1,v2s=j。则显然 v0=i,v2,…,v2s−2,v2s=j 是图 G′ 中 i,j 间的最短路,所以 dij=2tij。
- 如果有:dij=2s−1(s∈N+),则设在图 G 中 i,j 间最短路为 v0=i,v1…,v2s−2,v2s−1=j。则显然 v0=i,v2,…,v2s−2,v2s−1=j 是图 G′ 中 i,j 间的最短路,所以 dij=2tij−1。
得证。□
设 δ(G) 为图 G 的直径(两点间最短路长度的最大值),由命题 2 可可知:将图 G 上的问题转化为图 G′ 上的问题,直径大致减半,更具体的有:δ(G′)=⌈δ(G)/2⌉。这也是这个算法减小问题规模的关键。
现在的最主要问题变为判断 dij 的奇偶性,如果这一问题得以解决,就可以不断递归到直径更小的问题上,最后直径不超过 2 的时候结束递归。
为解决这一问题我们先给出一个极其显然的定理:
命题 3:设 1≤i,j≤n 且 i=j。则对于在图 G 与点 j 有连边的点 k,都有:dij−1≤dik≤dij+1,并且一定存在一个 k 使得 dik=dij−1。
这个即是最短路的三角不等式在无向无权图上的直接运用。
命题 4:设 1≤i,j≤n 且 i=j。则如果有 dij 为偶数,则对于任何在 G 中与点 j 有连边的点 k 都有 tik≥tij;如果有 dij 为奇数,则对于任何在 G 中与点 j 有连边的点 k 都有 tik≤tij,并且一定会有一个 k 使得 tik<tij。
证明:分两类情况讨论:
- 若 dij=2s(s∈N),则有命题 3 可得对于任何在 G 中与点 j 有连边的点 k 都有 dik≥2s−1,那么再由命题 2 可推出 tik≥s=tij。
- 若 dij=2s−1(s∈N+),则有命题 3 可得对于任何在 G 中与点 j 有连边的点 k 都有 dik≤s−1,并且一定存在一个 k 使得 dik=2s−2,那么再由命题 2 可推出另一半结论。
得证。□
作为命题 4 的直接推论,我们得到命题 5:
命题 5:对于任何 1≤i,j≤n:dij 为偶数当且仅当 (k,j)∈E∑tik≥tij⋅degG(j);dij 为奇数当且仅当 (k,j)∈E∑tik<tij⋅degG(j),其中 degG(v) 表述在图 G 中点 u 的度数。
证明便是反证然后导出与命题 4 间的矛盾。
注意到 (k,j)∈E∑tik=k=1∑ntikakj,于是我们定义矩阵 X=TA,则判断 dij 的奇偶性可以变为判断 xij 与 tij⋅degG(j) 的大小关系。
这样我们就可以得到算法的伪代码:
伪代码第 9 行的 degA(v) 表示邻接矩阵为 A 的图(不计重边则是唯一的)中 v 的度数。
设 T(n,δ) 为对一个有 n 个点且直径为 δ 的图执行如上算法的时间复杂度,则有:
T(n,δ)={M(n)+O(n2)T(n,⌈δ/2⌉)+2M(n)+O(n2)δ≤2δ>2
易得:
T(n,δ)=(2⌈log2δ⌉−1)M(n)+O(n2logδ)=O(M(n)logn)
上述推导用到了 δ=O(n) 与 M(n)=Ω(n2),其中 M(n) 为对两个 n×n 的小整数矩阵做乘法的时间复杂度,有 M(n)=O(n2.376)。
找到全源最短路的随机算法
注意这里的「找到」指的不是对每一对 i,j 都输出从 i 到 j 上最短路的每一个点。因为如果这样这个问题不可能在 o(n3) 内解决(Θ(n2) 对点,每对点间距离为 O(n))。
这个算法「找到」的是「后继矩阵」Sn×n,对于每个 i=j,sij 的值表示与 i 相邻且在 i 到 j 最短路上的点的编号,如果有多个这样的点任取一个。显然这样的「后继矩阵」可以更高效的表示全源最短路。
我们来定义一个新的 01 矩阵乘法 ∘(原文叫 the boolean product witness matrix,原谅我不会翻译)。有两个 01 矩阵 A,B,则我们定义 W=A∘B 满足如下条件:
wij={some k such that aik=1 and bkj=1, and0 if no such k exists.
这里的 some 表示了如果有多个这样的 k 任取一个的意思。对于满足 aik=bkj=1 的 k,我们称 k 是 (i,j) 的一个 witness。
现在我们先使用上一节的算法求得了全源最短路的长度,并将 dij 存在矩阵 Dn×n 里面。那么显然 sij=k 等价于 dkj=dij−1 且 aik=1。
那么我们可以将 S 表示为如下形式:
sij=(A∘Q(l))ij, with l=dij
其中 qij(l)=[dij=l−1]。
要计算 n−1 个 ∘ 显然太慢了。这里有一个 key observation 就是说由命题 3 可得:dij−1≤dkj≤dij+1,于是你发现其实 sij=k 等价于 aik=1 且 dkj≡dij−1(mod3)。也就是说 d 都可以模一个 3,所以我们改写一下 Q(l) 的定义:qij(l)=[dij≡l−1(mod3)],上面的表示只剩下三项:
sij=(A∘Q(l))ij, with l=dijmod3
接下来先给一个整个算法的伪代码,然后再进行分析:
我们先 BPWM 函数进行时间复杂度分析。对于伪代码第 3 到 10 行的循环,设 M(n)=O(nω),则将 n×d 与 d×n 两个矩阵相乘的时间复杂度为 O(n2dω−2)。所以这个循环时间复杂度表达式如下:
pl=0∑⌈log2n⌉−1(O(n2)+O(n2(2l)ω−2))={O(p⋅nω)O(p⋅n2logn)ω>2ω=2
接下来我们将分析如何选取 p 使得伪代码第 11 到 13 行的循环期望时间为 O(n2)。更具体的,我们分析对于任何 (i,j),其存在一个 witness,但是在第一个循环中没有找到的概率至多为 1/n。
命题 6:对于 BPWM 第一个循环(伪代码第 3 到 10 行)与任意的数对 (i,j),如果 k1,k2,…,kd 中恰有一个是 (i,j) 的 witness,不妨设为 kν,则 cij=kν。
证明:因为只有 kν 满足 aikν=bkνj=1,故 cij=r=1∑dkraikrbkrj=kν。□
对于任意数对 (i,j),如果其没有 witness,则在执行完伪代码第 2 后 wij 便是 0,之后 wij<0 的条件也一直不会被触发,无需考虑。
否则如果 (i,j) 有 witness,且一共有 c(c>0) 个 witness。假设有一次过程中 d 满足 n/2≤cd≤n(因为 d 取遍所有不超过 n 的 2 的次幂,所以这样的 d 一定存在),下面这个命题指出,「k1,k2,…,kd 中恰有一个 witness」这个事件为假的概率不超过 1−2e1,其中 e 是自然对数的底数。又因为只要有「k1,k2,…,kd 中恰有一个 witness」成立,则 (i,j) 的 witness 便被找到,所以经过循环后 (i,j) 的 witness 没被找到的概率也不超过 1−2e1。
命题 7:一个袋子里有 n 个球,其中有 c(c≤n) 个红球,剩下是蓝球。进行 d 次抽取放回过程,其中 d 满足 n/2≤cd≤n,假设每次抽取抽到每个球的概率都是 1/n。则这 d 次恰有一次抽出红球的概率至少是 2e1。
证明:这个事件概率的表达式显然是:
d⋅nc(1−nc)d−1
又因为 n/2≤cd≤n,所以有:ndc≥21 与 nc≤d1。所以将上式进行放缩:
d⋅nc(1−nc)d−1≥21(1−d1)d−1>2e1
得证。□
我们又将关于 d 的循环重复了 p 遍,令 (1−2e1)p≤n1 得 p 的最小值为 −lnn/ln(1−2e1),是 O(logn) 级别的。
故可写出最后的时间复杂度表达式:
{O(nωlogn)O(n2log2n)ω>2ω=2
补充
G 不连通这个算法仍适用,只是如果 (i,j) 间没有路径,则 dij=0。那么判断一下如果 i=j 且 dij=0,那么 (i,j) 间的路径一定不存在。
G 是有向图也是适用的,我们只需要把 Work 函数的伪代码中,第九行 degA(v) 的含义由度数改为入度即可。
这个算法实践中并不快,一是因为快速的矩阵乘法常数大,二是递归时的开销不小。
参考文献
[1] On the All-pairs-shortest-path Problem. Raimund Seidel, 1992.