【问题标题】:What would be the time complexity of this and why?这个的时间复杂度是多少,为什么?
【发布时间】:2016-05-06 14:28:51
【问题描述】:

以下方法的时间复杂度是多少?为什么?

由于第一个 for 循环,我知道它必须大于 O(n)。

但是 while 循环之后的时间复杂度会发生什么变化?

是O(n)(n-1) = O(n^2 + n)吗?

int fnA(int n) {
    int sum=0;
    for (int i=0; i<n; i++) {
        int j=i;
        int product =1;
        while (j>1) {
            product ∗= j ;
            j = j / 2;
        }
        sum += product;
    }
    return sum;
}

【问题讨论】:

  • 这看起来像是一个家庭作业问题。你试过什么?这里的复杂度是多项式的,并且大于O(n)。顺便说一句,O(n^2 + n) 没有多大意义,因为渐近地,n^2 占主导地位,所以在这种情况下你要写的是O(n^2)
  • @William 是的,这是我正在准备的考试题。所以它是 O(n^2 + n) 我是对的? :)
  • 嗯,你在正确的轨道上,但请参阅我对上面评论的编辑。
  • @William 啊,是的,你是对的,最终答案是 O(n^2),因为你打算拿最大的一个吗?
  • 这应该会让你走上正轨:math.stackexchange.com/q/228744/258990

标签: time-complexity big-o


【解决方案1】:

对我来说,这看起来像 O(n log n)。主循环迭代n 次,每次迭代都需要log n 额外的迭代才能完成,因为ji 开始,直到j &lt;= 1 减半。如果您想象内部循环的所有迭代的总时间,您会得到以下总和。

O(0 log n) + O(1 log(n-1)) + ... + O(n/2 log (n/2)) + ... + O((n-2) log 2) + O((n-1) log 1) =
O(log n) + O(n log n) + O(n) =
O(n log n)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-03
    • 2015-06-17
    • 2017-09-11
    • 2015-06-12
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多