用于检测图中循环的最快算法

时间:2009-05-14 10:17:50

标签: algorithm graph-theory cycle

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

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

这是您的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<V并且边缘以有意义的方式存储(作为列表),您可以执行O(E)+日志,这将生成整个算法O(min(E,V))+logs

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

C = E − N + P

其中C是循环数,E是边数,N是节点数,P是组件数。如果图表已连接,则为:

C = E - N + 1