[英]Python:not getting Length of longest common subsequence of lists
我試圖以最簡單的方式在LCS中實施,但沒有獲得正確的價值。 而不是4我得到。 我不確定我的代碼有什么問題:
X= ['A','B','C','B','D','A','B']
Y= ['B','D','C','A','B','A','X','Y']
m= len(X)
n= len(Y)
c={}
for i in range(1,m) :
c[i,0]=0
for j in range(0,n):
c[0,j]=0
for i in range (1,m):
for j in range (1,n):
if X[i]==Y[j]:
c[i,j]=c[i-1,j-1]+1
elif c[i-1,j] >= c[i,j-1]:
c[i,j]=c[i-1,j]
else:
c[i,j]=c[i,j-1]
print c[m-1,n-1]
print c
看來您正在使用的一個索引可能是問題的根源。 如果我理解正確,那么您正在尋找長度為4的LCS'BCBA',但是您實際上從未將第一個條目與任何內容進行比較,因此您沒有機會匹配作為第一個元素的'B'。是的
我對您的代碼做了一些小的修改,得到了4的解決方案:
X = ['A', 'B', 'C', 'B', 'D', 'A', 'B']
Y = ['B', 'D', 'C', 'A', 'B', 'A', 'X', 'Y']
m = len(X)
n = len(Y)
c = {}
for i in range(0, m+1):
c[i, 0] = 0
for j in range(0, n+1):
c[0, j] = 0
for i in range(1, m + 1):
for j in range(1, n + 1):
if X[i-1] == Y[j-1]:
c[i, j] = c[i - 1, j - 1] + 1
else:
c[i, j] = max(c[i-1, j],
c[i, j-1])
print c[m, n]
希望這可以幫助。
這是我用於LCS的實現,它返回(percent_in_common, sequence_in_common)
def longest_common_sequence(a,b):
from collections import deque
n1=len(a)
n2=len(b)
if not n1:
if not n2:
return 100.0, ''
return 0.0, ''
if not n2:
return 0.0, ''
previous=deque()
for i in range(n2):
previous.append((0,''))
over = (0,'')
for i in range(n1):
left = corner = (0,'')
for j in range(n2):
over = previous.popleft()
if a[i] == b[j]:
this = corner[0] + 1, corner[1]+a[i]
else:
this = max(over,left)
previous.append(this)
left, corner = this, over
return round(200.0*this[0]/(n1+n2),2),this[1]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.