以下代码的渐近复杂度是多少

What is the asymtotic complexity of the following code

我对下面代码的复杂度有些疑惑 外层循环将执行 O(N) 次 我怀疑内部循环是要执行 O(1) 还是 O(n)

for (int i=0; i<n; i++)
for (int j=i; j< i; j+=i) 
{ 
print(“*”);
}
}

内部是O(i),每次递增,所以全局复杂度为: 内循环执行次数:1+2+3+...+n,即:

因此 O(n^2)

因为 j 在内部循环中被初始化为 i,所以该循环永远不会执行,因为条件要求 j 小于 i。因此,复杂度为 O(n):所有这一切只是在外循环中递增 i 并在外循环体的每次迭代期间验证 i 不小于 i.

正如有人指出的那样,代码内部循环将执行 0 次,所以我假设你的意思是:

for (int i=0; i<n; i++)
{
  for (int j=0; j<n; j+=i) 
  { 
    print(“*”);
  }
}

那么,在后续的外循环执行中,内循环的执行次数为N, N/2, N/3, N/4, ...。所以总时间将为 N + N/2 + N/3 + ... = N * (1 + 1/2 + 1/3 + ...)。现在,我们可以看到 (1 + 1/2 + 1/3 + 1/4 + ...) <= (1 + 1/2 + 1/4 + 1/4 + 1/8 + 1/8 + 1/8 + 1/8 + ...)。对于每个额外的 1/2,第二个表达式需要两倍的项(例如,您需要两倍于 1/41/8 来生成 1/2),因此它将是 O(logN)。所以总的复杂度是 O(N*logN).