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

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

问题:给定序列
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]¬"¬" 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客范儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值