Algorithm 算法时间复杂度:循环中的i/=2 intfun(intn){ 整数计数=0; 对于(int i=n;i>0;i/=2) 对于(int j=0;j

Algorithm 算法时间复杂度:循环中的i/=2 intfun(intn){ 整数计数=0; 对于(int i=n;i>0;i/=2) 对于(int j=0;j,algorithm,Algorithm,我对时间复杂性的计算非常陌生。对于这个算法,我得到的答案是O(nlogn),但答案显然是O(n) 我的逻辑是,外部循环呈指数下降,将以对数为基础出现2(N)次。当内部循环成为几何和时,它将总共运行N次(第一次迭代是N/2次,然后是N/4次,然后是N/8次…)。如果我把它们放在一起,并将它们相乘,作为嵌套循环的结果,这就是我得到O(NlogN)的地方。 我是否遗漏了一些明显的内容?外部循环将总共运行log(n)次。现在,如果你观察内部循环,它第一次运行n次,下一次运行n/2次,依此类推,那么它就生

我对时间复杂性的计算非常陌生。对于这个算法,我得到的答案是O(nlogn),但答案显然是O(n)

我的逻辑是,外部循环呈指数下降,将以对数为基础出现2(N)次。当内部循环成为几何和时,它将总共运行N次(第一次迭代是N/2次,然后是N/4次,然后是N/8次…)。如果我把它们放在一起,并将它们相乘,作为嵌套循环的结果,这就是我得到O(NlogN)的地方。
我是否遗漏了一些明显的内容?

外部循环将总共运行log(n)次。现在,如果你观察内部循环,它第一次运行n次,下一次运行n/2次,依此类推,那么它就生成了这个序列

int fun(int n) {
    int count = 0;
    for (int i = n; i > 0; i /= 2)
        for (int j = 0; j < i; j++)
            count += 1;
    return count;
}
这两者的总和将是(2*n),这意味着它是O(n)

因此,时间复杂度为O(n),因为外循环运行O(logn)次,内循环运行O(n)次


它不是O(nlogn),因为内部循环不会每次执行n个步骤,事实上,执行的所有步骤的总和将是O(n)

这很有用。我想我把操作总数和运行时间搞混了。如果我理解正确,时间复杂度将是两个循环中最差的一个,在本例中为O(n)。@user6142489一般来说,它不是两个循环中最差的一个,而是最内层循环的总迭代次数。因此,正如这个答案中所指出的,我们需要进行相应的求和,求出O(n)的总和。但是请注意,通常的过程是获取每个循环的复杂度的乘积(因此不是最大值),但这会导致这里的界限过于宽松,因为最内层循环的迭代次数取决于i.interest的当前值。非常感谢。
n(1 + 1/2 + 1/4 + 1/8 + 1/16 + ...)