最长公共子序列和追踪解
生活随笔
收集整理的這篇文章主要介紹了
最长公共子序列和追踪解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
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:] =-1G = 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] +1G[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 = Nv = Vresult = []while i > 0 and v > 0:if G[i,v] == '7':result += X[i-1]i -=1v -=1elif G[i,v] == '^':i -=1else:v -=1 return result[::-1] # 直接使用DP表來追蹤也可以實現 def print_LCS(X,Y,list,N,V):i = Nv = Vresult = []while i > 0 and v > 0:if X[i-1] == Y[v-1]:result += X[i-1]i -=1v -=1elif list[i-1,v] > list[i,v-1]:i -=1else: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 pathprint_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']總結
以上是生活随笔為你收集整理的最长公共子序列和追踪解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 背包问题求第K优解
- 下一篇: floyd算法和动态规划