我可以对此DAG应用什么算法?

时间:2009-06-24 12:29:34

标签: algorithm tree directed-acyclic-graphs

我有一个表示属性列表的DAG。这些属性是这样的:如果a> b,则a具有b的有向边。它也是传递性的,因此如果a> b和b> c,则a具有到c的有向边。

然而,从a到c的有向边是多余的,因为a具有到b的有向边,而b具有到c的有向边。我怎样才能修剪所有这些多余的边缘?我在考虑使用最小生成树算法,但我不确定在这种情况下适用的算法是什么

我想我可以从每个节点及其所有传出边缘进行深度优先搜索,并比较它是否可以在不使用某些边缘的情况下到达某些节点,但这看起来非常低效且速度慢。

算法完成后,输出将是与图形一致的所有节点的线性列表。因此,如果a有b,c和d三个有向边。 b和c也都有一个有向边到d,输出可以是abcd或acbd。

3 个答案:

答案 0 :(得分:6)

这称为transitive reduction problem。从形式上讲,您正在寻找一个最小(最少边)有向图,其传递闭包等于输入图的传递闭包。 (上面的维基百科链接上的图表清楚说明了。)

显然存在一种解决这个问题的有效算法,它需要与生成传递闭包相同的时间(即添加传递链接而不是删除它们的更常见的反问题),但是Aho的link to the 1972 paper ,Garey和Ullman下载费用为25美元,而且一些快速的谷歌搜索没有出现任何好的描述。

编辑:Scott Cotton's graphlib包含Java implementation这个Java库看起来组织得很好。

答案 1 :(得分:2)

实际上,在环顾四周之后,我认为Topologicalsort是我真正追求的。

答案 2 :(得分:0)

如果这些已经是具有有向边的n个节点:

  1. 从任何一点M开始,循环其所有子边,选择最大的子(如N),删除其他边,复杂度应为o(n)。如果不存在N(没有子边缘,请转到步骤3)。
  2. 从N开始,重复步骤1.
  3. 从M点开始,选择最小的父节点(如T),删除其他边缘。
  4. 从T开始,重复步骤3 .....

  5. 实际上它只是一种排序算法,完全复杂度应为o(0.5n ^ 2)。


    一个问题是,如果我们想要循环一个节点的父节点,那么我们需要更多的内存来记录边缘,这样我们就可以从子节点追溯到父节点。这可以在步骤3中进行改进,我们从大于M的左侧节点中选择一个节点,这意味着我们需要保留节点列表以了解剩下哪些节点..