for循环中的增长顺序

时间:2014-01-25 01:19:45

标签: algorithm time-complexity

如何分析此代码片段以断定它是O(N)?

int sum = 0;
for (int i = 1; i < N; i *= 2)
    for (int j = 0; j < i; j++)
        sum++;

1 个答案:

答案 0 :(得分:3)

外循环中i的值呈指数增长,您可以将其视为每次增加一个二进制数字。表示N所需的位数是log(N)。因此外部循环将执行log(N)次内部循环将执行

2^0 + 2^1 + 2^2 + ... + 2^log(N)

geometric series的公式(根据Niklas B的评论更新)

1(1 - 2^log(N))/(1 - 2)
= 2^(log(N) + 1) - 1
~= 2N

所有算法都是O(2N + log(N))

但对于big-O表示法,2N组件将压倒log(N),因此整体复杂度为O(N)

相关问题