Python 动态规划w/PyTorch:最长公共子序列

Python 动态规划w/PyTorch:最长公共子序列,python,dynamic-programming,pytorch,Python,Dynamic Programming,Pytorch,我现在想知道我们如何有效地解决LCS问题。 通过比较和移位,我找到了一种通过张量运算找到连续匹配(即ngrams匹配)的方法。 对于两个序列x(len:n),y(len:m),矩阵: e=x.eq(y.unsqueze(1))#[n x m] 我们有:e[i,j]==1 x[i]==y[j],n-gram匹配将显示为1的对角线。 因此,我们可以做到以下几点: #匹配_1={0,1}的[n x m] 匹配_1=x.eq(y.unsqueze(1)) #{0,1}的匹配_2=[(n-1)x(m-1

我现在想知道我们如何有效地解决LCS问题。 通过比较和移位,我找到了一种通过张量运算找到连续匹配(即ngrams匹配)的方法。 对于两个序列
x(len:n)
y(len:m)
,矩阵:

e=x.eq(y.unsqueze(1))#[n x m]
我们有:
e[i,j]==1 x[i]==y[j]
,n-gram匹配将显示为1的对角线。 因此,我们可以做到以下几点:

#匹配_1={0,1}的[n x m]
匹配_1=x.eq(y.unsqueze(1))
#{0,1}的匹配_2=[(n-1)x(m-1)]矩阵
match_2=match_1[:-1,:-1]*match_1[1:,1:]
#etcetc
由于我们允许存在间隙,LCS问题更加复杂。它可以用动态编程来实现,用O(nxm)表示,但它并不是真的可以移植到Pytorch上,对吗? 我试过了,太慢了

#考虑两个“句子”(单词索引的长传感器)
#长度分别为n和m的ts和tr
表=火炬零点(n+1,m+1)
_ts,_tr=ts,tr
对于范围(1,n+1)内的i:
对于范围(1,m+1)内的j:
如果[i-1]==tr[j-1]:
_表[i,j]=_表[i-1,j-1]+1
其他:
_表[i,j]=最大值(_表[i-1,j],_表[i,j-1])
lcs=_表[n][m]
有没有提高效率的办法