确定这些循环的 Big-O 运行时
Determine Big-O runtime for these loops
我正在尝试确定这些循环的 Big-O 运行时。我相信我的答案是正确的,但我想与社区核实一下。
int sum = 0;
for (int i = 1; i <= n*2; i++ )
sum++;
我的答案是 O(n)
这是因为循环重复 n x 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,但只迭代了一半的项目。结果是 Log base 2 of n。我们删除 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)
我的回答正确吗?如果不是,我该如何更正它们?
只有最后一个错了。应该是 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
。
我正在尝试确定这些循环的 Big-O 运行时。我相信我的答案是正确的,但我想与社区核实一下。
int sum = 0;
for (int i = 1; i <= n*2; i++ )
sum++;
我的答案是 O(n)
这是因为循环重复 n x 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,但只迭代了一半的项目。结果是 Log base 2 of n。我们删除 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)
我的回答正确吗?如果不是,我该如何更正它们?
只有最后一个错了。应该是 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
。