The basic algorithm for 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
So I would think the time complexity would be:
v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)
where v
is vertex 1
to n
Firstly, is what I've said correct? Secondly, how is this O(N + E)
, and intuition as to why would be really nice. Thanks
您的总和
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)
非常简化没有太多的形式:每边被认为是准确的两倍,并且每一个节点被处理恰好一次,所以复杂性必须是边缘的数目的常数倍以及顶点的数量。
时间复杂度为O(E+V)
的,而不是O(2E+V)
因为如果时间复杂度为n ^ 2 + 2N + 7然后它被写成为O(n ^ 2)。
因此,O(2E + V)写为O(E + V)
因为N ^ 2和n之间的问题,但不是n和2N之间的差异。
我认为每一个边缘一直被认为是两次,每一个节点已经去过一次,所以总的时间复杂度应该是O(2E + V)。
短暂而简单的解释:
我你将需要访问所有的顶点和边缘的最坏情况,因此在最坏情况下的时间复杂度为O(V + E)
这种情况的一个直观的解释是简单地分析一个循环:
- 访问一个顶点 - > O(1)
- 一个用于在所有入射边缘环 - > O(E)其中,e是在给定的顶点v多个边入射。
因此,对于一个单一的循环的总时间为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)]