一个n-by-n矩阵是n行n列的数排列起来的方阵。矩阵A第i行第j列数记为aij。定义两个n阶矩阵的乘法C = A * B,其中cij = ai1b1j + ai2b2j + ... + ainbnj
基本的矩阵乘法是O(n3)的,程序如下:
void matmult ( matrix a , matrix b , matrix & c)
{
c.m = a.m; c.n = b.n
for(int i = 1; i <= a.m; i ++)
for(int j = 1; j <= b.n; j ++)
{
c. num [i][j ] = 0;
for( int k = 1; k <= a.n; k ++)
c. num[i][j ] += a.num [i][k ] * b.num [k][j];
}
}
考虑基本分治算法。把矩阵分两四个子矩阵。
则r = ae + bg, s = af + bh, t = ce + dh, u = cf + dg,一共需要8次乘法和4次加法。因为每次加法需要O(n^2)的时间,因此递归方程为T(n)=8T(n/2)+ O(n^2),解为O(n3),和暴力乘法一样。
Strassen的改进方法和Karatsuba快速乘法类似。记P1 = a(f - h), P2=(a + b)h, P3=(c + d)e, P4 = d(g - e), P5=(a + d)(e + h), P6=(b - d)(g + h), P7=(a - c)(e + f),则:r = P5 +P4-P2 +P6, s = P1 +P2, t = P3 +P4, u = P5 +P1 -P3 -P7。一共7次乘法,18次加减法,而且并没有使用过乘法交换律(矩阵乘法不满足交换律)!
这样,方程变为T(n) = 7T(n/2) + O(n2),它的解为O(nlog 7)=O(n^2.81),比暴力乘法略好。目前最好的矩阵乘法算法时间复杂度为O(n^2.376),但是人们还不知道矩阵乘法
的复杂度下限是多少。