检索有向无环图的传递闭合的高效算法


14

我正在尝试解决图形问题(这不是为了做作业,只是为了练习我的技能)。给出了DAG ,其中V是顶点集合,E是边线。该图被表示为邻接表,所以v是包含的所有连接的一组v。我的任务是找到它的顶点是从每个顶点可达v V。我使用的解决方案的复杂度为 O V 3G(V,E)VEAvvvVO(V3),带有传递闭包,但是我在博客中读到它可以更快,尽管它没有揭示如何实现。谁能告诉我另一种方法(具有更好的复杂性)来解决DAG中的传递闭包问题?




但是,我的建议是保留。但只要尝试减少平均比较次数即可。也就是说,进行猜测并向您的算法添加简单的规则。您可以使用矩阵乘法-但是,如果将其用于小型图形,则这只是一团糟,实际上,您的方法更好。O(|V|3)
2012年

@AJed在此特定问题中,将超过时间限制。O(V3)
Rontogiannis Aristofanis

2
@RondogiannisAristophanes当您说时间限制时,您是说这在某些编程/算法挑战(例如topcoder等)中是一个问题吗?如果是这样,并且如果您确定正确实现了解决方案,则可能需要再次查看问题。可能还有其他一些隐藏的属性可能会简化事情,或者可能有一种更好的方式来表达问题,从而不需要传递闭包。因为传递闭包与矩阵乘法一样困难。读 O(V3) student.cs.uwaterloo.ca/~cs466/Old_courses/F08/...
帕雷什

Answers:


8

我们的图是非循环的这一事实使这个问题更加简单。

拓扑排序可以使我们对顶点进行排序,使得如果i < j,则从v jv i的边将不存在。我们已经列出了顶点,以便所有边都在列表中“向前”。v1,v2,,vni<jvjvi

(编辑以修复分析并提供更快的算法)

现在,我们从最后一个顶点开始向后浏览该列表。v n的传递闭包本身。还要加上v nvnvnvn到每个具有边的顶点的传递闭合中。vn

对于彼此的顶点,从末尾开始,首先将v i添加到其自己的传递闭包中,然后将所有内容添加到vi i的传递闭包中vivivi的传递闭包中的所有内容添加到边缘为的所有顶点的传递闭包中。vi

运行时间在最坏的情况下,与Ñ顶点和的数目ø Ñ 2的边缘的数目。拓扑排序需要时间O n + m 。然后,我们在向后遍历中进行另一个O m n 工作:当我们向后遍历列表时,对于每个边,我们必须相加nO(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n 顶点到某人的及物关闭。

请注意,通过用位数组表示每个人的传递闭包,可以得到很好的恒定因子加速。假设您只有;那么您将使用单个64位int,如果i在我的传递闭包中,则位i为1,否则为0。然后,我们将i的传递闭包中的所有内容添加到j的那部分很快:我们只取c jn=64iiijcj | = 。(二进制或运算。)ci

对于 ,您必须将它们保留在数组中并进行一些算术运算,但是它比Object集要快得多。n>64

另外,我知道在最坏的情况下,大仍为O n 3O,但是要在实践中击败它,您必须要复杂得多。该算法在稀疏图上也表现出色。O(n3)


1
您可能会对集合使用链接列表表示形式,并且它们最终会共享共同的尾巴。
凯尔·巴特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.