Strassen方法完成N*N矩阵的相乘

     因为没有伪代码,所以这个程序自己写了好久,而且还纠结书上创建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个额外数组,,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值