站点http://web.eecs.utk.edu/~huangj/CS302S04/notes/graph-searching.html描述了当使用邻接列表时,DFS和BFS具有复杂度O(V + E),并且如果使用邻接矩阵,则复杂度为O(V2)。为什么是这样?
在这两种情况下,运行时都取决于迭代给定节点的传出边所需的时间。使用邻接列表,运行时与传出边的数量成正比。由于每个节点被访问一次,因此成本是节点数加上边数,即O(m + n)。使用am邻接矩阵,找到所有输出边所需的时间是O(n),因为必须检查节点的行中的所有n列。总结所有n个节点,这可以得到O(n2)。
希望这可以帮助!
你必须注意,为了探索探索所需的每个顶点时间,它只等于c * x,其中x是顶点的indegree。由于我们有兴趣找到整体复杂性,总时间将是c1 * x1 + c2 * n个节点的x2 ... cnxn。假设max(ci)= d,我们看到总时间<= d(所有顶点的不一致之和)= d * 2m = O(m)。这里我们计算了没有一个顶点的时间,但是所有的顶点都在一起。但是排队操作需要时间O(n),所以总体上是O(n + m)。
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)