(2013年下半年下午试题四)阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。 【说明】 某工程计算中要完成多个矩阵相乘(链乘)的计算任务。 两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进

admin2018-07-27  25

问题 (2013年下半年下午试题四)阅读下列说明和C代码,回答问题1至问题3,将解答写在答题纸的对应栏内。
    【说明】
    某工程计算中要完成多个矩阵相乘(链乘)的计算任务。
    两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算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[j]表示Ai+1*Ai+2*…*Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。
    【C代码】
    算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵、……、n个矩阵相乘的最小计算量及最优计算顺序。下面是该算法的C语言实现。
  (1)主要变量说明
  n:矩阵数
    seq[]:矩阵维数序列
    cost[][]:二维数组,长度为n*n,其中元素cost[j]表示Ai+1*Ai+2*…*Aj+1的最优计算的计算代价
    trace[][]:二维数组,长度为n*n,其中元素trace[j]表示Ai+1*Ai+2*…*Aj+1的最优计算对应的划分位置,即k
    (2)函数cmm
#define N  100
int cost[N][N];
  int trace[N][N];
  int cmm(int n,int seq[]){
    int tempCost;
    int tempTrace;
    int i,j,k,p;
    int temp;
    for(i=0;i<n;i++){  cost=0; }
    for(p=1;p<n;p++){
    for(i=0;_______(1);i++){
    _____(2);
    tempCost=-1;
    for(k=i;k<j;k++){
    temp=______(3);
    if(tempCost==-1 ||tempCost>temp){
    tempCost=temp;
    _______(4);
    }
    }
    cost[j]=tempCost;
    trace[j]=tempTrace;
    }
    }
    return cost[0][n-1];
  }
根据以上说明和C代码,填充C代码中的空(1)~(4)。

选项

答案(1)i<n-p (2)j=i+p (3)cost[i][k]+cost[k+1][j]+seq[i]*seq[1(+1]*seq[+1](4)tempTrace=k;

解析 上述算法中,第一个循环是给n个cost赋初值0;第二个循环是个外循环,其循环变量p是矩阵连乘的规模,(p=1时)先计算出所有规模为2的cost[i,i+1],(p=2)再计算出所有规模为3的cost[i,i+2],……,最后计算出来的即为我们所求的cost[1,n-1],所以空(1)处应填入i<n-p;第三个循环是内循环,其循环变量i表示矩阵连乘的起始位置,即从l,1+1,…,i,1+i,…,一直算到n-1,n,所以空(2)处应填入j=i+p;第四个循环用于计算min{cost[i,j](i≤k<j)},所以空(3)处应填入cost[k]+cost[k+1][j]+seq*seq[k+1]*seq[i+1];空(4)处用于追踪取得最小花费代价的k值,应填入tempTrace=k。
转载请注明原文地址:https://jikaoti.com/ti/0Fi7FFFM
0

相关试题推荐
最新回复(0)