【问题标题】:Is there a way to find if path exists in a Directed acyclic graph in constant time (O(1))?有没有办法在恒定时间(O(1))中查找路径是否存在于有向无环图中?
【发布时间】:2015-02-10 07:32:07
【问题描述】:

我有一些有向无环图。我想查找O(1) 中两个顶点之间是否存在路径。

另外,我想在O(n^2) 的两个顶点之间添加和删除边。

我想,我需要存储信息,两个节点之间存在多少条路径。但我没有提出完整的算法。

【问题讨论】:

  • 关于您的第一个问题,如果 B 可以从 到达,您可以通过添加一对 A,B 来预先计算一个地图一个.

标签: algorithm graph graph-algorithm directed-acyclic-graphs


【解决方案1】:

阅读这方面的好地方是“算法,第 4 版”。作者:罗伯特·塞奇威克和凯文·韦恩。http://algs4.cs.princeton.edu/home/。他们还在 Coursera.org 上展示学习课程“算法”。它是免费的,并且有材料可以回答您的问题。看看吧。https://www.coursera.org/course/algs4partI

【讨论】:

  • 投反对票?!好惊讶!我没有看到复制粘贴好的学习材料有任何意义,您可以通过上面的链接获得这些材料,包括许多 Java 代码。
  • 我没有投反对票,但仅链接的答案被认为是不好的,因为链接可能会断开,使答案完全毫无价值。可以提供一个链接作为总结相关信息的答案的一部分。 (请注意,仅链接的答案也可能被标记为垃圾邮件。在这种情况下,它对我来说似乎不是垃圾邮件,除非您与普林斯顿大学或 coursera 有某种关联。
【解决方案2】:

假设f(i, j) 是从ij 顶点的路径数。最初(我假设图形是空的,如果不是这种情况,您可以使用 add 操作添加所有边)f(i, j) = 1 如果i = j0 否则。

要添加从ab 的边,您可以使用以下过程:

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) 时间。从ab 的路径存在当且仅当f(a, b) != 0

但是,此解决方案存在一个问题:路径的数量可能非常大(大于标准整数类型可以容纳的数量),并且使用任意精度算术会增加时间复杂度。为避免此问题,您可以计算以某个大素数为模的路径数(但足够小以适合标准整数类型)p。此解决方案可能会产生不正确的结果(路径数可以是 0p 即使它实际上是非零),但失败的概率很低。为了进一步减少它,您可以计算 f 模数几个不同的素数。

【讨论】:

  • “对几个不同的素数取模”,即具有方便的中国剩余定理表示的大数。
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2016-07-29
  • 1970-01-01
  • 2023-03-08
  • 2022-01-21
相关资源
最近更新 更多