小编典典

多个序列的最长公共子序列

algorithm

我已经进行了大量研究以找到M = 2序列最长的序列,但是我试图找出如何对M≥2序列进行序列化的方法

我得到N和M:M个序列,其中包含N个唯一元素。N是{1-N}的集合。我已经考虑过动态编程方法,但是对于如何真正地将其合并仍然感到困惑。

输入示例

5 3
5 3 4 1 2
2 5 4 3 1
5 2 3 1 4

可以看到这里的最大序列是

5 3 1

预期产量

Length = 3

阅读 400

收藏
2020-07-28

共1个答案

小编典典

一个简单的想法。

对于和i之间的每个数字,计算最后一个数字为的最长子序列。(称之为)1``N``i``a[i]

为此,我们将从头到尾遍历i第一个序列中的数字。如果是a[i] > 1,那么j在每个序列中都有这样的数字出现在之前i
现在我们可以检查和的所有可能值j(如果之前的条件成立)a[i] = max(a[i], a[j] + 1)

作为最后一位,因为在第一个序列j之前i,所以意味着a[j]已经被计算。

for each i in first_sequence
    // for the OP's example, 'i' would take values [5, 3, 4, 1, 2], in this order
    a[i] = 1;
    for each j in 1..N
        if j is before i in each sequence
            a[i] = max(a[i], a[j] + 1)
        end
    end
end

这是O(N^2*M),如果你事先计算矩阵位置。

2020-07-28