软题库 移动APP 扫码下载APP 随时随地移动学习 培训课程
当前位置:信管网 >> 在线考试中心 >> 信息系统项目管理师题库 >> 试题查看
试卷年份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[i][j]表示Ai+1*Ai+2*...Aj+1的最优计算的计算代价。最终需要求解cost[0][n-1]。
【C代码】
    算法实现采用自底向上的计算过程。首先计算两个矩阵相乘的计算量,然后依次计算3个矩阵、4个矩阵、…、n个矩阵相乘的最小计算量及最优计算顺序。下面是算法的C语言实现。 
(1)主要变量说明 
n:矩阵数 
seq[]:矩阵维数序列 
cost[][]:二维数组,长度为n*n,其中元素cost[i][j]表示Ai+1*Ai+2*…Aj+1的最优计算的计算代价 
trace[][]:二维数组,长度为n*n,其中元素trace[i][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[i][i] = 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[i][j] = tempCost; 
            trace[i][j] = tempTrace; 
        } 
    } 
    return cost[0][n-1]; 

【问题1】(8分)
    根据以上说明和C代码,填充C代码中的空(1)~(4)。
【问题2】(4分)
    根据以上说明和C代码,该问题采用了 (5) 算法设计策略,时间复杂度 (6) 。(用O符号表示)
【问题3】(3分)
    考虑实例n=6,各个矩阵的维数:A1为5*10,A2为10*3,A3为3*12,A4为12*5,A5为5*50,A6为50*6,即维数序列为5,10,3,12,5,50,6。则根据上述C代码得到的一个最优计算顺序为 (7) (用加括号方式表示计算顺序),所需要的乘法运算次数为 (8) 。


相关试题

推荐文章