【问题标题】:Why is DFS's and BFS's complexity not O(V)? [duplicate]为什么 DFS 和 BFS 的复杂度不是 O(V)? [复制]
【发布时间】:2013-10-03 03:51:58
【问题描述】:

我正在尝试在 Java 中实现 BFS 和 DFS 作为通用算法。我正在编写一个方法getComplexity(),它将算法的最坏情况复杂度作为字符串返回。在 DFS(和 BFS)中,图中的每个节点只能被访问一次。在最坏的情况下,每个节点只被访问一次。因此,为什么这些算法的复杂度是 O(V+E) 而不是 O(V)?这里 V 是节点(或顶点)的数量,E 是边的数量。

【问题讨论】:

  • 每个节点被访问一次,每条边被遍历一次。因此 O(V+E)。
  • 这对我来说似乎不是重复的。您发布的问题中的 OP 理解它为什么是(v1 + e1 + v2 + e2 ...)。但是在这里,OP 在问为什么这是真的

标签: java algorithm


【解决方案1】:

树遍历(BFS 和 DFS)是 O(V + E),因为每条边必须只遍历一次,并且每个节点必须只访问一次。树遍历通常是一种抽象,可以帮助我们了解问题。在大多数简单的情况下,V 和 E 都是微不足道的操作,但情况并非总是如此,V 的效率可能与 E 完全不同。例如,遍历一条边可能像跟随指针一样简单,或者它可能要求您通过网络从远程主机获取数据(可能涉及昂贵的数据库查询)。访问一个节点可能就像设置一个布尔值一样简单,也可能涉及对该节点的数据执行一些昂贵的计算。

O(V + E) 提醒我们,在推理遍历树的整体复杂性时,必须同时考虑访问节点的复杂性和遍历边的复杂性。

【讨论】:

  • 想解释否决票?
  • 我认为区分指针跟踪和外部数据库查询与算法的抽象大哦无关,更不用说设置布尔值与进行昂贵的计算。这些是常数因素
  • @torquestomp 我认为一个具体的例子将有助于说明为什么 V != E。如果 V = E. O(V + E) = O(2V) 和大哦 O(2V)简化为 O(V),因为在任何树中,边数等于节点数 - 1。
【解决方案2】:

因为在一般的图中,E(即边的数量)可以和V*(V-1)/2(对于完整的图)一样大,它的顺序是V^2。所以我们不能忽略我们需要检查每条边的事实(为了找到未访问的节点),因为检查的成本可能比访问每条边的成本更高(正如我所说,它可能是V^2)节点(总是V)。

【讨论】:

    猜你喜欢
    • 2012-07-13
    • 2015-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2014-07-18
    • 2022-06-10
    相关资源
    最近更新 更多