作业8 矩阵乘法链

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)

5.     源码

https://github.com/fanchile/Algorithm

猜你喜欢

转载自www.cnblogs.com/Fanchile/p/12702854.html