Fine-Grained学习笔记(3):最短路(边权,点权),(min,+)矩阵乘

问题:APSP(全局最短路)

给定G=(V,E),其中边集E带权值,对于s,tV,计算d(s,t),即从st的最小的经过路径权值之和

已知的算法:n次(堆优化的)Dijkstra算法:O~(|V||E|)

Floyd-Warshall算法:O(|V|3)

考虑如下的公式:

cuv(k)=minxV(cux(k/2)+cxv(k/2))

形式上有些类似于矩阵乘,因此该过程被称为"(min,+)矩阵乘"

时间复杂度目前没有定论,但一般认为是Ω(n3ϵ)时间(即不存在O(n3ϵ)的算法).

Zwick的最短路算法(2002):

引理(有限整数的(min,+)矩阵乘):

给定n×n的矩阵A,B,其元素均包含于[c]{}之间(即要么是不连通边,要么权值小于等于常数),如此限制下,对A,B进行的(min,+)矩阵乘时间复杂度为O~(cnω)

证明:

按如下方式构造新的矩阵A,B

aij=Maijbij=Mbij,其中M=n+1为足够大的整数

然后使用普通的矩阵乘计算C=AB

cij=Σk=1naikbjk=Σk=1nMaik+bkj

总共需要进行O(nω)[Mc](位数为O(clogM))范围内的大整数运算,,每次大整数运算使用FFT消耗时间为O(clogMlog(clogM))=O~(c)

然后遍历矩阵中n2个元素,对于矩阵的每个元素,用O(c)时间找到使得cijMt的那个最大的t,即为cij=minxV(aik+bkj)的值

总时间复杂度为O~(cnω),证毕.

然而,全局最短路可能有最多O(|V|)跳,若所有连通边权值不超过c,则最短路的距离可能为O(c|V|),那么直接用(min,+)矩阵乘法进行重复矩阵乘以计算最短路矩阵,复杂度会上升到O~(c|V|ω+1),反倒比Floyd-Warshall算法更差了.

Zwick算法的第一个思路是根据跳数的多少对路径进行分类讨论

情况1:

跳数L的最短路,进行O(logL)次元素限制在[cL]内的(min,+)矩阵乘法,该情况下总时间复杂度O~(cL|V|ω)

情况2:

跳数L的最短路

碰撞引理:

随机选取RV,|R|=O(|V|Llog|V|),集合R能够概率性地与所有跳数L的最短路"碰撞"(R与某条路径"碰撞"指R中至少包含了路径中的一个点)

证明:

随机选取子集R,每个点被选中的概率均为p=3Llog|V|

那么对于一组s,t,记Πstst的最短路所经过的边组成的集合,定理的描述中要求了|Πst|L,那么

Pr[R不与Πst"碰撞"](1p)|Πst|(1p)LepLe3log|V|=1n3

那么,Pr[s,tVΠstL|(R不与Πst"碰撞")]|V|21|V|3=1|V|,证毕

在以此法找出的R上的所有点为原点,使用(堆优化的)Dijkstra算法,对正向边和反向边分别计算单源最短路,复杂度为O~(|R||E|),这样便得出了所有rR,s,tVd(s,r)d(r,t)

然后对于s,tV,计算ds,t=minrR(d(s,r)+d(r,t)),复杂度O(|R||V|2)

该情况下总时间复杂度O~(|V|3L)

总的时间复杂度O~(cL|V|ω+|V|3L),取L=n3ω2c,得到O~(cn3+ω2)O(n2.687)(在认为c=O(1)的前提下)

改进:对跳数较小的情况也应用碰撞引理

假设已经找到了所有跳数2l3的最短路,那么对于每个V中的点,以p=l9logn为概率选取每个点,将随机选取出的O~(n/l)个节点组成集合Rl/3,那么,Rl/3中元素未能与所有跳数[l/3,(2l/3)]的最短路"碰撞"上的概率1/n((1-p)^{|\Pi_{st}|}\leq (1-p)^{l/3} \leq 2^{-pl/3} \leq e^{-3\log n}=\frac{1}{n^3}   n^2 \cdot \frac{1}{n^3} =\frac{1}{n} ),

