日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最长公共子序列和追踪解

發布時間:2024/9/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最长公共子序列和追踪解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

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']

總結

以上是生活随笔為你收集整理的最长公共子序列和追踪解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。