第八讲 动态规划与最短路径(2)_727104450

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

12 12 12 12 0 10 12 22 22 22 0 10 12 22 30 32 0 10 15 25 30 37
0
0
w4 = 2, v4= 15 4
背包问题——伪码 Algorithm DPKnapsack(w[1..n], v[1..n], W)
var Z[1..n,0..W], P[1..n,1..W]: int for j := 1 to W do if j<w[1] then Z[1,j] := 0 else Z[1,j] := v[1]; P[i,j] := j-w[1]; for i := 0 to n do Z[i,0] := 0 for i := 1 to n do for j := 1 to W do if w[i] j and v[i] + Z[i-1,j-w[i]] > Z[i-1,j] then V[i,j] := v[i] + Z[i-1,j-w[i]]; P[i,j] := j-w[i] else Z[i,j] := Z[i-1,j]; P[i,j] := j return Z[n,W] and the optimal subset by backtracing
0 c[i, j ] c[i 1, j 1] 1 max(c[i, j 1], c[i 1, j ])
如果i,j>0且xi y j 如果i,j>0且xi y j i 0或j 0
15
15.4 最长公共子序列-计算最 优值
直接利用上式容易写出一个计算c[i,j]的递归算法,但其 计算时间是随输入长度指数增长的。由于在所考虑的子 问题空间中,总共只有θ(m*n)个不同的子问题,因此, 用动态规划算法自底向上地计算最优值能提高算法的效 率。 计算最长公共子序列长度的动态规划算法 LCS_LENGTH(X,Y) 输入:X=<x1, x2, …, xm> Y=<y1, y2, …, yn> 输出:c[0..m ,0..n]和b[1..m ,1..n]。其中c[i,j]存储Xi 与Yj的最长公共子序列的长度,b[i,j]记录指示c[i,j]的 值是由哪一个子问题的解达到的,这在构造最长公 共子序列时要用到。 X和Y的最长公共子序列的长度记录于c[m,n]中。
用循环填表:
表中的项:子问题的最优解 循环嵌套的层数=表格的维度(子问题分解的维度)+1( 如果做选择时需要) 循环的初始值:平凡子问题之外的最小子问题(需用递归 求解的最小子问题)。 循环增量方向:例如从左上向右下方填表,保证计算某个 子问题最优解时需要的表中的项都已求解。
4
背包问题
背包问题:
已知n个物品:������1 , ������2 , … , ������������ 其重量分别为: ������1 , ������2 , … , ������������ 其价值分别为: ������1 , ������2 , … , ������������ 背包的总容量为:w 求物品的一个子集使得总重量不超过w,并且总价值 最大。 0/1背包问题:物品取or不取 Fractional背包问题:每个物品可以取一部分
第八讲:动态规划与最短路径(2)
《算法与算法复杂性》2011年春季 赵颖
Tentative Schedule
Date 2月23 3月2 3月9 3月16 3月23 3月30 4月6 4月13 4月20 4月27 5月4 5月11 5月18 5月25 6月1 6月8 Content Category HW HW(i)在布置HW(i+1) 课程基本情况+引言 基本设计与分析 算法入门+函数增长 基本设计与分析 HW1 那周交,过期不候; 分治策略 +递归分析 基本设计与分析 HW2 9次作业取成绩最好的6 排序和顺序统计学 基本设计与分析 HW3 次; 图的基本算法 基本设计与分析 HW4 上机题额外加分。 概率分析+随机算法 高级分析技术 HW5 平摊分析+优先队列 高级分析技术 HW6 动态规划 高级设计技术 动态规划 高级设计技术 HW7 bonus(上机题,考前交) 最短路径+贪心算法 高级设计技术 //////////////////////// /////////////// /////////////////// 贪心算法+图上复杂算法 高级设计技术 贪心算法+图上复杂算法 高级设计技术 HW8 NP复杂性问题 专题 近似算法 专题 HW9 review 过期的作业统一保存在FIT 3-126,大家随时可以去取。
11
15.4 最长公共子序列-最长公 共子序列的结构
事实上,最长公共子序列问题也有最优子结构性 质,因为我们有如下定理: 定理15.1: LCS的最优子结构性质 设序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的一 个最长公共子序列Z=<z1, z2, …, zk>,则:
16
15.4 最长公共子序列-计算最 优值
LCS-LENGTH(X, Y) 1 m ← length[X] 2 n ← length[Y] 3 for i ← 1 to m 4 do c[i, 0] ← 0 5 for j ← 0 to n 6 do c[0, j] ← 0 7 for i ← 1 to m 8 do for j ← 1 to n 9 do if xi = yj 10 then c[i, j] ← c[i - 1, j - 1] + 1 11 b[i, j] ← "↖― 12 else if c[i - 1, j] ≥ c[i, j - 1] 13 then c[i, j] ← c[i - 1, j] 14 b[i, j] ← "↑" 15 else c[i, j] ← c[i, j - 1] 16 b[i, j] ← " ← " 17 return c and b 。
17
15.4 最长公共子序列-构造最 长公共子序列
由算法LCS_LENGTH计算得到的数组b可用于 快速构造序列X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最长公共子序列。从b[m,n]开始,沿着其 中的箭头所指的方向在数组b中搜索。
2
第十五章 动态规划
本章主要内容:
动态规划介绍 装配线调度问题 矩阵链相乘问题 动态规划问题关键特征 背包问题(补充) 最长公共子序列 最优二叉查找树
每对顶点间的最短路径(第25章)
3
动态规划
设计一个动态程序算法的过程为:
刻划最优解的结构(最优子结构) 递归定义最优解的值(动态规划设计) 按自底向上的方式计算最优解的值(重叠?) 由计算出的结果构造一个最优解(可省略)
例如:w=50
a1(10,60) a2(20,100) a3(30,120)
5
背包问题——递归关系
满足最优子结构:
如果从最优解中取走aj,那么最优解中的剩余部分是剩 余子问题(背包容量为w-wj)的最优解(反证法)
递归关系:
令Ziu表示子问题(从������1 , ������2 , … , ������������ 中选择总重量小于u) 的最优解。 情况一:ai属于这个最优解,那么去掉ai剩余的子问题 变为从������1 , ������2 , … , ������������−1 中选择总重量小于u-wi Ziu=Zi-1,u-wi+vi 情况二: ai不属于这个最优解,Ziu=Zi-1,u Ziu从上述两种情况中选择一个最大值即可。
6
背包问题——例题
Example: Knapsack of capacity W = 5 item weight value 1 2 $12 2 1 $10 3 ቤተ መጻሕፍቲ ባይዱ $20 4 2 $15 capacity j
0 w1 = 2, v1= 12 w2 = 1, v2= 10 w3 = 3, v3= 20 1 2 3 1 2 3 4 5
10
15.4 最长公共子序列-最长公 共子序列的结构
穷举搜索法:对X的每一个子序列,检查它是否也是Y的子序 列,并且在检查过程中选出最长的公共子序列。 X共有2m个不同子序列,从而穷举搜索法需要指数时间。 应用问题:DNA序列相似性 DNA序列可以表示为有穷集合{A, C, G, T}上的一个串。 S1=ACCGGTCCCCAAACCTTGGGGGGAAACCCT, S2=CCCCGGGTTCCCGGGTGGGGGAAACCCCT, 找出第三个序列S3,在S3中的基也都出现在S1和S2中;而且 这种基必须是以相同的顺序出现,但是不必要时连续的。 这样的S3越长,S1和S2越相似。
背包问题——分析
复杂度:O(nW) pseudo-polynomial
因为输入的大小不是nW,是nlogW。
自底向上还是自顶向下?
如果是自顶向下的调用?——自顶向下更高 效。 如果wi不是整数,而是实数?——自底向上 不可能。
9
15.4 最长公共子序列
一个给定序列的子序列是在该序列中删去若干元素后得 到的序列。确切地说,若给定序列X=<x1, x2,…, xm>, 则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一个 严格递增的下标序列 <i1, i2,…, ik>,使得对于所有 j=1,2,…,k,有 x i j = zj。当另一序列Z既是X的子序列又 是Y的子序列时,称Z是序列X和Y的公共子序列。 最长公共子序列(LCS)问题:给定两个序列X=<x1, x2, …, xm>和Y=<y1, y2, … , yn>,要求找出X和Y的一个 最长公共子序列。
12
15.4 最长公共子序列-最长公 共子序列的结构
证明:用反证法。 1.若zk≠xm,则<z1, z2, …, zk ,xm >是X和Y的长度为k十1的公 共子序列。这与Z是X和Y的一个最长公共子序列矛盾。因 此,必有zk=xm=yn。由此可知Zk-1是Xm-1和Yn-1的一个长度 为k-1的公共子序列。因为若Xm-1和Yn-1有一个长度大于k1的公共子序列W,则将xm加在其尾部将产生X和Y的一个 长度大于k的公共子序列。此为矛盾。故Zk-1是Xm-1和Yn-1 的一个最长公共子序列。 2.由于zk≠xm,Z是Xm-1和Y的一个最长公共子序列。若Xm-1和 Y有一个长度大于k的公共子序列W,则W也是X和Y的一 个长度大于k的公共子序列。这与Z是X和Y的一个最长公 共子序列矛盾。由此即知Z是Xm-1和Y的一个最长公共子序 列。 3.与 2.类似。
13
15.4 最长公共子序列-一个递 归解
由最长公共子序列问题的最优子结构性质可知,要找出 X=<x1, x2, …, xm>和Y=<y1, y2, …, yn>的最长公共子序列, 可按以下方式递归地进行:
当xm=yn时,找出Xm-1和Yn-1的最长公共子序列,然后在其尾部加 上xm(=yn)即可得X和Y的一个最长公共子序列。 当xm≠yn时,必须解两个子问题,即找出Xm-1和Y的一个最长公共 子序列及X和Yn-1的一个最长公共子序列。这两个公共子序列中较 长者即为X和Y的一个最长公共子序列。
由此递归结构容易看到最长公共子序列问题具有子问题 重叠性质。例如,在计算X和Y的最长公共子序列时,可 能要计算出X和Yn-1及Xm-1和Y的最长公共子序列。而这两 个子问题都包含一个公共子问题,即计算Xm-1和Yn-1的最 长公共子序列。
14
15.4 最长公共子序列-一个递 归解
设c[i,j]记录序列Xi和Yj的最长公共子序列的长度。 其中Xi=<x1, x2, …, xi>,Yj=<y1, y2, …, yj>。当 i=0或j=0时,空序列是Xi和Yj的最长公共子序列, 故c[i,j]=0。其他情况下,可建立递归关系如下:
1.若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个 LCS; 2.若xm≠yn,那么zk≠xm 蕴含Z是Xm-1和Y的一个LCS; 3.若xm≠yn,那么zk≠yn 蕴含Z是X和Yn-1的一个LCS。
其中Xm-1=<x1, x2, …, xm-1>,Yn-1=<y1, y2, …, yn1>,Zk-1=<z1, z2, …, zk-1>。
相关文档
最新文档