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

时间:2014-05-29 02:58:17

标签: data-structures graph time-complexity graph-algorithm breadth-first-search

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

3 个答案:

答案 0 :(得分:24)

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

希望这有帮助!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

时间复杂度= v1 +(v1的事件边缘)+ v2 +(v2的事件边缘)+ ...... + vn +(vn的事件边缘)

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

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

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

对于邻接列表表示

(v1上的incident_edges + v2上的incident_edges + .... n vn上的..... events_edges)= E(边的总数)

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

对于邻接矩阵表示

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

因此,(v1上的incident_edges + v2上的incident_edges + .... vn上的incident_edges)= V + V + .... Vth time V)= V * V

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