我知道stackoverflow上有一个类似的问题,其中一个人问为什么BFS/DFS的时间复杂度不仅仅是O(V)。
给出的恰当答案是,在完全图的情况下,E可能达到V^2,因此将E计入时间复杂度是合理的。
但是,如果V不能大于E+1。那么,在这种情况下,不考虑V的时间复杂度应该也能够工作吧?
我知道stackoverflow上有一个类似的问题,其中一个人问为什么BFS/DFS的时间复杂度不仅仅是O(V)。
给出的恰当答案是,在完全图的情况下,E可能达到V^2,因此将E计入时间复杂度是合理的。
但是,如果V不能大于E+1。那么,在这种情况下,不考虑V的时间复杂度应该也能够工作吧?
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 + V)
的主要原因是为了避免歧义。O(E) ~ O(1)
)。即使对于这种情况,我们也必须转到每个顶点(O(V)
),我们也无法在O(1)
时间内完成。O(E)
不够。O(V + E)
。 - axiomfor source in V: dfs(source)
。在一张图中,如果|E|
=0,这个循环的时间复杂度是多少? - axiomO(1)
的时间?该问题是关于最坏情况的。 - axiom必须包含V,因为BFS和DFS都依赖于大小为|V|的数组来跟踪已处理/发现/探索的顶点(无论情况如何)。如果一个图有0条边和100000个顶点,这样的数组仍需要比只有5个顶点时更长时间进行初始化。因此,BFS和DFS的时间复杂度与|V|成比例。
visited = set()
,链接在这里和这里。 - kaya3