刷新算法的复杂性,我看着这个例子:
int x = 0;
for ( int j = 1; j <= n; j++ )
for ( int k = 1; k < 3*j; k++ )
x = x + j;
我知道这个循环最终是O(n ^ 2)。我相信内循环执行3 * n次(3(1 + 2 + ... n)),外循环执行n次。因此,O(3n * n)= O(3n ^ 2)= O(n ^ 2)。
然而,我正在研究的源代码将内部循环的执行扩展为:3(1+2+3+...+n) = 3n^2/2 + 3n/2
。任何人都可以解释3n^2/2 + 3n/2
执行时间吗?
答案 0 :(得分:1)
对于每个J你必须执行J * 3迭代的内部循环,所以命令x=x+j
将最终执行n * 3 *(1 + 2 + 3 ... + n)次,总和Arithmetic progression是n *(n + 1)/ 2,因此您将执行命令:
3 * n * (n+1)/2 which is equals to (3*n^2)/2 + (3*n)/2
但是大O不是迭代次数,它是关于渐近度量的,所以在表达式中3 * n *(n + 1)/ 2需要删除consts(将它们全部设置为0或1),所以我们有1 * n *(n + 0)/ 1 = n ^ 2
关于这种情况的大O计算的小更新:从3n(n + 1)/ 2做大O,对于大O你可以想象比N是无穷大,所以:
infinity + 1 = infinity
3*infinity = infinity
infinity/2 = infinity
infinity*infinity = infinity^2
所以在此之后你有N ^ 2
答案 1 :(得分:1)
Big O
表示法给出了算法渐近运行时间的上限。它没有考虑低阶项或常数因子。因此,O(10n 2 )和O(1000n 2 + 4n + 56)仍为O(n 2 )。
您正在尝试计算算法中的操作数量。但是Big O
没有说明确切的操作次数。它只是为您提供了在不利输入时可能出现的最坏情况运行时间的上限。
答案 2 :(得分:1)
从1到m的整数之和是m *(m + 1)/ 2。在给定的问题中,j从1变为n,k从1变为3 * j。因此k上的内循环执行3 *(1 + 2 + 3 + 4 + 5 + ... + n)次,该系列中的每个项代表j的一个值。得到3n(n + 1)/ 2。如果你扩展它,你得到3n ^ 2/2 + 3n / 2。但是整个事情仍然是O(n ^ 2)。你不关心你的执行时间是否呈二次和线性上升,因为线性被二次方淹没了。
答案 3 :(得分:1)
使用Sigma符号可以找到算法的精确精度:
经验证实。