计算大功能。如何计算此函数中的大O符号?
实施例:
function fun1(int n)
{
int s = 0;
for(int i = 0; s < n; i++)
{
s += i;
for(var j = s; j < n; j++)
{
console.log(j);
}
}
return s;
}
答案 0 :(得分:1)
粗略地说,考虑外循环的i
次迭代。执行循环体后,
s = 1 + 2 + ... + i-1 + i
由高斯的同一性等于i*(i+1)/2 = (i²+i)/2
。 i
使得该表达式小于n
的最大值可以通过如下的基本计算获得。如果我们需要
(i²+i)/2 <= n
表示
i²+i-2n <= 0
我们可以使用reduced quadratic equation的公式来获取
i <= -1/2 + sqrt(1/4+2n)
位于O(n^{1/2})
。在外循环的每次迭代中,内循环进行n-s
次迭代,这可以通过n
非常粗略地估计(但这非常不精确,我相信整体分析可以更加精确)。总的来说,这会产生O(n^{1/2}*n)=O(n^{3/2})
的界限。