算法分析-大O

时间:2018-08-20 11:56:04

标签: algorithm big-o

  

打印了几颗星星? (选择最小的正确估算值。)

for (int i = 0; i < N / 2; i = i + 1)
    for (int j = 1; j < N / 2; j = 2 * j)
        StdOut.print("**");
     
      
  1. O(log N)
  2.   
  3. O(N)
  4.   
  5. O(N log N)
  6.   
  7. O(N ^ 2)
  8.   

我对这个问题有些困惑,我认为是A或D,但不确定。

我知道Big O表示法是如何工作的,但是当您乘以2时,我对内部循环中的增量感到困惑。我认为它是A的原因是由于外部循环是对数(?)但是正如我所说,我不太确定内部循环。预先谢谢你

2 个答案:

答案 0 :(得分:4)

说明

外部循环生成N / 2个迭代。对于此迭代中的每个迭代,内部循环都会上升到N / 2,但步长为2 * j。也就是说,您以N / 2个步骤到达log_2(N / 2)


示例

输入数字64。我们从1开始,并在每次迭代中乘以2

 1
 2
 4
 8
16
32
64

我们以64个步骤到达了6。而且,实际上642^6。所以log_2(64)6


解决方案

因此,总共有来自外部循环的N / 2个迭代,每个迭代都产生了内部循环的log_2(N / 2)个迭代。那使

N / 2 * log_2(N / 2)
总共条打印线的执行。因此,3. O(N log N)是正确的答案。

而且,由于它是 big-O ,因此该算法也可以在4. O(N^2)中运行。但是,3. O(N log N)是最小的正确估计。

答案 1 :(得分:1)

  

当您乘以2 ...时,我对内部循环中的增量感到更加困惑。

当您从1开始并将变量乘以2时,您将需要log(N) (base 2)步才能达到N。因此,内部循环的复杂度为O(log(N/2),相当于O(log(N) - log 2) = O(log(N))

  

我认为它是A的原因是由于外循环是对数的...

另一方面,外部循环是O(N/2) = O(N),因为i在每一步都在增加1,这需要N/2直到i等于N/2

由于内部循环不依赖于外部循环,因此在这种情况下,我们可以乘以复杂度,并说整体复杂度为O(N*log(N))

因此,正确的选项是c