在此概率化的条件下,以Rl/3中所有点为原点,使用(堆优化的)Dijkstra算法,对正向边和反向边分别计算单源最短路,得到所有rR,s,tVd(s,r)d(r,t)后,对于s,tV,计算ds,t=minrRl/3(d(s,r)+d(r,t)).这样便能得到所有的跳数l的最短路,示意图如下:

计算ds,t=minrRl/3(d(s,r)+d(r,t))的过程是一个对|V|×|Rl/3||Rl/3|×|V|的,元素值限制在[O(cl)]的两个长方形矩阵的(min,+)矩阵乘法,时间复杂度为O~(clM(|V|,|V|/l,|V|))

无向边的情况:

Seidel在1995年证明了无权无向图最短路可在O~(nω)时间内解决

Galil,Margalit在1997年证明了边权值限制在[c]的情况下可在O~(cω+12nω)时间内解决.

Shoshan,Zwick在1999年得到了O~(cnω)的算法

C.(作者本人),V.,Xu在2021年得到了更简便的O~(cnω)的算法

这里讲了一下作者本人的算法但因为我完全没明白,并且与主线关系也不大,所以就略过了

实数点权的最短路算法:

热身:在实数点权图中找出权值最小的三角形

引理:

给定n×n的布尔矩阵A,B,计算"最小见证矩阵"C

cij=min{k:aikbkj为真}

的复杂度是O(n2.529)

(可以理解为在下图中,对于每一对i,j,找到标号最小的,且与左点与右点均相连的中间点)

证明:(思路:分块)

[n]拆分为r个长度为n/r的区间I1,,Ir

步骤1:对于所有的Ig(g{1,,r}),计算dij(g)=kIg(aikbkj),然后令gij为使得dij(g)为最小的g

该步骤本质上是进行r次长方形矩阵乘法,复杂度为O(rM(n,n/r,n))

步骤2:根据得到的gij,暴力计算cij=kIgij(aikbkj)

时间复杂度O(n2n2r)

总时间复杂度O(rM(n,n/r,n)+n3r)=O(n2.529)

Vassilevska,Williams,Yuster在2016年提出的最小点权三角形算法:

对于每一对u,v,计算cuv=min{w(x):(u,x)E(x,v)E}(将点x按权值排序之后运行"最小见证矩阵"算法,复杂度O(n2.529))

然后在所有的u,v中,找出最小的cvu+w(u)+w(v)

总时间复杂度O(n2.529)

Czumaj-Lingas在1990年对该问题提出了以递归的技巧达到的O~(nω)时间的算法.

回到APSP问题上来

引理:

给定实数矩阵ARn×n,矩阵B{0,}n×n,那么这两个矩阵的(min,+)矩阵乘的运行时间为O(n(3+ω)/2)O(n2.687)

实际上,就是在计算cij=mink:bkj{aik}

证明:

A的每一行进行排序并映射到[n]中,将[n]拆分为r个长度为n/r的区间I1,,Ir

步骤1:

对于每个Ig,使用矩阵乘法在O(rnω)时间内计算dij(g)=k[aikIg][bkj]

然后令gij=使得dij(g)最小的g

步骤2:

暴力计算cij=minaikIgij,bkj{aik}

时间复杂度O(n2nr)

总时间复杂度O(rnω+n3r)=O(n3+ω2))(取r=3ω2)

如果将步骤1的长方形矩阵乘法复杂度写作O(M(rn,n,n)),那么复杂度可以更精确地分析为O~(n2.66)

chan2007算法:

思路:根据跳数多少分类讨论

情况1:

跳数L的最短路

假设所有跳数l1的最短路已找到

则计算d(l)(u,v)=(minxV,(x,v)Ed(l1)(u,x))+w(v)(使用前述引理,令bxv={0(x,v)E(x,v)E)

该情况的时间复杂度O(Ln3+ω2)

情况2:

跳数L的最短路

将点权移动到边权上,然后同Zwick算法中的情况2,复杂度O~(n3/l)

总时间复杂度O~(Ln3+ω2+n3L)

L=n3ω4,O~(n33ω4)O(n2.844)

待解决的问题:更优的复杂度?实数边权(边权最短路问题比点权严苛,点权最多|V|个,边权最多|E|=O(|V|2)个)?

posted @   Isakovsky  阅读(258)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示