[英]Is there a way to find if path exists in a Directed acyclic graph in constant time (O(1))?
我有一些有向无环图。 我想查找O(1)
两个顶点之间是否存在路径。
另外,我想在O(n^2)
两个顶点之间添加和删除边。
我认为,我需要存储信息,两个节点之间存在多少条路径。 但是我没有提出完整的算法。
假设f(i, j)
是从i
到j
顶点的路径数。 最初(我假设图形为空,如果不是这种情况,则可以使用加法运算来添加所有边) f(i, j) = 1
如果i = j
,则f(i, j) = 1
,否则为0
。
要将边从a
添加到b
,可以使用以下过程:
for i = 1 .. n
for j = 1 .. n
new_f(i, j) = f(i, j) + f(i, a) * f(b, j) //add the number of paths that contain a new edge
其中n
是顶点数。
删除边可以用类似的方法完成:
for i = 1 .. n
for j = 1 .. n
new_f(i, j) = f(i, j) - f(i, a) * f(b, j) //subtract the number of paths that contian this edge
删除/添加边缘显然需要O(n ^ 2)
时间。 当且仅当f(a, b) != 0
存在从a
到b
路径。
但是,这种解决方案存在一个问题:路径数量可能非常大(大于标准整数类型可以容纳的数量),并且使用任意精度算法会增加时间复杂度。 为避免出现此问题,您可以计算一些模数较大的质数(但足够小以适合标准整数类型) p
模数。 该解决方案可能会产生错误的结果(路径数即使实际上不是零,也可以是0
模p
模数),但是失败的可能性很低。 为了减少更多,你可以计算f
模几种不同的素数。
关于这一点的好地方是“算法,第四版”。 由Robert Sedgewick和Kevin Wayne撰写。 http://algs4.cs.princeton.edu/home/ 。 他们还在Coursera.org上提供学习课程“算法”。 它是免费的,那里有资料可以回答您的问题。 看一看。 https://www.coursera.org/course/algs4partI
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.