【问题标题】:Is the worst time complexity of BFS in a graph traversal n+2E?图遍历 n+2E 中 BFS 的最差时间复杂度是?
【发布时间】:2013-09-04 13:35:08
【问题描述】:

我知道 BFS 在图遍历中的时间复杂度为 O( V + E ),因为在最坏的情况下将探索每个顶点和每条边。

嗯,确切的时间复杂度是v+2E ??

每个顶点被探索一次+每个相邻顶点

graph= No of edges*2= 2E中所有顶点的度数之和

因此时间复杂度是n+2E..我正确吗?

【问题讨论】:

  • 顶点度数之和是边数的两倍。
  • @VaughnCato:感谢您指出……让我编辑问题
  • O(V+E) 等价于O(V+2E),因为V+2E <= 2*(V+E)O(2*(V+E)) 等价于O(V+E)

标签: algorithm graph time-complexity


【解决方案1】:

对于随机图,时间复杂度为O(V+E):Breadth-first search

如链接中所述,根据您的图的拓扑,O(E) 可能从O(V)(如果您的图是非循环的)到O(V^2)(如果所有顶点都相互连接)不等。

因此,时间复杂度从O(V + V) = O(V)O(V + V^2) = O(V^2) 不等,具体取决于您的图形拓扑。

另外,既然|V| <= 2 |E|,那么O(3E) = O(E)也是正确的,只是界限比较宽松。

【讨论】:

    【解决方案2】:

    假设

    假设 G 是连通的且无向的。如果它没有连接,那么您可以将以下想法独立应用于 G 的每个连接组件。此外,假设 G 表示为邻接列表,对于每个顶点 v,我们可以确定是否在 O(1) 时间内访问了 v,例如使用查找表。

    分析

    如果您想计算 BFS 中的确切步数,您可以观察到:

    1. 由于 G 是连通的,BFS 会恰好访问每个顶点一次,所以我们计算 |V|节点访问。请注意,在一次访问中,您可能会执行更多操作,而不是计算边上的循环,而不仅仅是标记当前访问的顶点。

    2. 对于我们要计算的每个顶点 v,BFS 在该顶点检查多少条边。

    您必须遍历 v 的所有边才能执行 BFS。如果你跳过一个边缘,那么很容易表明 BFS 是不正确的。所以每条边都要检查两次。

    这里可能会出现一个问题。有人可能会问,是否需要检查顶点 v 中的边 (p, v),其中 p 是 v 在已经构建的 BFS 树中的父节点,即我们直接从 p 来到 v。当然你不必考虑这条边,但决定跳过这条边也至少要花费一个额外的操作:

    for (v, u) in v.edges:
        if u == p: # p is the parent of v in already constructed tree
            continue
        if not visited[u]:
            BFS(u, parent=v)
    

    它检查的边数与下面的代码相同,但复杂度更高,因为除了一条边外,我们运行两条 if 语句而不是一条。

    for (v, u) in v.edges:
        if not visited[u]: # if p is the parent of v, then p is already visited
            BFS(u, parent=v)
    

    结论

    你甚至可以开发一种不同的方法来跳过边 (v, p),但它总是需要至少一次操作,所以这是一种浪费。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 2022-07-01
      • 2020-12-30
      相关资源
      最近更新 更多