大O - 嵌套循环

时间:2013-06-23 10:28:55

标签: big-o

void bar(int N){
  int c=0;
  for (int i=0; i<N*N; i++)
    for (int j= i; j< N; j++)
      c++;
}

上面的外部(和内部)循环永远不会超过N.这是否意味着大O是N * N(外部为N,内部为N / 2)?

2 个答案:

答案 0 :(得分:6)

如果你这样做

for (int i = 0; i < N; i++)
  for (int j = i; j < N; j++)
    …

首先在内循环中迭代N次,然后在N-1,然后N-2等中迭代N次,其总和为N(N-1)/ 2。该循环以O(N²)运行,即外环的平方。

在您的情况下,您的代码等同于

for (int i = 0; i < N; i++)
  for (int j = i; j < N; j++)
    c++;

因为对于每个正整数,我们有N²≥N,并且编译器应该足够聪明地注意到如果i大于N则继续运行外部循环是没有意义的。因此复杂性确实是O(N 2)。

如果您在程序运行后打印Nc,您会注意到当N加倍时,c几乎乘以4(2²):< / p>

N = 1, c = 1
N = 2, c = 3
N = 4, c = 10
N = 8, c = 36
N = 16, c = 136
N = 32, c = 528
N = 64, c = 2080
N = 128, c = 8256
N = 256, c = 32896
N = 512, c = 131328
N = 1024, c = 524800
N = 2048, c = 2098176

答案 1 :(得分:0)

正式了解迭代次数和增长顺序:

enter image description here