算法设计与分析--最小链乘

链乘问题

两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算Am×n*Bn×p,需要m*n*p次乘法运算。

矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵A110×100,A2100×5,A35×50三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行10*100*5+10*5*50=7500次乘法运算;若按A1*(A2*A3)计算,则需要进行100*5*50+10*100*50=75000次乘法运算。可见不同的计算顺序对计算量有很大的影响。

矩阵链乘问题可描述为:给定n个矩阵<A1,A2,…,An>,矩阵Ai的维数为pi-1×pi,其中i=1,2,…,n。确定一种乘法顺序,使得这n个矩阵相乘时进行乘法的运算次数最少。

由于可能的计算量非常庞大,对较大的n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘一具有最优子结构,即若A1*A2*…*An的一个最优计算顺序从第k个矩阵处断开,即分为A1*A2*…*Ak和Ak+1*Ak+2*…*An两个子问题,则该最优解应该包含A1*A2*…*Ak的一个最优计算顺序和Ak+1*Ak+2*…*An的一个最优计算顺序。据些构造递归式

式中,cost[i][j]表示Ai+1*Ai+2*…*Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。

 

提示:

  1. 问题的初始值是i=j时的值,即cost[i][j]主对角线上的值,全为0;
  2. 首先计算两个矩阵相乘的计算量,即cost[0][1], cost[1][2], cost[2][3]…,然后再计算三个矩阵相乘的计算量,即cost[0][2], cost[1][3], cost[2][4]…
  1. 给定若干个矩阵的大小,计算并输出链乘最小计算量。

 

其中,size sequence指每个矩阵依次的大小,如下图中的6个矩阵大小分别为:5*10,10*3,3*12,12*5,5*50和50*6。

代码:

#include<iostream>  
using namespace std;  
#define Max 10000000 
#define M 20
void Get_Cost(int *p,int Length,int m[][M])  
{  
    int q,n=Length-1;  
    for(int i=1;i<=n;i++) m[i][i]=0;  
    for(int l=2;l<=n;l++)    /* 矩阵链的长度 */  
    {  
        for(int i=1;i<=n-l+1;i++)   
        {  
            int j=i+l-1;         /* 等价于 l=j-i+1 */  
            m[i][j]=Max;  
            for(int k=i;k<=j-1;k++)  
            {  
                q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];  
                if(q<m[i][j])  
                {  
                    m[i][j]=q;  
                }  
            }  
        }  
    }  
}   
int main()  
{  
   int p[M]={5,10,3,12,5,50,6};  //初始化题目要求的矩阵序列的数组
   int m[M][M];					//m[M][M]计算代价表
   Get_Cost(p,M,m);				//调用Get_Cost方法找到链乘的最小计算量
   cout<<"The least cost is: \n"<<m[1][6]<<endl;   //输出计算量
   return 0;  
}  

 

运行截图:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值