DIFF用于向无环图(Diff for Directed Acyclic Graphs)

2019-09-03 05:07发布

我在寻找一种算法,可以diff两个有向无环图(DAG)。 也就是说,我想产生在第一DAG以产生所述第二DAG缺失和插入的序列的算法。

我不是一个肯定百分之百,但我认为一个最长公共子可应用于使用DAG。 我对所产生的编辑序列的长度不太关注(只要它足够短),并更关注算法的运行时间。

一个复杂的是,没有我的顶点的标记,除了一个根节点。 根节点也与入边零的唯一节点。 图形的边缘被标记,并且在图中的“数据”是由从根到叶的路径来表示。 这类似于一个trie ,但有向图,而不是一棵树。 其实我的图是非常类似于directed acyclic word graph的数据结构。

下面是一个例子。

DAG1

DAG2

要获得DAG 2,您只需从根本上增加一个顶点到另一个顶点标签为“B”。 从这个顶点存在于DAG 1最终“交流”的顶点和边缘到一个新的顶点的标签是“d”的边缘。 从最终的顶点还有另外一个边缘的“交流”的顶点在DAG 1.我会发布一个链接到DAG形式的差异,但我不能发布两个以上的链路。

感谢,并希望这是不够清晰。

Answer 1:

这可能是有点晚,但只是为了好玩:无论你的DAG可表现为基质,用行索引表示“从”的顶点,并表示“到”顶点列索引和相应的细胞标记边缘ID。 你可以给顶点独特的和随机的ID。

接下来的部分是有点棘手,因为只有你的边缘具有从DAG1映射到DAG2有意义的标签。 假设你有一组边E *是来自DAG1和DAG2标记边缘相交,则需要执行一系列排移(向上或向下)或列移(向左或向右移动),因此所有的位置在E *边缘DAG1和DAG2映射到对方。 请注意,对于在矩阵表示的DAG,移位整行或整列的位置仍使表示等效。

剩余的操作将根据所映射的矩阵来重命名顶点,比较两个矩阵,并确定可以去除所需要的新的边缘和新的顶点(和边和顶点。



Answer 2:

如何将特定的数据表示显示,边缘cx你DAG 2例如,在相同的顶点终止?

如果我们假设维基百科的一般定义“有向图” , “顶点” ,和“边缘” ,有没有这样的事,作为一个“未标记的顶点”,因为无需标记他们,就没有办法形容的边缘,根据定义那里。

由于是,在我看来,你的问题是不可能的回答。 请提供(1)提供给算法的输入的一个简单的例子 - 描述每个曲线图的顶点和边的集合的数据结构 - 并以类似的方式为期望的输出,和(2)一种一致的方式来如果区分边缘或顶点中的第一DAG是等效于一个在第二DAG,这意味着在图的这一方面没有差别。

也许你的问题实际上主要是关于如何确定输入每个DAG顶点以及如何最好地他们相关的标签。 或者,也许标签只是为了方便描述每个图形和问题,实际上是寻求最小集合的变化来描述一个图的结构转变到另一个 。

这就是说,边和顶点的图的传统,数学定义是原子。 每个顶点或边要么存在或以任何一个图不存在,产生diff的概念没有多大意义,或以其它方式琐碎建立,如果我们假设,对于任何特定的顶点或边的相同标号表示完全相同的顶点或边两图。

这样一个平凡的算法将基本上只是列举两个DAG的每个顶点和边缘并添加相应的操作的差异,只能从以下操作中选择:

add vertex v
remove vertex v
add edge e
remove edge e
switch direction for edge e


文章来源: Diff for Directed Acyclic Graphs