此算法的时间复杂度是什么?为什么?
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)?
答案 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)
您可以通过观察N
和count
之间输出中的关系是线性的来检查这一点:Ideone Demo