因为没有伪代码,所以这个程序自己写了好久,而且还纠结书上创建12个新矩阵,不用复制元素就完成分解,利用下标计算,,我最后还是没想出来,。虽然这个算法的渐进复杂度为θ(n^lg7)低于普通迭代的θ(n^3),但是需要很多其他的代价,会让运行时间增加常量倍,所以其实实用性不高,当然这个方法的发现是具有重大意义的。
然后书上讲的是当n降为1的时候进行简单的乘法计算,我发现如果在n=2的时候就进行计算可以加快运行时间,,所以可以认识在,在算法的运用中,或者应该结合两种算法,在一个平衡点上获得最大性能。
下面是代码:虽然看着很长,有一半都在申请数组空间和删除动态数组空间,
#include<iostream>
#include"MyTimer.h"
#include<fstream>
using namespace std;
void sub(int **a,int **b,int n,int **c){
for(int i=0;i!=n;++i){
for(int j=0;j!=n;++j)
c[i][j]=a[i][j]-b[i][j];
}
}
void add(int **a,int **b,int n,int **c)
{
for(int i=0;i!=n;++i){
for(int j=0;j!=n;++j){
c[i][j]=a[i][j]+b[i][j];}
}
}
void strassen_multiply(int **a,int **b,int **c,int n){ //Strassen理论上时间复杂度为θ(n^lg7)但是实际测试中由于需要很多额外的开销,速度明显比普通迭代法慢
if(n==1){ //n=1直接运算, 其实可以n=2的时候就直接运算,可以快很多,
c[0][0]=a[0][0]*b[0][0];
}
else{ //按照strassen的方法一步步算,,
int mid=n/2;
//书上说不用创建12个额外数组,,