我对BFS的复杂性感到困惑。 Wikipédia说:“时间复杂度可以表示为O(| V | + | E |),因为在最坏的情况下将探索每个顶点和每个边缘。”
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
对我来说最糟糕的情况是:每个顶点都连接到所有顶点 因此,while循环将完成V次,for循环将完成E次。最糟糕的情况是0(VE)。
我做错了什么?
答案 0 :(得分:2)
BFS的目的是访问所有节点一次。没有顶点第二次进入队列(这解释了| V |)。 | E |总和来自于假设检查事件边缘与访问相比没有任何成本。所以是的,对于一个完整的图形(所有顶点都连接到所有其他顶点),将检查VE边缘......但是检查它们不会花费访问。
答案 1 :(得分:0)
BFS的时间复杂度为O(| V | + | E |)。 V是总顶点数,E是总边数。您可能会误认为E. E不是顶点u的邻居边缘。
我们可以按照以下方式实现。
对于顶点中的每个u
对于邻居(u)中的每个e
do something.