[英]does DFS and BFS in O(n+m) change?
我们知道有一个O(n+m)
溶液(DFS或BFS),用于检查是否存在从路径s
到t
在无向图G
与n
顶点和m
边缘...这将经由邻接来实现名单。
如果我使用Adjacency Matrix实现程序,运行时间会受到影响吗? 这是好选择还是坏选择?
编辑:我需要计算时间复杂度,这样,有什么想法吗?
假设您的代码输入为n
和m
(节点数和边数),后跟m
条类型为ab
线,表示顶点a
和顶点b
之间存在一条边。 现在,采用邻接矩阵M[][]
,如果i
和j
之间存在边,则M[i][j]=1
,否则M[i][j]=0
(因为图是无向的,矩阵将是对称,因此您只能存储上/下半矩阵以减少一半的内存)。 现在,您必须获取矩阵并将其初始化为0(所有单元格),并且在扫描边缘标记M[a][b]=M[b][a]=1
。 现在初始化部分是O(n^2)
。 扫描和标记边缘为O(m)
。 现在让我们看一下BFS / DFS例程。 在节点上时,您尝试查看其所有未访问的顶点。 现在说我们想知道顶点a
的邻居, for(int i=0;i<n;i++) if (M[a][i]==1)
(假设基于0的索引),则必须要做for(int i=0;i<n;i++) if (M[a][i]==1)
)。 现在必须对每个顶点执行此操作,因此即使m < (n*(n-1))/2
(假设没有多个边和循环的简单图形m
都可以在m
处执行O(n^2)
,例程的复杂度也变为O(n^2)
最大值为(n*(n-1))/2
)。 因此,总体而言,您的复杂度变为O(n^2)
。 那么,邻接矩阵的用途是什么? 好吧,DFS / BFS可能只是大型算法的一部分,您的算法可能还需要告知节点a
和b
之间是否存在一条边缘,邻接矩阵在该边缘处花费O(1)
时间。 因此,选择邻接表还是邻接矩阵确实取决于您的算法(例如您可以占用的最大内存,DFS / BFS例程之类的时间复杂性或是否回答是否连接了两个顶点等)。 希望我回答了您的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.