我知道如何找到两个序列/字符串的lcs,但lcs没有强加子序列需要连续的限制。我试过它如下
function lccs(a, b)
if a.length == 0 or b.length == 0
return ""
possible = []
if a[0] == b[0]
possible.push(lcs(a[1:), b[1:])
possible.push(lcs(a[1:], b))
possible.push(lcs(a, b[1:))
return longest_string(possible)
其中longest_string
返回数组中最长的字符串,s[1:]
表示从第一个字符开始的s片段。
我已经在浏览器中使用javascript和golang,在远程服务器上运行,我将每个调用lccs放在自己的goroutine中,虽然我不知道服务器的硬件规格,所以我没有这些例程并行化的想法。
在这两种情况下,对于我的需求而言,运行速度太慢了。有没有办法加快速度呢?
答案 0 :(得分:1)
我认为基本的想法是使用动态编程。类似的东西:
for i in 1:length(a) {
for j in 1:length(b) {
if (a[i]==b[j]) then {
result[i,j] = result[i-1,j-1]+1 #remember to initialize the borders with zeros
# track the maximum of the matrix
} else {
result[i,j]=0
}
}
}
这个问题基本上与序列比对的背景类似,在生物信息学中很常见。事实上,您应该能够通过将“间隙”惩罚设置为非常高的值来实现用于您的目的的现有序列比对算法(例如爆炸等),实际上不允许比对中的间隙