我正在尝试确定这些循环的Big-O运行时。我相信我的答案是正确的,但我想与社区核实。
int sum = 0;
for (int i = 1; i <= n*2; i++ )
sum++;
我的回答是O(n)
这是因为循环迭代n次2次。我们放弃2并留下n。因此O(n)。
int sum = 0;
for ( int i = 1; i <= n; i++)
for ( int j = n; j > 0; j /= 2)
sum++;
我的回答是O(n lgn)
外循环迭代n次。内部循环从n向下迭代到0,但只有一半的项目。这可以作为n的Log base 2。我们删除2并保留log n。内循环(log n)乘以外循环(n),得到O(n lgn)。
int sum = 0;
for ( int i = 1; i <= n; i++)
for ( int j = i; j <= n; j += 2)
sum++;
我的答案是O(n ^ 2)
这个很容易。内循环和外循环每次迭代n次。 n x n = n ^ 2。因此O(n ^ 2)。
int sum = 0;
for ( int i = 1; i <= n * n; i++)
for ( int j = 1; j < i; j++ )
sum++;
我的答案是O(n ^ 3)
我的答案是否正确?如果没有,我该如何纠正它们?
答案 0 :(得分:2)
只有最后一个是错的。它应该是O(n⁴)。
您可以这样看:用n * n
替换x
。操作次数通常为O(x *(x + 1)/ 2)= O(x²)。现在将n * n
替换回x
。
<小时/> 为您带来额外挑战。
你正确地说:
int sum = 0;
for ( int i = 1; i <= n; i++)
for ( int j = n; j > 0; j /= 2)
sum++;
是O(n log n)。但是这个怎么样:
int sum = 0;
for ( int i = 1; i <= n; i++)
for ( int j = i; j > 0; j /= 2)
sum++;
我只将j = n
更改为j = i
。