软考系列-2022上半年试题四-C程序算法

文章介绍了在工程计算中解决多个矩阵相乘问题的算法,重点在于降低计算量。通过使用最优子结构的性质,构建了自底向上的递归算法来找到矩阵连乘的最小计算代价和最优计算顺序。代码示例展示了C语言实现的矩阵链乘算法,用于计算给定矩阵序列的最小乘法次数。
摘要由CSDN通过智能技术生成

软考系列-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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值