这里写自定义目录标题
软考系列-2022上半年试题四-C程序算法
说明
某工程计算中要完成多个矩阵相乘(链乘)的计算任务,对矩阵相乘进行以下说明。
(1)两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。假设采用标准的矩阵相乘算法,计算,需要次乘法运算,即时间复杂度为
(2)矩阵相乘满足结合律,多个矩阵相乘时不同的计算顺序会产生不同的计算量。以矩阵,,三个矩阵相乘为例,若按计算,则需要进行次乘法运算,若按计算,则需要进行次乘法运算。
矩阵连乘问题可描述为:给定个矩阵,对较大的,可能计算的顺序数量非常庞大,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵连乘问题具有最优子结构,即若的一个最优计算顺序从第个矩阵处断开,即分为和两个子问题,则该最优解应该包含的一个最优计算顺序和的一个最优计算顺序。据此构造递归式:
其中,cost[i][j]表示的最优计算的代价。最终需要求解cost[0][n – 1]
算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵、…、个矩阵相乘的最小计算量及最优计算顺序。下面是算法的C语言实现。
(1)主要变量说明
n:矩阵数、
seq[]:矩阵维数序列
cost[][]:二维数组,长度为,其中元素cost[i][j]表示的最优计算的计算代价
trace[][]:二维数组,长度为,其中元素trace[i][j]表示的最优计算对应的划分位置
代码
#include <stdio.h>
#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[i][i] = 0; }
for (p = 1; p < n; p ++ ) {
for (i = 0; i < n - p; i ++ ) {
j=i+p ;
tempCost = -1;
for (k = i; k<j ; k ++ ) {
temp = cost[i][k]+cost[k+1][j]+seq[i]*seq[k+1]*seq[j+1] ;
if(tempCost == -1 || tempCost > temp) {
tempCost = temp;
tempTrace = k;
}
}
cost[i][j] = tempCost;
trace[i][j]=tempTrace;
}
}
return cost[0][n - 1];
}
int main()
{
/* Write C code in this online editor and run it. */
printf("Hello, World! \n");
int seq[] = {15,5,10,20,25};
int n = 4;
int res = cmm(n,seq);
printf("%d ",res);
return 0;
}