我们知道有一个O(n+m)
解决方案(DFS或BFS),用于检查无向图s
中是否有t
到G
的路径n
1}}顶点和m
边......将通过邻接List实现。
如果我使用 Adjacency Matrix 实现我的程序,运行时是否会受到影响?这是一个好的还是坏的选择?
编辑:我需要以这种方式计算时间复杂度吗?
答案 0 :(得分:1)
假设您的代码输入为n
和m
(节点数和边数),后跟m
类型a b
的行顶点a
和顶点b
之间有一条边。现在你采用邻接矩阵M[][]
,M[i][j]=1
如果i
和j
之间有一条边,否则为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的索引)。现在必须对每个顶点进行此操作,因此即使O(n^2)
,例程的复杂性也变为m < (n*(n-1))/2
(假设没有多个边的简单图形和循环m
最多可以{{1} })。 因此整体而言,您的复杂性变为(n*(n-1))/2
。然后是什么使用邻接矩阵?那么DFS / BFS可能只是一个大算法的一部分,你的算法也可能需要一个判断节点O(n^2)
和a
之间是否有一个边缘,邻接矩阵需要b
时间。因此,是否选择邻接列表或邻接矩阵实际上取决于您的算法(例如您可以采用的最大内存,DFS / BFS例程之类的时间复杂度或者是否连接两个顶点的查询等等)。
希望我回答你的问题。