【问题标题】:Fastest algorithm for detecting a loop in a graph检测图中循环的最快算法
【发布时间】:2010-10-26 03:25:56
【问题描述】:

给定一个无向图,检测它是否包含循环的最佳算法是什么?

在跟踪访问节点的同时进行广度优先或深度优先搜索是一种方法,但它是 O(n^2)。有什么更快的吗?

【问题讨论】:

    标签: algorithm graph-theory cycle


    【解决方案1】:

    给定图 G(V,E) 的 BFS 和 DFS 算法的时间复杂度为 O(|V|+|E|)。所以你可以看到它是输入的线性依赖。如果您有非常专业的图形,您可以执行一些启发式方法,但通常使用 DFS 并没有那么糟糕。您可以检查一些信息here。无论如何,您必须遍历整个图表。

    【讨论】:

    • 谢谢,我想我忽略了一个事实,即所有访问节点的集合在开始时非常小,并且只会随着算法的进行而增长。
    【解决方案2】:

    这是你的O(V) 算法:

    def hasCycles(G, V, E): 
        if E>=V:
            return True
        else:
            # here E<V
            # perform O(E+V) = O(V) algorithm 
            ...
    

    ...可以使用 DFS 执行。如果您有 E&lt;V 并且边以有意义的方式存储(作为列表),您可能可以执行 O(E)+logs,这将使整个算法 O(min(E,V))+logs

    希望你喜欢这个答案,虽然有点晚了!

    【讨论】:

    • 如你所见,我大量使用这样一个事实,即没有循环的无向图是树的子图,因此必须有 E
    【解决方案3】:

    如果使用邻接表表示图,则使用深度优先搜索测试图 G(V,E) 中是否存在环是 O(|V|,|E|)。

    有必要遍历整个图形以显示没有循环。如果您只是对循环的存在/不存在感兴趣,那么您显然可以在发现循环时完成。

    【讨论】:

      【解决方案4】:

      如果你有一个简单的图形,你可以计算圈数:

      C = E − N + P
      

      其中 C 是循环数,E 是边数,N 是节点数,P 是组件数。如果你的图是连通的,那就是:

      C = E - N + 1
      

      【讨论】:

        猜你喜欢
        • 2013-05-29
        • 1970-01-01
        • 2010-09-20
        • 2011-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多