问题描述
下面的此循环的时间复杂度是多少?
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
次,但是现在我不知道如何进行。如何从此循环中获得代字号或big-O?
谢谢。
解决方法
此循环的Big-O为O(N),例如迭代次数对N的依赖性是线性的。
大约1/2 + 1/4 + 1/8 + ... https://en.wikipedia.org/wiki/1/2_%2B_1/4_%2B_1/8_%2B_1/16_%2B_%E2%8B%AF
, N + N / 2 + N / 4 + N / 8 + ... +1形成一个GP(几何级数),总和为2N。在用大O定义时间复杂度时,我们舍弃了常数。因此,您问题的时间复杂度为O(N)。