【问题标题】:How would I calculate big-O for this Algorithm我将如何计算这个算法的 big-O
【发布时间】:2021-02-14 18:17:01
【问题描述】:

我有这个算法

int count = 0;
for(int i = n; i >= 1; i = i/2) {
   for ( int j = 1; j <= i; j++) {
      count++;
   }
}

我说这个的 Big-O 是 n/2 对吗?

【问题讨论】:

    标签: java algorithm time-complexity big-o complexity-theory


    【解决方案1】:

    TL;DR时间复杂度为O(n)。

    更多详情

    我说这个的 BigO 是 n/2 对吗?

    不准确,在大 O 表示法中,您删除了常数部分,因此 (1/2)n 简化为 O(n)。

    我不确定n/2 来自哪里,因为只有外循环

    for(int i = n; i >= 1; i = i/2) {
       ...
    }
    

    是log2n 不是n/2。

    两个循环一起使用:

    int count = 0;
    for(int i = n; i >= 1; i = i/2) {
       for ( int j = 1; j <= i; j++) {
          count++;
       }
    }
    

    计数会在 N 和 2N 之间变化。

    让我们计算一下:

    int count = 0;
    for(int i = n; i >= 1; i = i/2) {
       for ( int j = 1; j <= i; j++) {
          count++;
       }
    }
    

    内部循环将执行 N 迭代,然后是 N/2,然后是 N/4 ...直到 N/N。

    换句话说,我们有(N + N/2 + N/4 ... N/N),可以简化为N * (1/2 + 1/4 + .. + 1/2^L)),L = Log2 N。

    这个(1/2 + 1/4 + .. + ) 系列is well-known for being 1。因此,我们可以将N * (1/2 + 1/4 + .. + 1/2^L))简化为O(N)。

    【讨论】:

      【解决方案2】:

      你是对的!这基本上是一个几何级数,商为2,元素的数量为lg(n),因为我们在外循环的每次迭代中将i 除以2。

      1, 2, 4, ..., n

      使用已知公式计算总和,我们得到:


      我们之所以有lg (n)元素,是因为我们将i每次迭代除以2,因此我们需要求解k的迭代次数:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 2022-04-22
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        相关资源
        最近更新 更多