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