本篇文章介绍整数边权下 (min,+) 矩阵乘、APSP 等问题的一些做法。若每个元素的权值在 [−M,M]∩Z 中,n×nr 和 nr×n 的 (min,+) 矩阵乘可做到 ~O(Mnω(r));有向图 APSP 可做到 ~O(n2+μ(t)),其中 M=nt,μ(t) 为 ω(r)=1+2r−t 的解,当 M=O(1) 时为 ~O(n2.575);(1+ϵ) 近似非负实数 (min,+) 矩阵乘可以做到 ~O(nω(r)logW/ϵ),其中 W 为最大权值和最小权值的比。
如果我们想要精确计算实数矩阵上的 (min,+) 矩阵乘法,那么目前不存在 O(n3−δ) 的算法,这被称为 APSP hypothesis。但是如果每个元素都是 [−M,M] 中的整数,则我们有很简单的 O(n3−δ) 的做法,可以做到 ~O(min(n2+r,Mnω(r))),其中 ω(r) 为 n×nr 和 nr×n 矩阵相乘的快速矩阵乘法指数。
令 m=nr。我们让 a′i,j=(m+1)M−ai,j,b′i,j=(m+1)M−bi,j,计算 C′=A′×B′,令 ci,j=2M−msb(c′i,j),其中 msb 表示 c′i,j 最高位的位置,也即 ⌈logm+1c′i,j⌉。不难验证这个做法是正确的,并且实际上计算出了每一种 a+b 的个数。这样每一次代数运算是 ~O(M) 的,需要的代数运算次数是 O(nω(r)) 的,因此复杂度为 ~O(Mnω(r))。如果 M 太大,也可以直接暴力计算,复杂度为 ~O(n2+r)。
我们能在 ~O(Mnω(r)) 计算每个位置 (i,j) 中每一种 a+b 的个数,似乎是不寻常的,因为矩阵乘法加速的原理在于压缩信息,但我们似乎保留了全部的信息。这是由于 ~O(Mnω(r)) 实际上并不是一个多项式复杂度,输入规模是 O(n2logM) 的。这就类似于桶排序,原本长度为 nr 的信息变为了长度为 M 的,因此保留信息只需要多付出 ~O(M) 倍的时间,而 O(nω(r)) 是不变的。
如果我们同时考虑复杂度中的 M 和 n,那么 (min,+) 矩阵乘和 APSP 问题不是等价的。如果使用原先的归约,即使 APSP 问题中每条边边权在 [−M,M]∩Z 中,在 log2n 轮 (min,+) 矩阵乘中,权值上限将不断增加,最终达到 nM,这样做 APSP 还不如实数边权 Dijkstra 快。
不过 APSP 有其图论性质。一条性质是,当最短路用到的边数很多时,它可选择的松弛点也会变多。我们进行 log3/2n 轮 (min,+) 矩阵乘,第 i 次只考虑松弛那些走过的边的条数不超过 (3/2)i 的最短路。可以观察到,可用的松弛点的个数是不小于 1/3 其长度的。当最短路长度很长时,我们可以随机从 V 中选取一部分点作为可能的松弛点。
假设我们在做第 i 轮 (min,+) 矩阵乘,当前的矩阵是 F,令 s=(3/2)i,将 V 中每个点以 min(1,(9lnn)/s) 的概率选进集合 B 中,计算 F′=F[∗,B]×F[B,∗],将 F′ 中超过 sM 的元素设为 +∞。考虑那些长度处于 (2s/3,s] 的最短路 (u,v),使用归纳法,如果所有长度 ≤2s/3 的最短路已经在 F 中,此时令 Puv 中 u 向后 2s/3 个点的位置为 y,v 向前 2s/3 个点的位置为 x,则 (x,y) 间隔了 2⋅2s/3−s=s/3 个点,而对所有 z∈Pxy,(u,z),(z,v) 的距离不超过 2s/3,因此已经在 F 中,只要有至少一个 z∈B,(u,v) 的最短路就在 F′ 中。这样的概率是
(1−9lnns)s/3≤exp(−3lnn)=n−3
使用 union bound,所有长度在 (2s/3,s] 中的 (u,v) 的最短路 P(2s/3,s] 都在 F′ 中的概率不小于 1−|P(2s/3,s]|n−3。将每一轮的概率一起使用 union bound,成功概率不小于 1−P[0,nM]⋅n−3=1−n−1。
设 s=n1−r,M=nt,则这一轮的复杂度为 ~O(min(sMnω(r),n2+r))=~O(min(nt+ω(r)+(1−r),n2+r)) 其关于 s 的最大值在 ω(r)=1+2r−t 取到。当 M=O(1) 时,查表可得,复杂度为 ~O(n2.575)(2002,论文发布时)~O(n2.528)(2023,最新结果)。
对于 r=1 的情况,我们观察这个式子,发现当 M=O(n3−ω−δ) 时,这个算法是 ~O(n3−δ) 的。由于 ω≥2,当 M=O(n) 时,我们没法从中得到 O(n3−δ) 的做法,因此他不违反 APSP 经典假设。
论文继续介绍了构造最短路与去随机化的方法,这些部分较为独立,这里不再赘述。
对于非负实数近似 (min,+) 矩阵乘,我们可以利用加法的特性给出一个十分经典的近似算法,取 R≪M,将权值上取整,即 a′i,j=⌈Rai,jM⌉,进行同样的计算后再转换回来。
对于不同大小的 ai,k+bk,j,我们不能把他们都用 M 作为分母取整,因为在计算近似比时我们使用的是结果的值作为分母而非 M,这样会导致太小的 a+b 近似比太差,我们需要枚举 r∈[⌊log2R⌋,⌈log2M⌉]∩Z,用 2r 做分母。当 2r−1<max(ai,j,bj,k)≤2r 时,有
ai,j≤2ra′i,jR<ai,j+2rR, bj,k≤2rb′j,kR<bj,k+2rR
ci,j≤c′i,j≤2ra′i,jR+2rb′j,kR<ai,k+bk,j+2r+1R=ci,j+2r+1R≤(1+4R)ci,j
令 R=4ϵ 即可做到 1+ϵ 近似。复杂度为 ~O(nωlogM/ϵ)。对于 APSP,由于我们要做 logn 轮,每一轮的误差会相乘,即 (1+4R)⌈logn⌉,令 R=O(lognln(1+ϵ))=~O(1/ϵ) 即可。
我们看到,将 M 变为 4logM/ϵ 利用的是不同大小的 a+b 的采样密度不同,我们总是把 (2r−1,2r] 分成 R 份,因此采样密度是指数级增长的。在无权图上这一点会更加容易观察到:我们只用计算 01 矩阵乘法 A⌊(1+ϵ)i⌋,A⌈(1+ϵ)i+1⌉ 看 (u,v) 的值是否从 0 变为 1 便可以知道是否有 δ(u,v)∈(⌊(1+ϵ)i⌋,⌈(1+ϵ)i+1⌉]。复杂度为 O(nωlog1+ϵn)=~O(nω/ϵ)。
如果原先权值是非负实数,我们可以将所有的权值放缩,使得最小的权值为 1(实际上由于边界问题,2 更好)。这样便囊括在了 2r 的枚举中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
2023-10-05 [机器学习] 1. 梯度下降 Gradient Descent 与随机梯度下降 Stochastic Gradient Descent