【算法导论】strassen算法:比较快的矩阵乘法算法

本文介绍了矩阵乘法的三种算法:迭代算法、简单分治算法和Strassen分治算法。Strassen算法通过数学技巧减少了递归次数,达到O(nlog7)的时间复杂度,但因其常数因子大、存储需求高,实际应用中可能并非最佳选择。Coppersmith和Winograd提出的算法拥有最优的O(n2.376)时间复杂度。
摘要由CSDN通过智能技术生成

考虑两个 n 级矩阵 A, B, 矩阵 C = A * B. 则有 c i j = ∑ k = 1 n a i j ∗ b k j c_{ij} = \sum_{k=1} ^n a_{ij}*b_{kj} cij=k=1naijbkj.
对于两个矩阵相乘的问题,我们给出三个解决办法:迭代算法、简单分治算法、strassen分治算法。


解法一:迭代算法,即使用三层循环,这是最简单的算法,其代码如下:

void matrix_multiply( vector<vector<int>>& A, vector<vector<int>>& B, vector<vector<int>>& C){
    // A, B, C 均为 n * n 矩阵,且 C[i][j] = 0;
    for( int i = 0; i < A.size(); i++)
        for(int j = 0; j < A.size(); j++)
            for( int k = 0; k < A.size(); k++)
                C[i][j] += A[i][k]* B[k][j];
}

测试用例:
在这里插入图片描述
算法分析:由于使用了三层循环,得到其时间复杂度为 O ( n 3 ) O(n^3) O(n3).


方法二:简单的分治算法
利用分块矩阵计算矩阵乘法。
对于 n 级矩阵A, 我们可以将其划分为 4 个 n/2 级矩阵,例如:
A n ∗ n = ( A 11 A 12 A 21 A 22 ) A_{n*n} = \begin{pmatrix} A_{11} &amp; A_{12} \\ A_{21} &amp; A_{22} \\ \end{pmatrix} Ann=(A11A21A12A22)

同理,有
B n ∗ n = ( B 11 B 12 B 21 B 22 ) , C n ∗ n = ( C 11 C 12 C 21 C 22 ) B_{n*n} = \begin{pmatrix} B_{11} &amp; B_{12} \\ B_{21} &amp; B_{22} \\ \end{pmatrix} , C_{n*n} = \begin{pmatrix} C_{11} &amp; C_{12} \\ C_{21} &amp; C_{22} \\ \end{pmatrix} Bnn=(B11B21B12B22),Cnn=(C11C21C12C22)
则 C = AB 可以改写为:
( C 11 C 12 C 21 C 22 ) = ( A 11 A 12 A 21 A 22 ) ( B 11 B 12 B 21 B 22 ) \begin{pmatrix} C_{11} &amp; C_{12} \\ C_{21} &amp; C_{22} \\ \end{pmatrix} = \begin{pmatrix} A_{11} &amp; A_{12} \\ A_{21} &amp; A_{22} \\ \end{pmatrix} \begin{pmatrix} B_{11} &amp; B_{12} \\ B_{21} &amp; B_{22} \\ \end{pmatrix} (C

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值