1. 问题
设A1,A2,…,An为n个矩阵的序列,其中Ai为Pi-1 *Pi阶矩阵,这个矩阵链的输入用向量P = <P0,P1,…Pn>给出。
给定向量P,求出 一种乘法序列,使得基本运算的总次数达到最小。
2. 解析
主要用动态规划的策略来解决这个问题。因为要保存已经解决过的子问题,因此我们再引入一个值m[i,j],用来表示矩阵序列Ai…j所用的基本运算的最少次数。为了能够更好的应用子问题,因此我们再引入一个变量k,用来表示这个矩阵链的最后一次乘法运算的位置。因此我们可以得出递推方程
0 i = j
m[i,j] =
min{m[i,k]+m[k+1,j]+Pi-1PkPj}其中i<=k<j i<j
从最短的长度1即i = j开始计算,当i=1,j = n时,就可以得到整个矩阵乘法链的最小运算次数了。
给定示例进行分析
A1:20*50
A2:50*70
A3:70*5
A4:5*10
P = <20,50,70,5,10> n = 5
(1)r = 1
m[1,1] = 0
m[2,2] = 0
m[3,3] = 0
m[4,4] = 0
(2)r = 2 i = 1,2,3;j = 2,3,4
m[1,2] = 20*50*70 = 70000
m[2,3] = 50*70*5 = 17500
m[3,4] = 70*5*10 = 3500
(3)r = 3 i = 1,2;j = 3,4
m[1,3]=min{m[1,1]+m[2,3]+A1(A2A3),min[1,2]+min[3,3]+(A1A2)A3}=min{0+17500+5000,70000+0+7000} = 22500 s[1,3] = 1
m[2,4]=min{m[2,2]+m[3,4]+A2(A3A4),m[2,3]+m[4,4]+(A2A3)A4}=min{0+3500+35000,17500+0+2500}=20000 s[2,4]=3
(4)r = 4 i = 1;j = 4
m[1,4] = min{m[1,1]+[2,4]+A1(A2A3A4), m[1,2]+[3,4] +(A1A2)(A3A4), m[1,3]+[4,4] +(A1A2A3)A4} = min{0+20000+10000,70000+3500+14000,22500+0+1000} = 23500 s[1,4] = 3
这时在s中就存储了序列的划分规则,通过s就可以得到最终结果了。
3. 设计
MatrixChain(p,n)
给所有的m[i,j]赋值为0,
For r = 2 to n do
For I = 1 to n-r+1 do
J = i+r-1
m[I,j] = m[i+1,j]+Pi-1PkPj
s[I,j] = I;
for k = i+1 to j-1 do
t = m[i,k]+m[k+1,j]+Pi-1PkPj
if t < m[I,j]
m[I,j] = t
s[I,j] = k
4. 分析
算法的主要实现使用了迭代来实现,程序的主要结构就是三个循环,因此算法复杂度为O(n2)