【发布时间】:2020-12-25 22:36:48
【问题描述】:
下面这个循环的时间复杂度是多少?
int sum = 0;
for(int n = N; n > 0; n/=2)
for(int i = 0; i < n; i++)
sum++
我发现内部循环运行N + N/2 + N/4 + N/8 + ... + 1 次,但现在我不知道如何继续。如何从这个循环中获得波浪号或大 O?
提前致谢。
【问题讨论】:
-
提示:N + N/2 + N/4 + ... + 1 = 2*N
-
为什么等于2*N?
-
如果答案是 2*N,那么波浪号是 2N,大 O 是 N,但我想知道你是如何得到 2*N 的
-
我不会向你证明,但直觉很简单。您从 N 开始,与 2N 的差为 N。您添加 N/2,差异缩小到 N/2,添加 N/4,它缩小到 N/4,依此类推。随着您添加更多项,与 2N 的差异会相应缩小,越来越小,但从未完全达到 2N。
-
@belismau 是的,它是
O(2N) = O(N)(在复杂性理论中省略了常数因素)
标签: algorithm time-complexity big-o tilde