为什么DFS和BFS的时间复杂度取决于图表的表示方式?

问题描述 投票:13回答:3

站点http://web.eecs.utk.edu/~huangj/CS302S04/notes/graph-searching.html描述了当使用邻接列表时,DFS和BFS具有复杂度O(V + E),并且如果使用邻接矩阵,则复杂度为O(V2)。为什么是这样?

data-structures graph time-complexity graph-algorithm breadth-first-search
3个回答
24
投票

在这两种情况下,运行时都取决于迭代给定节点的传出边所需的时间。使用邻接列表,运行时与传出边的数量成正比。由于每个节点被访问一次,因此成本是节点数加上边数,即O(m + n)。使用am邻接矩阵,找到所有输出边所需的时间是O(n),因为必须检查节点的行中的所有n列。总结所有n个节点,这可以得到O(n2)。

希望这可以帮助!


0
投票

你必须注意,为了探索探索所需的每个顶点时间,它只等于c * x,其中x是顶点的indegree。由于我们有兴趣找到整体复杂性,总时间将是c1 * x1 + c2 * n个节点的x2 ... cnxn。假设max(ci)= d,我们看到总时间<= d(所有顶点的不一致之和)= d * 2m = O(m)。这里我们计算了没有一个顶点的时间,但是所有的顶点都在一起。但是排队操作需要时间O(n),所以总体上是O(n + m)。


0
投票

DFS和BFS的时间复杂度可以计算如下:

迭代每个顶点一次及其相应的入射边缘,因此总时间复杂度将为 - >

时间复杂度= v1 +(v1上的incident_edges)+ v2 +(v2上的incident_edges)+ ...... + vn +(vn上的incident_edges)

现在这可以重新组合为 - >(v1 + v2 + v3 + ..... vn)+(v1上的incident_edges + v2上的incident_edges + vn上的incident_edges)

因此,总时间复杂度将变为=(v1 + v2 + v3 + ..... vn)+(v1上的incident_edges + v2上的incident_edges + vn上的incident_edges)

(v1 + v2 + ... + vn)= V或n(顶点总数)

对于邻接列表表示:

(v1上的incident_edges + v2上的incident_edges + vn上的incident_edges)= E(边缘总数)

因此,对于邻接列表表示时间复杂度将为O(V + E)

对于邻接矩阵表示:

要访问相应节点(Row)的邻居,我们需要迭代特定行的所有列,其总计为V.

所以,(v1上的incident_edges + v2上的incident_edges + vn上的incident_edges)= V + V + .... Vth时间V)= V * V

因此时间复杂度将为O(V + V ^ 2)= O(V ^ 2)

© www.soinside.com 2019 - 2024. All rights reserved.