动态规划中的最长公共子序列ppt课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.
问题分析(续)
令c[i][j]记录Xi和Yj的最长公共子序列的长度, 则有
0
i = 0, j = 0
c[i][j] = c[i - 1][j - 1] + 1
xi = yj
max{c[i][j - 1] , c[i - 1][j] } xi ≠ yj
.
问题分析(续)
显然不应以递归方式(自顶向下,即先考虑 最后一个字符)设计算法,而应设计动态规 划算法,即从第一个字符开始考虑。
.
计算最优值程序跟踪
X = {A C B D} Y = {A B D A}
c
0 00 00 0 11 11 0 11 11 0 12 22 0 12 33
b
00000 01331 02222 02133 02213
i j x[i]=y[j] c[i-1][j]>=c[i][j1]
11Y
2
N
3
N
4Y
列。
.
最长公共子序列的结构
设序列X={x1, x2, …, xm}, Y={y1, y2, …, yn}, Z={z1, z2, …, zk},则
(1) 若xm = yn, 则Zk - 1 是Xm – 1和Yn – 1的 最长公共子序列;
如:X = {…, C}, Y = {…, C}, 则Z = {…, C}
21N
Y
2N
Y
.
补充习题
1. X={B, C, A, D} Y={C, A, B, D},求X与Y的最长公共子序 列,并画出数组c与b.
c
b
0 00 00
00000
0 00 11
02213
0 11 11
01322
0 12 22
02133
0 12 23
02221
i:
j:
.
补充习题(答案)
1. X={B, C, A, D} Y={C, A, B, D序列的结构(续)
(2)若xm ≠ yn, 且zk ≠ xm,则Z是Xm – 1和Y 的最长公共子序列;
如:X = {… , C}, Y = {…, B}, zk ≠C, 则 在计算最长公共子序列时,可不考虑 X的最后一个元素C
.
最长公共子序列的结构(续)
(3)若xm ≠ yn, 且zk ≠ yn,则Z是X和Yn– 1 的最长公共子序列
c
b
0 00 00
00000
0 00 11
02213
0 11 11
01322
0 12 22
02133
0 12 23
02221
i: 1
2
3
j: 1 2 3 4 1 2 3 4 1 2 3. 4
讨论
结构化与面向对象程序设计的联系与区别?
面向对象的局部来看是结构化的。 结构化的基本思想是“自顶向下,逐步求精
如:X = {… , C}, Y = {…, B}, zk ≠B, 则 在计算最长公共子序列时,可不考 虑Y的最后一个元素B
.
最长公共子序列的结构(续)
两个序列的最长公共子序列包含了 这两个序列的前缀的最长公共子序 列,因此,最长公共子序列问题具 有最优子结构性质。
.
讨论
可否根据序列的第1个元素来重述本问 题?这样做有什么优缺点?
3.3 最长公共子序列
定义:一个给定序列的子序列是在该序 列中删去若干元素后得到的序列。
找出{A, B, C, D}的所有子序列 思考:有n个元素的序列至多有多少个子序
列? ✓ 2n(包括空) ✓ 说“至多”是因为子序列可能相等(但
具有不同下标序列)
.
公共子序列
定义:如果序列Z既是序列X的子序列又 是序列Y的子序列,则称Z是X和Y的公 共子序列。
可以。这样做不利于描述,如前面Xm–1 可以方便地表示X前m – 1 个元素,改 后就比较麻烦。从递归的角度来看, 一般也是从后面增减元素。
.
问题分析
当xm = yn时,有一个子问题,即 :找出Xm –1 和Yn – 1的最长公共子序列
当xm yn时,有两个子问题,即 (1)找出Xm – 1和Y的最长公共子序列, (2)找出X和Yn – 1的 最长公共子序列。而这两个子问题都包含了 同一个子问题(Xm– 1, Yn–1) 。 因此,本问题满 足子问题重叠性质。
找出X = (A, B, C, D, A, B), Y = (B, D, C, A, B, A)的所有公共子序列。
.
最长公共子序列
找出X和Y的最长公共子序列。 对于任意给定的X和Y,它们的最长公共
子序列唯一吗?举例说明。
不一定。如{A, B}与{B, A} 本节的问题是只找出一个最长公共子序
”,面向对象的基本意图是提高软件模块的 复用性。 纯结构化的程序编译后基本上没有多余的代 码,而面向对象的程序有许多。 面向对象以机器的运行复杂度换取编程人员 的编写复杂度。…
.
问题分析(续)
令c[i][j]记录Xi和Yj的最长公共子序列的长度, 则有
0
i = 0, j = 0
c[i][j] = c[i - 1][j - 1] + 1
xi = yj
max{c[i][j - 1] , c[i - 1][j] } xi ≠ yj
.
问题分析(续)
显然不应以递归方式(自顶向下,即先考虑 最后一个字符)设计算法,而应设计动态规 划算法,即从第一个字符开始考虑。
.
计算最优值程序跟踪
X = {A C B D} Y = {A B D A}
c
0 00 00 0 11 11 0 11 11 0 12 22 0 12 33
b
00000 01331 02222 02133 02213
i j x[i]=y[j] c[i-1][j]>=c[i][j1]
11Y
2
N
3
N
4Y
列。
.
最长公共子序列的结构
设序列X={x1, x2, …, xm}, Y={y1, y2, …, yn}, Z={z1, z2, …, zk},则
(1) 若xm = yn, 则Zk - 1 是Xm – 1和Yn – 1的 最长公共子序列;
如:X = {…, C}, Y = {…, C}, 则Z = {…, C}
21N
Y
2N
Y
.
补充习题
1. X={B, C, A, D} Y={C, A, B, D},求X与Y的最长公共子序 列,并画出数组c与b.
c
b
0 00 00
00000
0 00 11
02213
0 11 11
01322
0 12 22
02133
0 12 23
02221
i:
j:
.
补充习题(答案)
1. X={B, C, A, D} Y={C, A, B, D序列的结构(续)
(2)若xm ≠ yn, 且zk ≠ xm,则Z是Xm – 1和Y 的最长公共子序列;
如:X = {… , C}, Y = {…, B}, zk ≠C, 则 在计算最长公共子序列时,可不考虑 X的最后一个元素C
.
最长公共子序列的结构(续)
(3)若xm ≠ yn, 且zk ≠ yn,则Z是X和Yn– 1 的最长公共子序列
c
b
0 00 00
00000
0 00 11
02213
0 11 11
01322
0 12 22
02133
0 12 23
02221
i: 1
2
3
j: 1 2 3 4 1 2 3 4 1 2 3. 4
讨论
结构化与面向对象程序设计的联系与区别?
面向对象的局部来看是结构化的。 结构化的基本思想是“自顶向下,逐步求精
如:X = {… , C}, Y = {…, B}, zk ≠B, 则 在计算最长公共子序列时,可不考 虑Y的最后一个元素B
.
最长公共子序列的结构(续)
两个序列的最长公共子序列包含了 这两个序列的前缀的最长公共子序 列,因此,最长公共子序列问题具 有最优子结构性质。
.
讨论
可否根据序列的第1个元素来重述本问 题?这样做有什么优缺点?
3.3 最长公共子序列
定义:一个给定序列的子序列是在该序 列中删去若干元素后得到的序列。
找出{A, B, C, D}的所有子序列 思考:有n个元素的序列至多有多少个子序
列? ✓ 2n(包括空) ✓ 说“至多”是因为子序列可能相等(但
具有不同下标序列)
.
公共子序列
定义:如果序列Z既是序列X的子序列又 是序列Y的子序列,则称Z是X和Y的公 共子序列。
可以。这样做不利于描述,如前面Xm–1 可以方便地表示X前m – 1 个元素,改 后就比较麻烦。从递归的角度来看, 一般也是从后面增减元素。
.
问题分析
当xm = yn时,有一个子问题,即 :找出Xm –1 和Yn – 1的最长公共子序列
当xm yn时,有两个子问题,即 (1)找出Xm – 1和Y的最长公共子序列, (2)找出X和Yn – 1的 最长公共子序列。而这两个子问题都包含了 同一个子问题(Xm– 1, Yn–1) 。 因此,本问题满 足子问题重叠性质。
找出X = (A, B, C, D, A, B), Y = (B, D, C, A, B, A)的所有公共子序列。
.
最长公共子序列
找出X和Y的最长公共子序列。 对于任意给定的X和Y,它们的最长公共
子序列唯一吗?举例说明。
不一定。如{A, B}与{B, A} 本节的问题是只找出一个最长公共子序
”,面向对象的基本意图是提高软件模块的 复用性。 纯结构化的程序编译后基本上没有多余的代 码,而面向对象的程序有许多。 面向对象以机器的运行复杂度换取编程人员 的编写复杂度。…
.