问答题
阅读以下说明和C代码,根据要求回答问题。
[说明]
某工程计算中要完成多个矩阵相乘(链乘)的计算任务。
两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算A
m×n
*B
n×p
,需要m*n*p次乘法运算。
矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵A1
10×100
,A2
100×5
,A3
5×50
三个矩阵相乘为例,若按(A1*A2)*A3计算,则需要进行10*100*5+10*5*50=7500次乘法运算;若按A1*(A2*A3)计算,则需要进行100*5*50+10*100*50=75000次乘法运算。可见不同的计算顺序对计算量有很大的影响。
矩阵链乘问题可描述为:给定n个矩阵<A1,A2,…,A
n
>,矩阵4的维数为p
i-1
×p
i
,其中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的一个最优计算顺序。据此构造递归式:
问答题
根据以上说明和C代码,填充C代码中的空。
【正确答案】
【答案解析】i<n-p;j=i+p;cost[i][k]+cost[k+1][j]+seq[i]*seq[k+1]*seq[j+1];tempTrace=k;
[解析] 本题考查矩阵连乘最优调度问题,是一种动态规划算法。
上述算法中,第一个循环是给n个cost[i][i]赋初值0;第2个循环是个外循环,其循环变量p是矩阵连乘的规模,p=1时先计算出所有规模为2的cost[i,i+1],p=2时再计算出所有规模为3的cost[i,i+2]……最后计算出来的即为我们所求的cost[1,n-1],所以第一个处填i<n-p;第3个循环是内循环,其循环变量i表示矩阵连乘的起始位置,即从1,1+1,…,i,1+i……一直算到n-1,n,所以第二个处填j=i+p;第4个循环用于计算min{cost[i,j](i≤k<j)},所以第三处填“cost[i][k]+cost[k+1][j]+seq[i]*seq[k+1]*seq[j+1];”,而第四个处用于追踪取得最小花费代价的k值,即tempTrace=k,而每一项的计算可在O(1)时间里完成。
问答题
根据以上说明和C代码,该问题采用了______算法设计策略,时间复杂度为______(用O符号表示)。
【正确答案】
【答案解析】动态规划;O(n3)
[解析] 求min(i≤k<j)要做1次比较(k=i,i+1……i而j=i+1),而第3行的循环要做n-1次,故该循环执行完毕要做n-1次比较,第2行的循环i从1做到n-1,故该外循环执行完毕要做O(n
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代码得到的一个最优计算顺序为______(用加括号方式表示计算顺序),所需要的乘法运算次数为______。
【正确答案】
【答案解析】(A1*A2)*((A3*A4)*(A5*A6));2010[解析] 启发式的思路是先把维度最大的消掉,如A5*A6相乘之后,维度30就没有了,所以考虑这两个矩阵先相乘;然后是A3*A4相乘之后,维度12就没有了,所以考虑这两个矩阵相乘;接着,A1*A2相乘之后,维度10就没有了,所以考虑这两个矩阵相乘……从而确定相乘的顺序(A1*A2)*((A3*A4)*(A5*A6)),需要的计算开销分别是5*50*6=1500,3*12*5=180,5*10*3=150,3*5*6=90,5*3*6=90,把上述值相加,即1500+180+150+90+90=2010。