关于最长公共子序列问题算法的一些思考

这个问题在做子问题的一些界定的时候,也是很自然的想到把原序列剪短一点点

问题:给定序列
X=<x1,x2,……,xm>
Y=<y1,y2……,yn>
求X和Y的最长公共子序列

一、实例

X:A B C B D A B
Y:B D C A B A
最长公共子序列:B C B A,长度4

二、蛮力算法

不妨设 m 小于等于 n,|X| = m,|Y| = n
算法:依次 检查 X 的每个子序列在 Y 中是否出现
时间复杂度:
每个序列O(n)的时间
X有2^m个子序列
最坏情况下时间复杂度:O(n2^m)

三、子问题的界定

参数 i 和 j 界定子问题
X 的终止位置是 i,Y 的终止位置是 j
Xi =<x1, x2, …, xi>,Yj =<y1, y2, …, yj>
子问题界定

四、算法

算法 LCS (X, Y, m, n)

1.  for1  to  m  do   C[i,0] ¬ 0 
2.  for1  to  n  do   C[0,i] ¬ 0 
3.  for1  to  m  do                
4for  j ¬1 to  n  do 
5.             if  X[i]=Y[j] 
6.            then  C[i, j] ¬C[i-1,j-1]+1 
7.                  B[i, j] ¬"ã" 
8.             else if  C[i-1, j] ³ C[i,j-1]  
9.             then   C[i, j]¬C[i-1,j] 
10.                      B[i, j]¬"­" 
11.            else   C[i, j]¬C[i,j-1]    
12.                      B[i, j]¬"¬" 
 

猜你喜欢

转载自blog.csdn.net/Prototype___/article/details/124415929