【问题标题】:What's an efficient way to determine all common ancestors of two nodes in a directed graph?确定有向图中两个节点的所有共同祖先的有效方法是什么?
【发布时间】:2015-07-06 10:38:24
【问题描述】:

G为有向图,可能包含环,令mn为该图中的两个节点。我有兴趣在 G 中找到所有节点 a 以便有路径从 a -> n 1 -> n2 ... -> n 还有a -> m1 -> ... -> ma 节点集可以被认为是我的应用程序的 nm 的共同祖先(循环和“我是我自己的爷爷”无条件)。

我的第一个愚蠢的方法是对 nm 的前驱边执行深度优先搜索,遍历图并收集所有访问过的节点集合(O(n))。然后我执行这两个集合的交集 (O(n)),得到预期的 O(n) 复杂度。

在实现此功能之前,我想确保这是一种有效的处理方式。我的图可以有数十甚至数千个节点,虽然它们很稀疏,但算法需要足够快才能进行交互(即

【问题讨论】:

  • 只要在路径上找到 1 个共同祖先,您就可以“修剪”您对其中一个搜索的搜索。因为一旦你这样做了,那么显然那个共同祖先节点的所有祖先都将是相同的。
  • 我认为您的想法尽可能高效,因为无论如何您都必须检查mn的祖先,并且它们的交集不再。由于您正在标记已访问的节点,因此周期应该不是问题。为问题 +1 并内置答案

标签: graph directed-graph


【解决方案1】:

对于那些已经屏住呼吸等待的人:我在上面提出了自己的建议。性能似乎足以支持多达 10000 个节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-01
    • 2021-10-20
    • 1970-01-01
    • 2014-12-11
    • 2021-09-13
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多