算法 - 计算两个DAG的最长公共子序列(LCS)

时间:2014-05-12 09:34:42

标签: algorithm graph dynamic-programming lcs

我有两个有向无环图,我需要计算这些图的最长公共子序列(LCS)。对于两个字符串/子序列,我使用动态编程(DP)的LCS算法但是如何将该算法修改为图形?

有什么想法吗?

整个任务:

设G是有向无环图,其中每个顶点用有限字母表中的符号标记。不同的顶点可以用相同的符号标记。 G中的每个有向路径都具有 trace ,它是通过连接路径中顶点的符号而形成的。图G的序列是G中某些有向路径的跟踪的子序列。

设计一种有效的算法,计算两个给定有向无环图的最长公共序列。

示例:字符串DYNAMIC,PROGRAM和DEPTHFIRST是图片的方向非循环图的序列。字符串PROGRAM是它的踪迹。

enter image description here

1 个答案:

答案 0 :(得分:1)

设A为第一个DAG,B为第二个DAG。对于B中的A和b中的任意两个节点a,定义从A中的a开始并且从B中的b开始的最长公共子序列的长度

LCS(a,b) =  0 + max LCS(a',b') for any pair (a',b') s.t. a->a' and b->b'
                               or a=a' and b->b', or b=b' and a->a'
                               if a and b do NOT share same label

            1 + max LCS(a',b') for any pair (a',b')
                               s.t. a -> a' and b -> b'
                               if a and b DO share same label

然后在| A |上应用动态编程x | B |对(a,b)并读取与DAG源相关的对的值("开始节点")。