我试图找出使用Big O表示法的for循环的复杂性。我之前在其他课程中已经完成了这个,但是这个比其他课程更严格,因为它是在实际的算法上。代码如下:
for(cnt = 0, i=1; i<=n; i++) //for any size n
{
for(j = 1; j <= i; j++)
{
cnt++;
}
}
和
for(cnt = 0, i=1; i<=n; i*=2) //for any size n
{
for(j = 1; j <= i; j++)
{
cnt++;
}
}
我已经到了,第一个循环具有O(n)复杂度,因为它经过n次列表。至于第二个循环,我有点迷失。我相信,对于每个被测试的n,它都会经历一次循环。我(错误地)假设这意味着每次评估循环都是O(n * i)。在我的假设中是否有任何我遗漏的东西。我知道cnt ++是恒定的时间。
感谢分析方面的帮助。每个循环都在自己的空间中,它们不在一起。
答案 0 :(得分:7)
第一个示例的外部循环执行n
次。对于外循环的每次迭代,内循环执行i
次,因此总体复杂度可以如下计算:一次用于第一次迭代加上两次用于第二次迭代加三次用于第三次迭代,依此类推,n
- 迭代加n
。
1+2+3+4+5+...+n = (n*(n-1))/2 --> O(n^2)
第二个例子比较棘手:因为i
每次迭代加倍,外部循环只执行Log2(n)
次。假设n
是2
的幂,则内循环的总和为
1+2+4+8+16+...+n
复杂度2^Log2(n)-1 = n-1
为O(n)
。
对于不是2的幂的n
s,确切的迭代次数为(2^(Log2(n)+1))-1
,仍为O(n)
:
1 -> 1
2..3 -> 3
4..7 -> 7
8..15 -> 15
16..31 -> 31
32..63 -> 63
等等。
答案 1 :(得分:0)
希望这不是作业,但我确实看到你至少在这里尝试了,所以这是我对此的看法:
cnt
增加n *(n + 1)/ 2次,这使得两个循环的整个集合为O(n ^ 2)。第二个循环平均为O(n / 2),即O(n)。
答案 2 :(得分:0)
第一个例子是O(N ^ 2),而What is the Big-O of a nested loop, where number of iterations in the inner loop is determined by the current iteration of the outer loop?将是一个回答问题的问题,其中关键是注意内循环的轮数取决于n。
第二个例子可能是O(n log n),因为外部循环以不同于线性的比例递增。查看二进制搜索以获取对数复杂性情况的示例。在第二个例子中,外部循环是O(log n),内部循环是O(n),它们组合起来给出O(n log n)复杂度。