为什么BFS O(V + E)的复杂性代替O(V*E)?

One*_*ero 11 algorithm complexity-theory breadth-first-search

这里有一些伪代码(无视我的风格)

从v1开始(入队):

function BFS(queue Q)
  v2 = dequeue Q
  enqueue all unvisited connected nodes of v2 into Q
  BFS(Q)
end // maybe minor problems here
Run Code Online (Sandbox Code Playgroud)

由于图中有V个顶点,并且这些V顶点连接到E边,并且访问连接节点(相当于访问连接边)是在内部循环中(外部循环是递归本身),在我看来复杂性应该是O(V*E)而不是O(V + E).有人能为我解释一下吗?

hug*_*omg 12

E不是与每个顶点相邻的边数 - 实际上是图中边的总数.以这种方式定义它很有用,因为您不必在每个顶点上具有相同数量的边.

由于在DFS结束时每个边都被访问过一次,因此从该部分获得O(E)复杂度.然后添加O(V)以访问每个顶点一次并获得总计O(V + E).

  • 你的答案有点笼统 - 它可以与深度优先搜索(DFS)和广度优先搜索(BFS)相关.也许这就是你在答案中将BFS误解为DFS的原因(注意问题是要求BFS). (6认同)