最長公共子序列和追蹤解
阿新 • • 發佈:2018-11-27
題目:
LCS for input Sequences “ABCDGH” and “AEDFHR” is “ADH” of length 3.
LCS for input Sequences “AGGTAB” and “GXTXAYB” is “GTAB” of length 4.
實現起來比較簡單,狀態方程:
LCS F[i,v] = (max{F[i-1,v],F[i,v-1]},F[i-1,v-1] +1)[X[i] == Y[v]]
程式碼實現:G為標記函式
import numpy as np
def LCS(X,Y,N,V):
# L = [[None]*(n+1) for i in xrange(m+1)]
list = np.zeros((N+1,V+1),dtype = int)
list[1:,1:] =-1
G = np.full((N+1,V+1),'0')
for i in range(1,N+1):
for v in range(1,V+1):
if X[i-1] == Y[v-1]:
list[i][v] = list[i-1,v-1] +1
G[i][v] = '7'
else:
if list[i-1,v] > list[i,v-1]:
list[i][v] = list[i-1,v]
G[i][v] = '^'
else:
list[i][v] =list[i,v-1]
G[i][v] = '<'
return list,G
主要介紹標記函式和追蹤解,雙針模型實現:
# 使用遞迴的方式
def print_LCS_Rec(X,Y,G,N,V):
if N == 0 or V == 0:
return
elif G[N,V] == '7':
print_LCS_Rec(X,Y,G,N-1,V-1)
print X[N-1],
elif G[N,V] == '^':
print_LCS_Rec(X,Y,G,N,V-1)
else :
print_LCS_Rec(X,Y,G,N-1,V)
return
# 使用非遞迴方式
def print_LCS_(X,Y,G,N,V):
i = N
v = V
result = []
while i > 0 and v > 0:
if G[i,v] == '7':
result += X[i-1]
i -=1
v -=1
elif G[i,v] == '^':
i -=1
else:
v -=1
return result[::-1]
# 直接使用DP表來追蹤也可以實現
def print_LCS(X,Y,list,N,V):
i = N
v = V
result = []
while i > 0 and v > 0:
if X[i-1] == Y[v-1]:
result += X[i-1]
i -=1
v -=1
elif list[i-1,v] > list[i,v-1]:
i -=1
else:
v -=1
return result[::-1]
執行結果
#%%
X = 'breather'
Y = 'conservatives'
N = len(X)
V = len(Y)
value,path = LCS(X,Y,N,V)
print value
print path
print_LCS_Rec(X,Y,path,N,V)
print print_LCS(X,Y,value,N,V)
print print_LCS_(X,Y,path,N,V)
[[0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 1 1 1 1 1 1 1 1]
[0 0 0 0 0 1 1 1 1 1 1 1 2 2]
[0 0 0 0 0 1 1 1 2 2 2 2 2 2]
[0 0 0 0 0 1 1 1 2 3 3 3 3 3]
[0 0 0 0 0 1 1 1 2 3 3 3 3 3]
[0 0 0 0 0 1 1 1 2 3 3 3 4 4]
[0 0 0 0 0 1 2 2 2 3 3 3 4 4]]
[['0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0' '0']
['0' '<' '<' '<' '<' '<' '<' '<' '<' '<' '<' '<' '<' '<']
['0' '<' '<' '<' '<' '<' '7' '<' '<' '<' '<' '<' '<' '<']
['0' '<' '<' '<' '<' '7' '<' '<' '<' '<' '<' '<' '7' '<']
['0' '<' '<' '<' '<' '^' '<' '<' '7' '<' '<' '<' '<' '<']
['0' '<' '<' '<' '<' '^' '<' '<' '^' '7' '<' '<' '<' '<']
['0' '<' '<' '<' '<' '^' '<' '<' '^' '^' '<' '<' '<' '<']
['0' '<' '<' '<' '<' '7' '<' '<' '^' '^' '<' '<' '7' '<']
['0' '<' '<' '<' '<' '^' '7' '<' '<' '^' '<' '<' '^' '<']]
e
a
t
e
['e', 'a', 't', 'e']
['e', 'a', 't', 'e']