《算法分析与设计》作业8----矩阵链乘法(动态规划)

目录

1.问题

2.解析

3.设计

4.分析

5.源码


 

1.问题

       

给定向量 P,确定一种乘法次序,使得基本运算的总次数达到最小。

例如,P=<10,20,30,40>,则A1:10×20,A2:20×30,A3:30×40,有两种结合次序

1)(A1A2)A3:10×20×30+10×30×40=18000

2)A1(A2A3):10×20×40+20×30×40=32000

 

2.解析

2.1 蛮力法

枚举所有可能的乘法次序,针对每种次序计算基本运算的次数,从中找出具有最小运算次数的乘法次序,

每一种乘法次序对应了一种在 n 个项中加 n-1 对括号。

加 n 对括号的方法数是一个 Catalan 数,等于

时间复杂度如下:

     

2.2 动态规划法

       

      

 

3.设计

3.1 递归算法

(1)伪代码

    

3.2 迭代算法

(1)伪代码

      

(2)示例

P=<8,10,20,30,5,7,12>,n=6

p0=8     p1=10     p2=20    p3=30    p4=5    p5=7     p6=12

A1:8*10  A2:10*20  A3:20*30  A4:30*5  A5:5*7  A6:7*12

 

1)r=1

m[1,1]=0;

m[2,2]=0;

m[3,3]=0;

m[4,4]=0;

m[5,5]=0;

m[6,6]=0;

 

2)r=2, i=1,2,3,4,5, j=2,3,4,5,6

m[1,2]=8*10*20=1600;

m[2,3]=10*20*30=6000;

m[3,4]=20*30*5=3000;

m[4,5]=30*5*7=1050;

m[5,6]=5*7*12=420;

 

3)r=3, i=1,2,3,4, j=3,4,5,6

m[1,3]=min

m[1,1]+m[2,3]+A1(A2A3)=m[1,1]+m[2,3]+p0p1p3=0+6000+8*10*30=8400

m[1,2]+m[3,3]+(A1A2)A3=m[1,2]+m[3,3]+p0p2p3=1600+0+8*20*30=6400

 s[1,3]=2

m[2,4]=min

m[2,2]+m[3,4]+A2(A3A4)=0+3000+p1p2p4=4000

m[2,3]+m[4,4]+(A2A3)A4=6000+0+p1p3p4=7500

s[2,4]=2

m[3,5]=min

m[3,3]+m[4,5]+A3(A4A5)=0+1050+p2p3p5=5250

m[3,4]+m[5,5]+(A3A4)A5=3000+0+p2p4p5=3700

s[3,5]=4

m[4,6]=min

m[4,4]+m[5,6]+A4(A5A6)=0+420+p3p4p6=2220

m[4,5]+m[6,6]+(A4A5)A6=1050+0+p3p5p6=3570

s[4,6]=4

 

4)r=4, i=1,2,3, j=4,5,6

m[1,4]=min{m[1,1]+m[2,4]+A1(A2A3A4),m[1,2]+m[3,4]+(A1A2)(A3A4),

m[1,3]+m[4,4]+(A1A2A3)A4}=min{3900,5400,7600}=4400;  

s[1,4]=1

m[2,5]=min{m[2,2]+m[3,5]+A2(A3A4A5),m[2,3]+m[4,5]+(A2A3)(A4A5),

m[2,4]+m[5,5]+(A2A3A4)A5}=4350;  

s[2,5]=4

m[3,6]=min{m[3,3]+m[4,6]+A3(A4A5A6),m[3,4]+m[5,6]+(A3A4)(A5A6),

m[3,5]+m[6,6]+(A3A4A5)A6}=4620;  

s[3,6]=4

 

5)r=5, i=1,2, j=5,6

m[1,5]=min{m[1,1]+m[2,5]+A1(A2A3A4A5),m[1,2]+m[3,5]+(A1A2)(A3A4A5),

m[1,3]+m[4,5]+(A1A2A3)(A4A5),m[1,4]+m[5,5]+(A1A2A3A4)A5}=4680;  

s[1,5]=4

m[2,6]=min{m[2,2]+m[3,6],A2(A3A4A5A6),m[2,3]+m[4,6]+(A2A3)(A4A5A6),

m[2,4]+m[5,6]+(A2A3A4)(A5A6),m[2,5]+m[6,6]+(A2A3A4A5)A6}=5020;

s[2,6]=4

 

6)r=6, i=1, j=6

m[1,6]=min{m[1,1]+m[2,6]+A1(A2A3A4A5A6),m[1,2]+m[3,6]+(A1A2)(A3A4A5A6),

m[1,3]+m[4,6]+(A1A2A3)(A4A5A6),m[1,4]+m[5,6]+(A1A2A3A4)(A5A6),

m[1,5]+m[6,6]+(A1A2A3A4A5)A6}=5300;

s[1,6]=4

 

所以最小乘法次数为:5300

得到划分方法应为:

s[1,6]=4  (A1A2A3A4)(A5A6)

s[1,4]=1  A1(A2A3A4)

s[2,4]=2  A2(A3A4)

即:(A1(A2(A3A4)))(A5A6)

 

4.分析

4.1 递归算法复杂度

    

              

4.2 迭代算法复杂度

    

5.源码

GitHub源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值