【发布时间】:2015-11-12 05:18:57
【问题描述】:
我试图了解DFS 的复杂性如何/为什么为 O(V+E)。这是我分析伪代码迭代 DFS 复杂性的尝试。
DFS(G, t)
{
1 stack S = new empty Stack of size G.|V| ... O(1)
2 S.push(t) ... O(1)
3 while(S is not Empty) ... O(|V|), this will always be =<|V|
{
4 u = S.pop() ... O(1)
5 if(u.visited = false) ... O(1)
{
6 u.visited = true ... O(1)
7 for-each edge (u,v) in G.E ... O(|E|), this will always be =<|E|
8 if(v.visited = false) ... O(1)
9 S.push(v) ... O(1)
}
}
}
现在结合我们拥有的每一行的复杂性:
O(1) + O(1) + O(|V|)[O(1) + O(1) + O(1) + O(E)[O(1) + O(1)] ] = O(2) + O(V) + O(V) + O(V) + O(V) + O(V * E) + O(V * E) = 4*O(V) + 2* O(V * E) = O(V * E)
我没有得到 O(V+E)?谁能告诉我数学上我们是如何达到 O(V+E) 的?
谁能提供见解?
【问题讨论】:
标签: algorithm big-o time-complexity nested-loops asymptotic-complexity