【问题标题】:True or False -> O(m+n) = O(m)真或假 -> O(m+n) = O(m)
【发布时间】:2015-10-02 06:08:46
【问题描述】:

  • m = 图中的边数
  • n = 图中的顶点数

假设图 G(V,E) 是无向且连通的。

我所做的是将 m 替换为 (n*(n-1)/2),因为就节点数而言,这是可能的最大边。

所以,我发现这是真的,

但是,真正的答案是错误的。

有人可以从概念上解释与 Big-Oh 复杂性相比的含义吗?

【问题讨论】:

    标签: graph asymptotic-complexity


    【解决方案1】:

    边数m 是正确的

    m <= (n*(n-1)/2)
    

    n*(n-1)/2 = (n^2-n)/2
    

    这意味着问题中的推理产生了

    m+n <= (n^2-n)/1+n = O(n^2)
    

    O(m) 的复杂度相同;但是,以明确考虑边数和节点数的方式说明算法的复杂性比使用最坏情况下的界​​限(n^2-n)/2 更精确。

    【讨论】:

      【解决方案2】:

      答案:是的

      图是连通的 => m &gt;= n-1 => m = n-1+k where k &gt;= 0.

      但是m &lt;= n(n-1)/2 因为如果每 2 个节点之间有一条边,则不需要更多边。 => n-1+k &lt;= n(n-1)/2 => k &lt;= (n-1)(n/2-1) => k &lt;= (n-1)(n-2)/2.

      所以,我们有 m = n - 1 + k 其中 0 &lt;= k &lt;= (n-1)(n-2)/2 ; k 表示超过连接所需的最小数量的边数。

      O(m+n) = O(n-1+k+n) = O(2n-1+k) = O(2n+k) = a
      
      O(m) = O(n-1+k) = O(n+k) = b
      

      现在,让我们分三种情况:

      • lim(n-&gt;inf) n/k = 0

        a = O(k(2n/k + 1)) = O(k)

        b = O(k(n/k + 1)) = O(k)

      • lim(n-&gt;inf) n/k = constant

        a = O(2*constant*k + k) = O(another_constant * k) = O(k)

        b = O(constant*k + k) = O(another_constant2 * k) = O(k)

      • lim(n-&gt;inf) n/k = inf => lim(n-&gt;inf) k/n = 0

        a = O(n(2 + k/n)) = O(2n) = O(n)

        b = O(n(1 + k/n)) = O(n)

      所以,在任何情况下都是如此。

      【讨论】:

      • k是连接组件的数量吗?
      • 我不太明白你的意思。图是连通的,所以只有一个组件。
      • 我明白了,k 是超过连接所需的最小边数的边数。
      • 没错!为了更清楚,我在帖子中添加了您的解释。
      【解决方案3】:

      你的想法在我看来是正确的,只有一个例外。 你能确定两个相同的顶点之间不能有两条或多条边吗?那么图不是多图? 否则m = X * (n*(n-1))/2 其中X 可以增长到无穷大,它是问题中的一个新变量。那么复杂度将类似于O(X*n*n)

      无论如何,等式仍然是正确的,因为第一个子句中的+n 仍然可以省略(因为二次函数“过度充电”线性函数)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-17
        • 2023-04-10
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        相关资源
        最近更新 更多