我知道所有符号(Big O和小o,Big Omega,小欧米茄)的界限和一切。但我仍然是新手,我读了这段代码:
void Function(int n)
{ int i=1, s=1;
while(s<=n)
{
i++;
s=s+i;
printf("*");
}
}
这本书说运行时间是sqrt(n)或O(sqrt(n))。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:4)
在这个算法中,关键是计算while循环执行的次数。我们称之为x
。要查找x
,我们必须了解s
在x
方面的行为。
变量s
最多是序列的第一个x
项的总和(1,2,3 ......)。那就是:
s = x*(x+1)/2
现在我们必须了解x
在n
方面的表现。也就是说,我们需要找到x
,例如:
x*(x+1)/2 <= n
x*x+x <= 2n
x <= 1/2 * (sqrt(8n+1)-1)
因此,给定一些n
,循环将迭代O(1/2 * (sqrt(8n+1)-1))
= O(sqrt(n))
次。
答案 1 :(得分:1)
首先,你已经说服了自己,问题受到n
和s
增长的限制。
让我们看看s
的增长速度。每次迭代时,i
的当前值都将被添加,i
本身将添加1.即,在第j次迭代中,i
== j。
所以,给定任何迭代,s
的当前值总和从1到当前i
,大致为i^2
,将与n
进行比较
因此,迭代次数基本上为i
,将由n
限制,这就是为什么这里是sqrt(n)
的关系。