我正在寻找能够diff
两个有向无环图(DAG)的算法。也就是说,我想要一种算法,它在第一个DAG上产生一系列删除和插入,以产生第二个DAG。
我不是百分百肯定,但我认为最长的共同子序列可以应用于DAG。我不太关心结果编辑序列的长度(只要它足够短)并且更关心算法的运行时间。
一个复杂因素是除了单根节点外,我的顶点都没有被标记。根节点也是唯一具有零边的节点。标记了图形的边缘,图形中的“数据”由从根到叶的路径表示。这与trie
类似,但使用有向图而不是树。实际上我的图表与directed acyclic word graph
数据结构非常相似。
这是一个例子。
DAG1
DAG2
要获得DAG 2,只需将根目录中的顶点添加到另一个带有标签“b”的顶点即可。从该顶点开始,DAG 1中的最终“ac”顶点有一条边,而标签为“d”的新顶点有一条边。从最后一个顶点到DAG 1中的'ac'顶点还有另一条边。我会以DAG形式发布一个指向diff的链接,但我不能发布两个以上的链接。
谢谢,希望这足够清晰。
答案 0 :(得分:9)
这可能有点太晚了,但只是为了好玩: 两个DAG都可以表示为矩阵,行索引表示“从”顶点,列索引表示“到”顶点,相应的单元格用边缘标识。您可以为顶点提供唯一且随机的ID。
下一部分有点棘手,因为只有你的边缘有从DAG1映射到DAG2的有意义的标签。假设你有一组边缘E *是DAG1和DAG2标记边缘的交叉点,你需要执行一系列行移位(向上或向下移动)或列移位(向左或向右移动)所以所有位置DAG1和DAG2中E *中的边缘相互映射。请注意,对于Matrix中表示的DAG,整行或整列的移位位置仍然使表示等效。
剩下的操作是根据映射的矩阵重命名顶点,比较两个矩阵,并识别新的边和所需的新顶点(以及可以移除的边和顶点。
答案 1 :(得分:2)
您的特定数据表示将如何显示DAG 2示例中的边c
和x
终止于同一顶点?
如果我们假设Wikipedia对"directed graph","vertex"和"edge"进行了一般定义,那么就没有“未标记的顶点”之类的东西,因为如果不对其进行标记,就不可能根据那里的定义来描述边缘。
按原样,在我看来您的问题无法回答。请提供(1)提供给该算法的输入的简单示例-一种将每个图形描述为顶点和边的集合的数据结构-以及以类似方式提供的预期输出,以及(2)一致的方式来区分是否第一个DAG中的边或顶点与第二个DAG中的边或顶点等效,这意味着这些图在这方面没有区别。
也许您的问题实际上主要是关于如何确定输入中每个DAG中顶点的标签以及如何使其最佳相关。或者,也许标签只是方便地描述每个图形,而问题实际上是在寻找minimal set of changes to describe a transformation of the structure of one graph to another。
也就是说,图的传统数学定义中的边和顶点是原子的。如果我们假设任何特定顶点或边缘的相同标签表示完全相同的顶点或边缘,则每个顶点或边缘在任何一个图形中都存在或不存在,从而使diff的概念变得毫无意义,或者构建起来微不足道。在两个图中。
这种简单的算法基本上只是枚举两个DAG中的每个顶点和边,并向diff添加适当的操作,仅从以下操作中进行选择:
add vertex v
remove vertex v
add edge e
remove edge e
switch direction for edge e