The-Design-and-Analysis-of-Algorithms 作业8

这篇博客介绍了矩阵链乘法的问题,通过动态规划方法解析了如何找到最小乘法次数。示例中详细展示了计算过程,从初始状态到最终得出最小乘法次数4900,并给出了递归函数设计和源码实现。动态规划法的时间复杂度为O(n^3)。
摘要由CSDN通过智能技术生成

1. 问题

在这里插入图片描述

例如,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. 解析

动态规划法:
在这里插入图片描述
在这里插入图片描述

示例:
P=<10,6,30,20,7,5> n=5
p0=10 p1=6 p2=30 p3=20 p4=7 p5=5
A1:106
A2:6
30
A3:3020
A4:20
7
A5:7*5

(1) r=1
m[1,1]=0
m[2,2]=0
m[3,3]=0
m[4,4]=0
m[5,5]=0

(2)r=2 i=1,2,3,4 j=2,3,4,5
m[1,2]=10630=1800
m[2,3]=63020=3600
m[3,4]=30207=4200
m[4,5]=2075=700

(3)r=3 i=1,2,3 j=3,4,5
m[1,3]=min{m[1,2]+m[3,3]+(A1A2)A3, m[1,1]+ m[2,3]+A1(A2A3)}=4800
m[1,2]+m[3,3]+(A1A2)A3=1800+0+p0p2p3=7800
m[1,1]+ m[2,3]+A1(A2A3)=0+3600+p0p1p3=4800
s[1,3]=1

m[2,4]=min{m[2,3]+ m[4,4]+(A2A3)A4, m[2,2]+ m[3,4]+A2(A3A4)}=4440
m[2,3]+ m[4,4]+(A2A3)A4=3600+0+p1p3p4=4440
m[2,2]+ m[3,4]+A2(A3A4)=0+4200+p1p2p4=5460
s[2,4]=2

m[3,5]=min{m[3,4]+ m[5,5]+(A3A4)A5, m[3,3]+ m[4,5]+A3(A4A5)}=3700
m[3,4]+ m[5,5]+(A3A4)A5=4200+0+p2p4p5=5250
m[3,3]+ m[4,5]+A3(A4A5)=0+700+p2p3p5=3700
s[3,5]=3

(4)r=4 i=1,2 j=4,5
m[1,4]=min{
m[1,1]+ m[2,4]+A1(A2A3A4)=0+4440+1067=4860,
m[1,2]+ m[3,4]+(A1A2)(A3A4),
m[1,3]+ m[4,4]+(A1A2A3)A4
}=4860
s[1,4]=1

m[2,5]=min{
m[2,2]+ m[3,5]+A2(A3A4A5)=0+3700+6305=4600,
m[2,3]+ m[4,5]+(A2A3)(A4A5)=3600+700+6205=4900,
m[2,4]+ m[5,5]+(A2A3A4)A5=4440+0+675=4650
}=4600
s[2,5]=2

(5)r=5 i=1 j=5
m[1,5]=min{
m[1,1]+ m[2,5]+A1(A2A3A4A5)=0+4600+6105=4900,
m[1,2]+ m[3,5]+(A1A2)( A3A4A5),
m[1,3]+ m[4,5]+ (A1A2A3)(A4A5),
m[1,4]+ m[5,5]+ (A1A2A3A4)A5=4860+0+1075=5210
}=4900
s[1,5]=1

所以最小乘法次数为:4900
s[1,5]=1 A1(A2A3A4A5)
s[2,5]=2 A2(A3A4A5)
s[3,5]=3 A3(A4A5)
A1(A2(A3(A4A5)))

3. 设计

在这里插入图片描述

int recurMatrixChain(int* data,int i, int j) {//递归
if (i == j) { // 递归到最小单元
m[i][j] = 0;
s[i][j] = i;
return m[i][j];
}
m[i][j] = 1 << 30; //无穷大
s[i][j] = i; //在i分割
for (int k=i; k<=j-1;k++) { // 从i到j-1开始递归,求最小值,然后加上整体数据
int q = recurMatrixChain(data, i, k) + recurMatrixChain(data, k+1, j) + data[i-1]*data[k]*data[j]; //data[0]*data[k]*data[j]
if (q < m[i][j]) {
m[i][j] = q;
s[i][j] = k;
}
}
return m[i][j];
}

4. 分析

T(n) = O(n3)

5. 源码

https://github.com/LiChunning/The-Design-and-Analysis-of-Algorithms/blob/main/%E7%9F%A9%E9%98%B5%E9%93%BE%E7%9A%84%E4%B9%98%E6%B3%95.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值