查找给定嵌套循环的时间复杂度

问题描述

下面的此循环的时间复杂度是多少?

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

关于Big-O https://www.khanacademy.org/computing/computer-science/algorithms/asymptotic-notation/a/big-o-notation

, N + N / 2 + N / 4 + N / 8 + ... +1形成一个GP(几何级数),总和为2N。在用大O定义时间复杂度时,我们舍弃了常数。因此,您问题的时间复杂度为O(N)。