最长的共同连续子序列

时间:2014-03-03 21:45:15

标签: algorithm lcs

我知道如何找到两个序列/字符串的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中,虽然我不知道服务器的硬件规格,所以我没有这些例程并行化的想法。

在这两种情况下,对于我的需求而言,运行速度太慢了。有没有办法加快速度呢?

1 个答案:

答案 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
        }
    }
}

这个问题基本上与序列比对的背景类似,在生物信息学中很常见。事实上,您应该能够通过将“间隙”惩罚设置为非常高的值来实现用于您的目的的现有序列比对算法(例如爆炸等),实际上不允许比对中的间隙