算法的计算复杂度和大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是线性的,因为我的对数
答案 0 :(得分:3)
您的Big-Oh分析不正确。确实,外循环执行了 n 次,但内循环在每次迭代中在 i 中都是线性的。
如果计算内部循环的迭代总数,您会发现整个过程是线性的:
内部循环将进行1 + 2 + 4 + 8 + 16 + ... + (the last power of 2 <= N)
个迭代。该总和将在N
和2*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)
。