对具有线性复杂度的嵌套循环感到困惑(Big-Oh = O(n)),但我努力做到对数

时间:2019-07-12 11:46:31

标签: algorithm time-complexity big-o

算法的计算复杂度和大o

  

T(n)= 5n log n + 3log n + 2 //到基数2 big o = o(n log n)

for(int x = 0,i = 1;i <= N;i*=2)
{
    for(int j = 1 ;j <= i ;j++)
    {
        x++;
    }
}

期望的大o是线性的,因为我的对数

3 个答案:

答案 0 :(得分:3)

您的Big-Oh分析不正确。确实,外循环执行了 n 次,但内循环在每次迭代中在 i 中都是线性的。

如果计算内部循环的迭代总数,您会发现整个过程是线性的:

内部循环将进行‍1 + 2 + 4 + 8 + 16 + ... + (the last power of 2 <= N)个迭代。该总和将在N2*N之间,这使整个循环呈线性。

答案 1 :(得分:3)

让我解释一下为什么您的分析是错误的。

很明显,内部循环将执行1 + 2 + 4 + ... + 2^k次,其中k是满足方程的最大整数。这意味着k的上限是

在不失一般性的情况下,我们可以为k取上限,并假设k是整数,复杂度等于1 + 2 + 4 + ... + =几何级数等于

因此,用O表示为O(n)

答案 2 :(得分:0)

首先,您应该注意到您的分析不是对数的!由于N \log N不是对数的。

此外,时间复杂度为T(n) = sum_{j = 0}^{log(n)} 2^j(因为每次复制i的值)。因此,T(n) = 2^(log(N) + 1) - 1 = 2N - 1 = \Theta(N)