【问题标题】:Complexity of a given function给定函数的复杂度
【发布时间】:2009-10-17 07:12:41
【问题描述】:

当我分析下面代码段的复杂度时,发现是O(n/2)。但是在搜索互联网时,我发现它可能是 O(n)。我想知道谁是正确的。

void function(int n) {
    int i = 1, k = 100;
    while (i < n) {
        k++;
        i += 2;
    }
}

【问题讨论】:

    标签: function complexity-theory big-o


    【解决方案1】:

    上述方法中变量k的意义何在?不管大 O 表示法谈论极限中的行为(当 n 的值接近无穷大时)。因此,big-O 表示法对比例因子和常数都是不可知的。也就是说,对于任何常数“c”和比例因子“s”

    O(f(n)) 等价于 O(s*f(n) + c)

    在你的情况下,f(n) = n,s = 1/2,c = 0。所以...

    O(n) = O(n/2)

    【讨论】:

      【解决方案2】:

      O(n) 与 O(n/2) 相同

      大 O 表示法的想法是了解算法在您给它更大的输入时运行的速度。因此,例如,如果您将输入的大小加倍,程序将花费两倍还是 4 倍的时间。

      由于当您改变 N 的值时,n 和 n/2 的行为相同(即,如果您将 N 增加 10 倍,则 N 本身和 N/2 的缩放比例相同)。

      【讨论】:

        【解决方案3】:

        O(n/2) = O(0.5n) = O(n)。有关更多信息,请参阅Wikipedia

        如果 fO(g),那么存在一些 cn 使得对于所有x > n, |f(x)| 。也就是说,从输入n开始,c * g(x)支配f(x)

        因此O(n/2) = O(n),因为,

        • 如果 f(x) = x/2g(x) = x,那么我们设置 c = 0.5n = 0.
        • 如果 f(x) = xg(x) = x/2,那么我们设置 c = 2n = 0.

        请注意,cn 有无限多个值,您可以使用它们来证明这一点。 (在上面我将它们最小化,但这不是必需的。)

        【讨论】:

          猜你喜欢
          • 2021-10-01
          • 1970-01-01
          • 2021-12-07
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多