O(n + m)中的DFS和BFS会发生变化吗?

时间:2015-03-16 14:53:20

标签: algorithm data-structures graph depth-first-search breadth-first-search

我们知道有一个O(n+m)‌解决方案(DFS或BFS),用于检查无向图s中是否有tG的路径n 1}}顶点和m边......将通过邻接List实现。

如果我使用 Adjacency Matrix 实现我的程序,运行时是否会受到影响?这是一个好的还是坏的选择?

编辑:我需要以这种方式计算时间复杂度吗?

1 个答案:

答案 0 :(得分:1)

假设您的代码输入为nm(节点数和边数),后跟m类型a b的行顶点a和顶点b之间有一条边。现在你采用邻接矩阵M[][]M[i][j]=1如果ij之间有一条边,否则为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例程之类的时间复杂度或者是否连接两个顶点的查询等等)。 希望我回答你的问题。