(算法分析设计)第3章动态规划

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} // 时间复杂度为O(n) #
举例
12
i1 0 1
2
0
3
4
5
6
j 34
13 23 03
0
56
33 33 33 45 05
0
s[i][j]
1:6 A[1:6]的最佳 分割点为“3”
1:3 A[1:3]的最佳 分割点为“1”
4:6
1
2:3
4:5 6
A[4:6]的最佳 分割点为“5”
最优解: ((A1(A2A3))((A4A5)A6))
矩阵连乘问题
矩阵连乘问题
矩阵连乘问题
给定 n个矩阵 A1,A2, .., . An,其A中 i与Ai1是可乘的,
i 1,2,...n,1。矩阵连乘问题 察就 这 n个 是矩 考阵的
连乘A积 1A2..A. n。
Ai的列数= Ai+1的行数
矩阵连乘满足结合律 A1A 2 A3 A 4 ( A1( A 2 A 3 A 4 )) ( A1( A 2 A3) A 4) (( A1 A 2 )( A 3 A 4 )) ( A1(( A 2 A 3 ) A 4 )) ( A1( A 2 ( A 3 A 4 )))
if (n==0) return 0; if (n==1) return 1; return F(n-1, a)+F(n-2, a); }
由于计算F(n)是以计算它的两个重叠子问题 F(n-1) 和F(n-2)的形式来表达的,所以,可以设计一张表 填入n+1个F(n)的值(避免重复计算)。
求解Fibonacci数F(9)的填表过程 如下:
计算最优值
计算矩阵连乘积A1A2A3A4A5A6
A1
A2
A3
A4
3035 3515 155 510
A5 1020
A6 2025
m[2][2]m[3][5] p1p2p5
0250035152013000
m[2][5]minm[226][233]51m0[04]0[53]5p51p32p05 7112255
T(n)
=n
n/2
n/2
n/2
n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4)
3
计算Fibonacci数列的递归算法:
int F(int n, int a[N]) {
• 分治法子问题的个数往往是问题规模的指数函数;动 态规划分解后的子问题往往不互相独立,不同的子问 题的个数只是多项式量级
• 采用记录表的方法来保存所有已解决问题的答案
• 一个最优化多步决策问题适合用动态规划法求解 有两个要素:最优子结构特性和重叠子问题。
动态规划算法的一般步骤
• 动态规划算法的一般步骤
m[2][4]m[5][5] p1p4p5
4375035102011375
计算结果
j
12 3 4 5 6
i 1 0 15750 7875 9375 11875 15125
2
0 2625 4375 7125 10500
3
0 750 2500 5375
4
0 1000 3500
5
0 5000
6
0
m[i][j]
2
)
用动态规划法求解
构造最优解 计算最优值 建立递归关系 分析最优解的结构
求解步骤
• 分析最优解的结构 • 建立递归关系 • 计算最优值 • 构造最优解
分析最优解的结构
• 将矩阵连乘积AiAi+1…Aj记作A[i:j]
– 把问题转化成考察A[1:n]的最优计算次序问题 – 设计算次序在A[k]处将矩阵断开最优,则总计
最优子结构性质是该问题可用动态规划算法求解的第一个标志
•对矩阵:A1A2A3A4A5A6,可能的最优解
A1(A2A3)|A4(A5A6)
• 最优解:A[1:6]=A[1:3]+A[4:6]+A[1:3]*A[4:6]
– A[1:3]与A[4:6]也必分别为最优解(计算总量最 少),因为其无关;
– 若有A’[1:3]小于A[1:3],由后两项不改变,则 A[1:6]不是最小,故与前提矛盾;
pi1pk pj 为A[i:k] 和A[k+1:j]相乘的计算量
m [i]j[ ] mm [ii]n k[ ] { m [i k 0 k j 1 ]j[ ]p i 1p kp j}ii jj
ห้องสมุดไป่ตู้
s[i][j]=k
求解步骤
• 分析最优解的结构 • 建立递归关系 • 计算最优值 • 构造最优解
计算最优值
动态规划算法的要素
*多阶段决策过程
• 多阶段决策过程(Multistep Decision Process)
举例说明
考察矩阵 A1A2A3A4A5A6 的连乘积
j
123456 i1
2 3 4 5 6
计算次序
计算次序说明:
m[1][1], m[2][2], m[3][3], m[4][4], m[5][5], m[6][6]—> m[1][2],m[2][3], m[3][4], m[4][5], m[5][6]—> m[1][3],m[2][4], m[3][5], m[4][6]—> m[1][4],m[2][5],m[3][6]—> m[1][5],m[2][6]—> m[1][6]
((AB)C)D 87500 (AB)(CD) 36000 A(B(CD)) 10500 (A(BC))D 34500 A((BC)D) 16000
矩阵连乘积的最优计算次序问题
对于给定的相n个 继矩阵{A1, A2,...,An} Ai的维数为pi1 pi,i 1,2,...,n
矩阵连乘的最优次题 序: 问 如何确定矩阵连乘A1A积2...An的计算次序,使得该 按照 计算次序,矩阵连所 乘需 积要的数乘次数。 最少
需要处理的不同
子问题个数?
对1于 ijn不同的(i,有 j)对序 应对 于不同
子问题,不 个同 数子 最 问 n 2多 n题 只 (n的 2有 )个。
在递归求解时,会遇到很多重叠的子问题。
!方案:
在求解过程中,保存所有已经解决的子问题答案。 ——每个子问题只计算一次,后面计算需要时仅需 要简单查找一下即可,从而避免大量重复计算。
当i<j时 m[i][j] = 0+m[i+1][j]+ p[i-1]*p[i]*p[j]; 问题:
for (k = i+1; k < j; k++) {
如何确定k?
t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
当iif (jt时 < m, [i][j])利 m[i用 ][j] =最 t; 优子 算m结 [i]构 [j] 计
• 切入点
– 考察不同计算次序下的计算量
不同计算次序下的计算量
• 计算次序一:(A1A2)A3
– 计算量=10*100*5+10*5*50=7500次数乘
• 计算次序二:A1(A2A3)
– 计算量=10*5*50+10*100*50=75000次数乘
矩阵的计算量与 计算次序有关
例 有4个矩阵A, B, C, D,它们的维数分别是: A=50×10,B=10×40,C=40×30,D=30×5 连乘积ABCD共有五种加括号的方式
1. 找出最优解的性质,并刻画其结构特征; 2. 递归地定义最优值; 3. 以自底向上的方式计算出最优值; 4. 根据计算最优值时得到的信息,构造最优解;
动态规划算法 的基本步骤
如只需要求出最优值,则步骤4可省略; 如需要求解问题的最优解,则必须执行步骤4
通过应用范例学习动态规划算法设计策略。 (1)矩阵连乘问题; (2)最长公共子序列; (3)最大子段和 (4)凸多边形最优三角剖分; (5)多边形游戏; (6)图像压缩; (7)电路布线; (8)流水作业调度; (9)背包问题; (10)最优二叉搜索树。
求解步骤
• 分析最优解的结构 • 建立递归关系 • 计算最优值 • 构造最优解
建立递归关系
• 递归地定义最优值。 • 设计算A[i:j],1≤i≤j ≤n,所需的最少数乘次数
为m[i][j]
——则原问题的最优解为m[1][n] – 考察两种情况
• i=j; • i<j;
当i=j时
当ij时, A[i: j]Ai为单一矩阵 m[i][i]0,i 1,2,...n,
}
m[i][j]m[i][k]m[k1][j]pi1pk pj
分各析m:[i][j]的值给出了子问题最优解的代价。为
因了为帮,i助≤k<跟j,踪所以构k的造位最置优只有解j-i,种可定能义,s即[ki∈][j{]i为,i+使1,…m,[ji}][j] k取是这最j-优i个值位置时中对使应计算的量k达值到。最小的位置。
0123456789 0 1 1 2 3 5 8 13 21 34
动态规划算法的基本思想
• 动态规划算法的基本思想
– 其基本思想与分治算法的思想类似——分而治之
– 对每个子问题都只计算一次,不管该子问题以后 是否会被用到,都将其保存到一张表中,避免每 次遇到各个子问题都要重复计算答案。
– 与分治法的不同之处
两个矩阵的相乘问题
• 两个矩阵的相乘问题
– A为p*q的矩阵 – B为q*r的矩阵 – C=AB为p*r的矩阵 ——计算C的标准算法,共需要p*q*r次数乘
找不到切入点
考察{A1,A2,A3}三个矩阵连乘
• 假定:
– A1为10*100的矩阵 – A2为100*5的矩阵 – A3为5*50的矩阵
算量为: A[1:k] 的计算量加上A[k+1:n]的计算 量,再加上A[1:k] 和A[k+1:n]相乘的计算量。
l 关键特征
l A[1:n]的最优计算次序所包含的计算矩阵子链A[1:k] 和A[k+1:n]的次序也是最优的。(可用反证法证明)
——问题的最优解包含了其子问题的最优解,这种性 质称为最优子结构性质。
第3章 动态规划
1
算法总体思想
n 动态规划算法与分治法类似,其基本思想也是将待求解问题分 解成若干个子问题
T(n)
=n
T(n/2)
T(n/2)
T(n/2)
T(n/2)
2
算法总体思想
n 但是经分解得到的子问题往往不是互相独立的。不同子问题的 数目常常只有多项式量级。在用分治法求解时,有些子问题被 重复计算了许多次。
算法的占用空O间 (n2为 )
优于穷举搜索方法
求解步骤
• 分析最优解的结构 • 建立递归关系 • 计算最优值 • 构造最优解
构造最优解
• 构造最优解
– 利用算法实现过程中保存在s[i][j]中的分割点 信息来重构最优解
• s[i][j]中的数k表明计算矩阵A[i:j]的最佳方式应 在矩阵Ak和Ak+1断开,即最优加括号方式为 (A[i:k])(A[k+1:j])
// 根据计算出的断点矩阵s指示的加括号方式, 输出计算A[i:j]的最优先次序。
void Traceback(int i, int j, int **s) { if (i==j) return; Traceback(i, s[i][j], s); Traceback(s[i][j]+1, j, s); cout<<i<<s[i][j]<<“;”<<s[i][j]+1<<j;
m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j];
s[i][j] = i;
for (k = i+1; k < j; k++) {
t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
if (t < m[i][j]) { m[i][j] = t; s[i][j] = k; }
方案1:穷举搜索法
• 穷举搜索法
– 列举出所有可能的计算次序,选取其中数乘最小的 计算次序;
– 一定可以找到最优计算次序

P(n)随n的增长呈指数增长 P(n)
n1
1 P(k )P(n
k)
n 1 n 1
天 啊…
k 1
P(n) C (n 1)
其中
C (n)
n
1
1
2n n
(
4n n3/
}
} } //算法的计算时间上界为O(n3)
*p 存放Ai的维数; **m 存放最优值;
**s 存放断开位置,用于递归地构
造相应的最优解。
算法复杂性分析
算法的主要计算量 于取 对r,决 i和k的3重循环。
循环体内的计算(量 1), 3为 重循环的总次数 (n3为 )。
算法的计算时间上 O(n界3)为
12
i1 0 1
2
0
3
4
5
6
j 34
13 23 03
0
56
33 33 33 45 05
0
s[i][j]
void MatrixChain(int *p,int n,int **m,int **s) {
for (j = 2; j <= n; j++)
for (i = j-1; i >= 1; i--) {
相关文档
最新文档