以下代码的时间复杂度有解释吗?

时间:2017-03-23 19:03:44

标签: asymptotic-complexity

此算法的时间复杂度是什么?为什么?

int count = 0;
for (int i = N; i > 0; i /= 2) {
    for (int j = 0; j < i; j++) {
        count += 1;
    }
}

正确答案是O(n),但我得到了O(nlogn)。谁能告诉我为什么它是O(n)?

1 个答案:

答案 0 :(得分:0)

在第一次迭代中,内循环执行N次,然后执行N/2次,然后执行N/4次,依此类推。这可以表示为无限和:

N + N/2 + N/4 + N/8 + N/16 + N/32 + ...

如果您将每个字词的N分解出来,则会得到:

N * (1 + 1/2 + 1/4 + 1/8 + 1/16 + 1/32 + ...)

括号中的无限序列收敛于值2(关于Wikipedia的更多信息)。因此,操作次数可以简化为:

N * 2

就Big-O而言,渐近值在:

之内
O(N)

您可以通过观察Ncount之间输出中的关系是线性的来检查这一点:Ideone Demo