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
Your sum
v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)
can be rewritten as
(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]
and the first group is O(N)
while the other is O(E)
.
Very simplified without much formality: every edge is considered exactly twice, and every node is processed exactly once, so the complexity has to be a constant multiple of the number of edges as well as the number of vertices.
Time complexity is O(E+V)
instead of O(2E+V)
because if the time complexity is n^2+2n+7 then it is written as O(n^2).
Hence, O(2E+V) is written as O(E+V)
because difference between n^2 and n matters but not between n and 2n.
I think every edge has been considered twice and every node has been visited once, so the total time complexity should be O(2E+V).
An intuitive explanation to this is by simply analysing a single loop:
- visit a vertex -> O(1)
- a for loop on all the incident edges -> O(e) where e is a number of edges incident on a given vertex v.
So the total time for a single loop is O(1)+O(e). Now sum it for each vertex as each vertex is visited once. This gives
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)]
Short but simple explanation:
I the worst case you would need to visit all the vertex and edge hence
the time complexity in the worst case is O(V+E)