最长公共子序列问题(LCS)
2015-06-05 15:52
190 查看
1、递归版本
对于序列A[0,n]和B[0,m],LCS(A,B)无非三种情况
(0)若n=-1或m=-1,则取做空序列(“”) //递归基
(1)若A
='X'=B[m],则取做:LCS(A[0,n),B[0,m))+‘X’ //减而治之
(2)若A
!=B[m],则在LCS(A[0,n],B[0,m) ) 与LCS(A[0,n),B[0,m] )中取更长者 //分而治之
def LCS(A,B):
if(len(A)==0 or len(B)==0):
return ""
if(A[-1]==B[-1]):
return LCS(A[0:-1],B[0:-1])+A[-1]
else:
tmp1,tmp2 = LCS(A[0:],B[0:-1]),LCS(A[0:-1],B[0:])
if(len(tmp1)>len(tmp2)):
return tmp1
else:
return tmp2
复杂的为O(2^n)
2、迭代版本
采用二维数组记录每个过程。复杂度为O(n*m)。 PS:输出子串,只输出了长度
def LCS(A,B):
table = []
for i in range(len(A)+1):
table.append([])
for j in range(len(B)+1):
table[i].append(0)
for i in range(len(A)):
for j in range(len(B)):
if(A[i]==B[j]):
substring += A[i]
table[i+1][j+1] = table[i][j]+1
else:
table[i+1][j+1] = max(table[i+1][j],table[i][j+1])
for i in range(len(A)):
for j in range(len(B)):
print table[i][j],'\t',
print '\n'
对于序列A[0,n]和B[0,m],LCS(A,B)无非三种情况
(0)若n=-1或m=-1,则取做空序列(“”) //递归基
(1)若A
='X'=B[m],则取做:LCS(A[0,n),B[0,m))+‘X’ //减而治之
(2)若A
!=B[m],则在LCS(A[0,n],B[0,m) ) 与LCS(A[0,n),B[0,m] )中取更长者 //分而治之
def LCS(A,B):
if(len(A)==0 or len(B)==0):
return ""
if(A[-1]==B[-1]):
return LCS(A[0:-1],B[0:-1])+A[-1]
else:
tmp1,tmp2 = LCS(A[0:],B[0:-1]),LCS(A[0:-1],B[0:])
if(len(tmp1)>len(tmp2)):
return tmp1
else:
return tmp2
复杂的为O(2^n)
2、迭代版本
采用二维数组记录每个过程。复杂度为O(n*m)。 PS:输出子串,只输出了长度
def LCS(A,B):
table = []
for i in range(len(A)+1):
table.append([])
for j in range(len(B)+1):
table[i].append(0)
for i in range(len(A)):
for j in range(len(B)):
if(A[i]==B[j]):
substring += A[i]
table[i+1][j+1] = table[i][j]+1
else:
table[i+1][j+1] = max(table[i+1][j],table[i][j+1])
for i in range(len(A)):
for j in range(len(B)):
print table[i][j],'\t',
print '\n'
相关文章推荐
- 通过反射获取实体的一切属性
- eclipse调试的方法和技巧
- php面向对象(OOP)—__autoload()函数
- 查野指针问题
- ffmpeg tutorial2
- 不可变对象的权衡
- Hadoop 1.0.3 集群搭建
- 1028. List Sorting (25)
- 22.Generate Parentheses&n对括号的全部有效组合
- 内核裁剪问题汇总
- win7开机黑屏只有鼠标的三种解决方法
- PHP做APP接口时,如何保证接口的安全性
- 菜鸟利用python处理大文本数据的血泪路
- Spring实例化相关问题
- 有关 iOS 的开发证书、应用标识、设备标识、配置文件以及密钥 #DF
- alfresco 5.0 document
- iBeacon技术笔记
- 设计模式-单例模式
- 基于规则的分类
- oracle 锁的介绍 (转)