最长公共子序列(LCS)问题——动态规划法
最长公共子序列问题
- 问题描述
- 动态规划法
- 划分子问题: 找出最优解的性质,并刻划其结构特征;
- 递归式推导:递归地定义最优解的值,找出最优解的递归式;
- 计算最优值:按自底向上的方式计算最优解的值。
- 构造最优解:由计算出的结果构造一个最优解。
- 例子
问题描述
给定序列 𝑋 = 𝑥 1 , 𝑥 2 , … , 𝑥 𝑚 𝑋 = {𝑥_1, 𝑥_2, … , 𝑥_𝑚} X=x1,x2,…,xm ,序列 𝑍 = 𝑧 1 , 𝑧 2 , … , 𝑧 𝑘 𝑍 = {𝑧_1, 𝑧_2, … , 𝑧_𝑘} Z=z1,z2,…,zk是𝑋的子序列,是指:存在一个严格递增下标序列 𝑖 1 , 𝑖 2 , … , 𝑖 𝑘 {𝑖_1, 𝑖_2, … , 𝑖_𝑘} i1,i2,…,ik,使得对于所有 j = 1 , 2 , … , k j=1,2,…,k j=1,2,…,k有 𝑧 𝑗 = 𝑥 i j 𝑧_𝑗 = 𝑥_{i_j} zj=xij
给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的
公共子序列。
给定2个序列 𝑋 = 𝑥 1 , 𝑥 2 , … , 𝑥 𝑚 𝑋 = {𝑥_1, 𝑥_2, … , 𝑥_𝑚} X=x1,x2,…,xm和 𝑌 = 𝑦 1 , 𝑦 2 , … , 𝑦 𝑛 𝑌 = {𝑦_1, 𝑦_2, … , 𝑦_𝑛} Y=y1,y2,…,yn,找出𝑋和𝑌的最大长度公共子序列。
动态规划法
划分子问题: 找出最优解的性质,并刻划其结构特征;
设序列 X = ( x 1 , x 2 , … , x m ) X = (x_1, x_2, \ldots, x_m) X=(x1,x2,…,xm) 和 Y = ( y 1 , y 2 , … , y n ) Y = (y_1, y_2, \ldots, y_n) Y=(y1,y2,…,yn), Z = ( z 1 , z 2 , … , z k ) Z = (z_1, z_2, \ldots, z_k) Z=(z1,z2,…,zk)是 X 和 Y 的任意一个 LCS,则:
(1) 若 x m = y n x_m = y_n xm=yn,则 (z_k = x_m = y_n) 且 z k − 1 z_{k-1} zk−1是 X m − 1 X_{m-1} Xm−1 和 Y n − 1 Y_{n-1} Yn−1 的一个 LCS;
(2) 若 x m ≠ y n x_m \neq y_n xm=yn 且 z k ≠ x m z_k \neq x_m zk=xm,则 Z 是 X m − 1 X_{m-1} Xm−1 和 Y 的一个 LCS;
(3) 若 x m ≠ y n x_m \neq y_n xm=yn 且 z k ≠ y n z_k \neq y_n zk=yn,则 Z 是 X 和 Y n − 1 Y_{n-1} Yn−1 的一个 LCS。
最长公共子序列问题具有最优子结构性质。
递归式推导:递归地定义最优解的值,找出最优解的递归式;
计算最优值:按自底向上的方式计算最优解的值。
构造最优解:由计算出的结果构造一个最优解。
数据结构设计:
- c[m][n] 存放最优解值,计算时行优先
- b[m][n] 为解矩阵,存放构造最优解信息
当构造解时,从𝑏[𝑚, 𝑛]出发,上溯至𝑖 = 0或者𝑗 = 0止。
上溯过程中,当𝑏[𝑖,𝑗]包含“ ↖ ”时打印出 𝑥 𝑖 ( 𝑦 𝑗 ) 𝑥_𝑖(𝑦_𝑗) xi(yj)
说明:
- 每当在表项𝑏[𝑖,𝑗]中遇到一个“ ↖ ”时,即意味着 𝑥 𝑖 = 𝑦 𝑗 𝑥_𝑖 = 𝑦_𝑗 xi=yj是LCS的一个元素;
- 时间复杂度:𝜃(𝑚 + 𝑛)
例子
若X = <A, B, C, B, D, A, B> ,Y=<B, D, C, A, B, A>,则
最优解为BCAB 或 BCBA