Strassen Algorithm

来源:互联网 发布:js class 空格 编辑:程序博客网 时间:2024/06/07 09:31
[C11 C12 ] [A11 A12 ] [B11 B12 ] = × C21 C22 A21 A22 B21 B22

 

普通方法

C11 =A11*B11+A12*B21

C12=。。

C21=。。。

C22=。。。

此递归公式为T(n)=8T(n/2)+O(n^2)  时间复杂度为O(n^3)

Strassen方法的递推公式为:

 

 P = (A + A )(B + B ) 1 11 22 11 22 P2 = (A21 + A22)B11 P3 = A11(B12 - B22) P4 = A22(B21 - B11) P5 = (A11 + A12)B22 P = (A - A )(B + B ) 6 21 11 11 12 P7 = (A12 - A22)(B21 + B22)C11 = P1 + P4 - P5 + P7C12 = P3 + P5C21 = P2 + P4C22 = P1 + P3 - P2 + P6

 

 { 7T (n/2) + cn if n > 1T (n) = c if n = 1

T(n) = O(nlog 7) = O(n2.81).

 

时间复杂度就马上降下来了。。但是不要过于乐观。

从实用的观点看,Strassen算法通常不是矩阵乘法所选择的方法:

1 在Strassen算法的运行时间中,隐含的常数因子比简单的O(n^3)方法常数因子大

2 当矩阵是稀疏的时候,为稀疏矩阵设计的算法更快

3 Strassen算法不像简单方法那样子具有数值稳定性

4 在递归层次中生成的子矩阵要消耗空间。

 

所以矩阵乘法一般意义上还是选择的是朴素的方法,只有当矩阵变稠密,而且矩阵的阶数>20左右,才会考虑使用Strassen算法。

原创粉丝点击