Fine-Grained学习笔记(2):矩阵乘法与图论
问题:矩阵乘法
方阵乘法:
给定两个
(由于语言习惯,本文中提到矩阵且无其他说明的场合,均指方阵)
朴素算法的复杂度:
设想中的复杂度下界:
Strassen算法(1969):
热身:考虑
共需
思路:
考虑
总共只需要进行
然后考虑任意
并进行递归分治,分析时间复杂度
其他的分治法思路
Laderman在1976年证明了
Pan在1978年证明了
Pan又在1978年证明了
Bini等人在1980年使用"Border Rank"理论使得矩阵乘法复杂度降低到了
Schonhage在1981年矩阵乘法复杂度降低到了
Strassen在1986年使用"Laser Method"将矩阵乘法复杂度降低到了
目前对矩阵乘法的复杂度下界尚没有一个定论,在本文中使用
(长方形)矩阵乘法:
给定
记
以下结论是显然的:
1,
2,
简单的下界性质:
考虑
瘦矩阵乘:
按照如上方式,将两个矩阵分别拆分成
扁矩阵乘:
按照如上方式,将两个矩阵分别拆分成
但实际上,针对这两种分类还有更好的算法:
对于瘦矩阵乘:
Coppersmith在1982年给出了
LeGall和
对于扁矩阵乘:
当
稀疏矩阵乘:
对于两个
朴素算法:
复杂度为O(mn),由于
博主注:这个
Yuster和Zwick的算法(2005):
思路:按照矩阵
记
这样便保证了
低频列:
计算
该情况时间复杂度
高频列:
将
总时间复杂度
应用:与矩阵和线性代数有关的问题
矩阵求逆,
应用:有向图中寻找三元环
给定有向图
判断是否存在三个点
朴素算法:
(1)暴力枚举三个点,时间复杂度:
(2)枚举所有边
(3)利用矩阵乘法:
对于所有的
然后对于所有
总时间复杂度
(4)利用稀疏矩阵乘法,复杂度
Alon,Yuster,Zwick的算法(1997):
思路还是分为高低频,根据点的度数划分(算法描述中使用的是点的出度)
情况1:
部分点在
该情况的时间复杂度:
情况2:
三个点都在
注意,
运行朴素算法(3),该情况时间复杂度
总时间复杂度:
取
得到
应用:有向图中寻找 元环( 为常数)
Alon,Yusher,Zwick:Color coding,时间复杂度
对于稀疏图:
应用: -Clique( 团)
在无向图中寻找
暴力枚举:
若
应用:带权图
定义:(min,+)矩阵乘
类似于最短路算法中的"松弛"操作
下一章将会讨论这个算法
应用:传递闭包(全局连通性)
给定有向图
朴素算法:
(1)进行
(2)Warshall DP(类似于Floyd):枚举中点
Warshall算法使用重复矩阵乘的改进:
记
对于
总时间复杂度:
Munro算法(1971):
考虑
搜索强连通分量并缩点的方法是Tarjan算法,一种DFS算法,在DFS的过程中将搜索到的顺序作为时间戳标记在每个节点上,并记录从该点回溯能够到达的时间戳最小的节点.在许多博客都有相应的讲解,这里不再赘述.
这样做的意义在于,DAG保证了邻接矩阵必定是一个上三角矩阵,记
将
那么
由于
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现