如何计算以下函数的时间复杂度?
int Compute (int n)
{
int j = 0;
int i = 0;
while (i<=n)
{
i = 2*j + i + 1;
j++;
}
return j-1;
}
现在,我知道循环具有O(n)时间复杂度,但在这种情况下i
以更快的速度增长。通过迭代进行迭代,我发现,对于每个第m次迭代i = m^2
。但我仍然对如何计算Big-O感到困惑。
答案 0 :(得分:3)
如果你看几次迭代的i和j的值:
i=1
j=1
i=4
j=2
i=9
j=3
i=16
j=4
等等。通过数学归纳,我们可以证明我取方形值:( 2*n + n^2 + 1 = (n+1)^2 )
因为我们只在i&lt; = n时循环,并且因为我接受了数值1,2 ^ 2,3 ^ 2,...,k ^ 2&lt; = n,这意味着我们在i = k时停止超过sqrt(n)。因此,复杂性似乎是O(k),这意味着O(sqrt(n))。