BFS的基本算法:
set start vertex to visited
load it into queue
while queue not empty
for each edge incident to vertex
if its not visited
load into queue
mark vertex
所以我认为时间的复杂性将是:
v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)
其中v
是顶点1
到n
首先,我说的是正确的吗?其次,这个O(N + E)
怎么样,直觉为什么会非常好。感谢
答案 0 :(得分:237)
你的总和
v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)
可以改写为
(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]
,第一组为O(N)
,而另一组为O(E)
。
答案 1 :(得分:36)
DFS(分析):
O(1)
时间O(n + m)
时间内运行
Σv deg(v) = 2m
BFS(分析):
Li
O(n + m)
时间内运行
Σv deg(v) = 2m
答案 2 :(得分:18)
非常简化而没有太多形式:每个边都被认为是两次,每个节点只处理一次,因此复杂度必须是边数和顶点数的常数倍。
答案 3 :(得分:3)
我认为每个边缘都被考虑过两次,每个节点都被访问过一次,因此总时间复杂度应为O(2E + V)。
答案 4 :(得分:2)
简短而简单的解释:
我最糟糕的情况是你需要访问所有的顶点和边缘 最坏情况下的时间复杂度为O(V + E)
答案 5 :(得分:2)
对此的直观解释是简单地分析单个循环:
因此单个循环的总时间为O(1)+ O(e)。现在,每个顶点访问一次,为每个顶点求和。这给了
Sigma_i
p {
height: 50px;
line-height: 50px;
}
span {
position: relative;
font-size: 2.5em;
display: inline-block;
line-height: .7em;
vertical-align: middle;
}
span:before {
font-size: 12px;
display: block;
position absolute;
left: 0;
top: 0;
content: "V";
width: 22px;
text-align: center;
}
span:after {
font-size: 12px;
display: block;
position absolute;
left: 0;
bottom: 0;
content: "k = 1";
width: 27px;
text-align: center;
}
<p>
<span>Σ</span>
O(1) + O(e)
=>
<span>Σ</span>
O(1)
+
<span>Σ</span>
O(e)
=> O(V) + O(E)
</p>
[O(1)+ O(e)]
答案 6 :(得分:0)
是O(V + E),因为每次访问V的v必须访问E的每个e,其中| e | <= V-1。由于有V个访问V的v,所以就是O(V)。现在您必须添加V * | e | = E => O(E)。因此,总时间复杂度为O(V + E)。