该网站http://web.eecs.utk.edu/~huangj/CS302S04/notes/graph-searching.html说明,当使用邻接表时,深度优先搜索和广度优先搜索的复杂度为O(V+E),而如果使用邻接矩阵,则复杂度为O(V2)。为什么会这样呢?
无论哪种情况,运行时间都取决于遍历给定节点的出边需要多长时间。使用邻接表,运行时间与出边数量成正比。由于每个节点只被访问一次,所以成本是节点数加上边数,即O(m + n)。使用邻接矩阵,查找所有出边所需的时间为O(n),因为必须检查节点行中的所有n列。总结所有n个节点,这将得到O(n2)。希望这可以帮助您!
DFS和BFS的时间复杂度可以如下计算:遍历每个顶点一次及其相应的关联边,因此总时间复杂度为 -> 时间复杂度 = v1 + (v1的关联边) + v2 + (v2的关联边) + ...... + vn + (vn的关联边)现在可以重新组合为 -> (v1+v2+v3+.....vn) + (v1的关联边 + v2的关联边 + ..... vn的关联边)因此,总时间复杂度将变为 = (v1+v2+v3+.....vn) + (v1的关联边 + v2的关联边 + ..... vn的关联边)(v1 + v2 + ... + vn) = V或n(顶点总数)对于邻接表表示法:(v1的关联边 + v2的关联边 + ..... vn的关联边) = E(边的总数)因此,对于邻接表表示法,时间复杂度为O(V+E)对于邻接矩阵表示法:要访问相应节点(行)的相邻节点,我们需要迭代该行的所有列,这相当于V因此,(v1的关联边 + v2的关联边 + ..... vn的关联边) = V + V + ....共V次V) = V * V因此,时间复杂度为O(V + V^2) = O(V^2)
你必须注意到,对于每个顶点的探索所需的时间仅等于c*x,其中x是该顶点的入度。由于我们对整体复杂性感兴趣,整体时间将是c1*x1+c2*x2...cnxn(n个节点)的总和。取max(ci)=d,我们可以看出整体时间<=d(所有顶点的入度之和)=d*2m=O(m)。这里我们计算的不仅是一个顶点的时间,而是所有顶点一起计算的。但是入队操作需要O(n)的时间,因此总体时间为O(n+m)。