- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
这符里串A, 其=a中1a每2...个ani的j在子1到序n列之的间一, 个并形且式1为i1<aii21<a.i.2..<..iakik的n 字
蛮力法: 列举A所以的2n个子序列, 对于每一子序 列在(m)时间内来确定它是否也是B的子序列.
很明显, 此算法的时间复杂的为(m*2n).
09.03.2021
11
递推公式
为了使用动态规划技术, 首先推导一个求最长公 共子序列长度的递推公式. 令A=a1a2...an和B=b1b2...bm 令L[i, j]表示a1a2...ai和b1b2...bj的最长公共子 序列的长度(i, j可能是0, 此时a1a2...ai和 b1b2...bj中至少一个为空). 可得如下结论:
If these subproblems are not independent, what will happen?
09.03.2021
3
算法总体思想
动态规划算法与分治法类似, 其基本思想也是 将待求解问题分解成若干个子问题
T(n)
=n
T(n/2)
09.03.2021
T(n/2)
T(n/2)
09.03.2021
6
Fibonacci sequence(序列)
Fibonacci序列定义如下:
1. procedure f(n)
2. if n=1 or n=2 then return 1
3. else return f(n-1)+f(n-2)
这种递归形式有简洁、容易书写和容易查错等 优点, 最主要是它的抽象性.
09.Leabharlann Baidu3.2021
5
算法总体思想
如果能够保存已解决的子问题的答案, 而在需要时再找 出已求得的答案, 就可以避免大量重复计算, 从而得到 多项式时间算法.
Those who can=not renmember the past
arTe(nd)oomed to repeat it.
(无法记取教训者必重蹈覆辙 )
动态规划算法
怎样思想,就有怎样的生活
Chapter 7
动态规划Dynamic Programming
What is dynamic programming
与分治法类似, 动态规划也是通过组合子问题 的解来求解问题.
分治算法将问题划分成独立子问题, 递归地解决 这些子问题, 然后组合这些子问题的解来求解原 始问题.
2n n
有效计算上式的方法是按行构造帕斯卡三角形
09.03.2021
9
What is dynamic programming
什么是动态规划?
当子问题发生重叠时, 分治法做了很多不必要的 工作——重复对重叠的子问题进行求解.
动态规划算法对每个子问题求解一次, 然后将结 果保存在一张表里面, 这样可以避免每个已求解 子问题的重复计算.
09.03.2021
12
递推公式
观察结论7.1 如果i和j都大于0, 那么
若ai=bj, L[i, j]=L[i-1, j-1]+1 若aibj, L[i, j]=max{L[i, j-1], + L[i-1, j]}
可得如下公式:
0
ifi0ojr0
L[i,j] L[i1,j1]1
ifi0,j0anaid bj
09.03.2021
14
Algorithm 7.1 LCS Input: Two strings A and B of length n and m, respectively, over an alphabet
Output: The length of the longest common subsequence of A and B
但是它远不是有效的算法.
算法复杂性: (n) Why???
09.03.2021
7
Fibonacci sequence分析
f(n)= f(n-1)+ f(n-2)
=2f(n-2)+ f(n-3)
=3f(n-3)+2f(n-4)
=5f(n-4)+3f(n-5)
T(n) 1T(n1)T(n2)
T(n/2)
4
算法总体思想
但是经分解得到的子问题往往不是互相独立的. 不同子 问题的数目常常只有多项式量级. 在用分治法求解时, 有些子问题被重复计算了许多次.
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)
n/2
T(n/4) T(n/4)
T(n/4)
n/2
n/2 -----George Santnay/2ana,
The life of Reason,
Book I: Introduction and
Reason in Common
T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) T(n/4) STe(n/s4e) (19T0(5n)/4)
对于Fibonacci序列, 一个明显的方法是从f(1)开 始自底向上地计算到f(n), 只需要(n)时间和(1) 空间.
和前面的方法相比, 可以很大程度降低时间复杂 度.
09.03.2021
10
The longest common subsequence problem最长公共子序列问题
在字母表上, 分别给出两个长度为n和m的字符 串A和B, 确定在A和B中最长公共子序列的长度.
if n1,2 if n3
f (n)(n),where1 5
2
09.03.2021
8
二项式系数的计算
1
n k
n k
1 1
n k
1
n k
n! k!(n
k )!
由 Stirling 等式,有
if k 0 or k n if 0 k n
n k
n! (( n / 2 )! ) 2
2nn n / en n(n / 2)n / en
ma L[ix ,j {1]L ,[i1,j]}ifi0,j0anaid bj
09.03.2021
13
现在可以直接用动态规划技术来求解最长 公共子序列问题。对每一对i和j的值,0 i n,0 j m,我们用一个(n+1)×(m+1) 表来计算L[i, j]的值,只需要用上面的公式 逐行地填表L[0…n, 0…m]。算法如下: