我知道堆栈溢出中有一个类似的问题,一个人问过,为什么BFS / DFS的时间复杂度不仅仅是O(V)。
给出的适当答案是,在完整图的情况下,E可以与V ^ 2一样大,因此在时间复杂度中包含E是有效的。
但是,如果V不能大于E + 1。那么,在这种情况下,时间复杂度中没有V,应该有效吗?
答案 0 :(得分:9)
如果给出了E = kV + c
,对于某些实常数k
和c
,则为
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 |上缩放。