封面来自Swift Algorithm Club: Strassen’s Algorithm | Kodeco
对于正常情况,矩阵乘法需要O(n3)的时间复杂度(假设m,p=n)
考虑分块矩阵C=AB
A=[A11A21A12A22],B=[B11B21B12B22],C=[C11C21C12C22]
矩阵乘法可以表示为
[C11C21C12C22]=[A11×B11+A12×B21A21×B11+A22×B21A11×B12+A12×B22A21×B12+A22×B22].
总共需要需要8次乘法和4次加法。另一种理解方式(递归情况下):矩阵每增加一倍,计算开销是原来的8倍→O(n3) 。因此如果可以减少乘法运算的次数,就可以加快矩阵乘法的计算。
定义
M1=(A11+A22)×(B11+B22);M2=(A21+A22)×B11;M3=A11×(B12−B22);M4=A22×(B21−B11);M5=(A11+A12)×B22;M6=(A21−A11)×(B11+B12);M7=(A12−A22)×(B21+B22),
则:
[C11C21C12C22]=[M1+M4−M5+M7M2+M4M3+M5M1−M2+M3+M6].
该方法总共只需要7次乘法,但是加法增加到了18次。
复杂度计算
令f(n)表示矩阵乘法的复杂度,g(n)表示矩阵加法的复杂度,则有:
f(n)=7f(2n)+18g(2n)
其中f是一个O(np),2<p≤3的阶,g是O(n2)阶。因此省略掉g,则有:
f(n)=7f(2n)=72f(4n)=7log2n−1f(2log2n−1n)=7log2n−1f(2)=2log27(log2n−1)f(2)=2log2nlog27/2log27f(2)=Cnlog27
因此Strassen’s Algorithm的复杂度为O(nlog27)≈O(n2.8)