为什么BFS / DFS的时间复杂度不仅仅是O(E)而不是O(E + V)?

时间:2014-11-05 05:29:32

标签: graph time-complexity depth-first-search breadth-first-search

我知道堆栈溢出中有一个类似的问题,一个人问过,为什么BFS / DFS的时间复杂度不仅仅是O(V)。

给出的适当答案是,在完整图的情况下,E可以与V ^ 2一样大,因此在时间复杂度中包含E是有效的。

但是,如果V不能大于E + 1。那么,在这种情况下,时间复杂度中没有V,应该有效吗?

2 个答案:

答案 0 :(得分:9)

如果给出了E = kV + c,对于某些实常数kc,则为  O(E + V) = O(kV + c + V) = O(V) = O(E)你的论点是正确的。

这样的例子就是树。

但一般来说,E = O(V^2),因此我们无法做到比O(V^2)更好。

为什么不总是只写O(E)?
请注意,可能存在图中根本没有边缘的情况(即O(E) ~ O(1))。即使对于这种情况,我们也必须转到每个顶点(O(V)),我们无法在O(1)时间内完成。

因此,只写O(E)一般不会做。

答案 1 :(得分:1)

V必须包含在内,因为BFS和DFS都依赖于大小为| V |的数组。跟踪已处理/发现/探索了哪些顶点(无论情况如何)。如果图形具有0个边和100000个顶点,则与只有5个顶点的情况相比,此类数组的初始化时间仍将更多。因此,BFS和DFS的时间复杂度在| V |上缩放。