algorithm - 机器人矩阵和邻接表的 BFS 和 DFS 的时间复杂度
问题描述
以上是 BFS 和 DFS 的伪代码。
现在通过我的计算,我认为这两个代码的时间复杂度都是 O(n),但我还有另一个困惑,它可能是 O(V+E),其中 V 代表顶点,E 代表边。谁能给我两个伪代码的详细时间复杂度。
简而言之,矩阵和邻接表上 BFS 和 DFS 的时间复杂度是多少。
解决方案
让我们首先分析 BFS 对于邻接表实现的时间复杂度。对于广度优先搜索,这就是我们所做的:从一个节点开始并将其标记为已访问。然后将该节点的所有邻居标记为已访问并将它们添加到队列中。然后从队列中取出下一个节点并执行相同的操作,直到队列为空。如果队列为空但仍有未访问的节点,则为该节点再次调用 BFS 函数。当我们在一个节点上时,我们检查该节点的每个邻居以填满队列。如果邻居已经被访问过 (visited[int(neighbor) - 1] = 1),我们不会将其添加到队列中。节点的邻居是通过边连接到它的另一个节点,因此检查所有邻居意味着检查所有边。这使得我们的时间复杂度为 O(E)。此外,由于我们将每个节点都添加到队列中(稍后将其弹出),它使时间复杂度 O(V)。那么我们应该拿哪一个呢?
好吧,我们应该取 E 和 V 的最大值。这就是我们说 O(V+E) 的原因。如果其中一个大于另一个,则较小可以看作是一个常数。
例如,如果我们有一个有 N 个节点的连通图,我们将有 N*(N-1) 条边。在每个节点上,我们将检查所有邻居,这会进行 N*(N-1) 次检查。因此时间复杂度将是 max(N, N*(N-1)) = N*(N-1) = O(N^2)
例如,如果我们有一个有 N 个节点的稀疏图,并且说 sqrt(N) 很多边,我们不得不说 BFS 的时间复杂度应该是 O(N)。
相同的逻辑可以应用于 DFS。您访问每个节点并检查每个边以深入了解图形的深度。它再次使它成为 O(V+E)。
至于你的假设,它是部分正确的。然而,正如我上面解释的,我们不能说时间复杂度总是 O(N)。(我假设 N 是顶点数,您没有在问题中指定。)
请注意,这些是用于邻接列表实现的。对于邻接矩阵实现,要检查节点的邻居,我们必须检查与相关行对应的所有列,这使得 O(V)。我们必须对所有顶点都这样做,因此它是 O(V^2)。
因此,对于矩阵实现,时间复杂度不依赖于边数。然而在大多数情况下 O(V+E) << O(V^2),因此更喜欢邻接表实现。
推荐阅读
- angular - 有没有办法以角度反应形式搜索(过滤)FormArray?
- c# - 为什么VS2017调试不会停在dllmain断点?
- python-3.x - 如何从棒球运动员的统计数据中获取百分比
- javascript - 如何从 THREE.MeshBasicMaterial 的颜色属性中设置漫反射均匀
- keras - 如何修复keras模型中的输入形状错误
- oracle - 带有包常量的 Oracle 过程 CALL
- c - C:读取文件而不打印同一行两次
- javascript - 如何使单选按钮工作并在reactjs中输出值
- macos - 如何使用 Apple Script 列出可用的日历名称及其 UID?
- codenameone - 不在 Android VKB 中显示 Next 或 Done 按钮