【问题标题】:Why Time complexity of Breadth First Search is O(V+E)?为什么广度优先搜索的时间复杂度是 O(V+E)?
【发布时间】:2019-01-29 21:32:47
【问题描述】:

什么时候它实际上应该是 O(E) 因为 E 在图中的范围从 V-1 到 V(V-1)/2 ? 为什么BFS时间复杂度是O(E+v)。

在 CLRS 中说 O(V) 来自每个顶点的入队和出队操作,因为存在 V 个顶点,所以 O(1) * V = O(V)。但问题是,当所有 V 顶点都在使用时,它在一个完全连接的图中,但在连接图中 E=V-1 在最小情况下,所以它不应该是 O(E) 而不是 O(V+E) ?

【问题讨论】:

  • 您应该在cs.stackexchange.com 上提出这个问题。这确实是我认为更适合该社区的问题类型。
  • 无论如何,直观地说,它是 O(V+E),因为你不知道,先验,你的图有多少边(即你的图是稀疏的还是满的),但是你知道您将访问所有边和顶点。
  • @nbro 我的理解是,只有连接到初始顶点的顶点才被排队,或者如果涉及到这个问题,那么就出队了,对于任何连接图,e=v-1(最小case) ,那么 O(v+E) 不应该收敛到 O(e) 吗?稀疏图没有连接,仍然只考虑从源顶点连接的图。所以仍然应该是 O(E) 对吧?
  • 稀疏图不一定是断开的。你是什​​么意思“O(V + E)不应该收敛到O(E)”?无论如何,O(E) 是不正确的,因为您的所有图中可能只有 1 条边,但您仍然必须访问所有顶点(即从每个单独的顶点重新启动 BFS)。
  • @nbro 这不是广度优先遍历吗? ,我认为 BFS 仅适用于连通图,而 BFT 适用于不连通图,我所见过的所有算法也都强调同一点。你可能会争辩说,顶点的初始设置需要 O(v) 时间,但从我的角度来看,你不能在遍历所有边并且只标记连接的顶点时这样做吗?明显大于|E|+1

标签: algorithm time-complexity graph-theory breadth-first-search


【解决方案1】:

你说的是真的,但是我们必须考虑到 BFS 有一个初始化阶段,在这个阶段你分配给所有顶点距离 +inf、颜色为白色和父 NULL。

这个初始步骤不能跳过,因为 BFS 仅访问从源可到达的顶点,但它可以接收断开连接的图作为输入,并且您必须为每个顶点计算有关距离和父亲的信息。

【讨论】:

    【解决方案2】:

    对于复杂性,+ 在某种程度上等同于 max(请参阅 Dukeling@ 的评论)。 在某种程度上你是对的。对于常规连接图,您可以假设它将是 O(E),因为您将拥有比顶点更多的边。

    但是,让我们看一个没有边的图。 BFS 循环不会做任何事情,但是作为设置的一部分,您需要初始化具有 V 元素的已访问向量(可能是您的实现可能需要的更多附加信息),因此 O(V)。

    由于我们不知道得到什么样的图,所以如果 O(V+E) 表示复杂度的正确方法。

    【讨论】:

    • 我不会说+“实际上意味着”max,而是说它们是等价的,因为max(x,y) <= x+y <= 2*max(x,y)
    • @Sorin 我的理解是,我们可以逐步放弃初始着色,在遍历边缘并标记发现的节点时着色,这样我们只为子图中的顶点 V' 着色连接到原始节点,所以 V' 将再次在 E 附近,从而使时间复杂度 O(E) 不是吗?为什么在它们甚至没有连接的情况下最初为所有顶点着色?
    • @jeshwanthchowdary 这并不是严格意义上的初始着色,尽管您可能会以某种方式初始化向量以确保您不会意外地获得一些不正确着色的顶点。至少,您需要为着色分配内存。即使您没有在操作中分配每个布尔值,而是在相当大的块中分配,总体上操作是线性的(具有非常低的常数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2012-07-13
    • 2015-01-01
    • 1970-01-01
    相关资源
    最近更新 更多