[英]What is the running time complexity of the following piece of code?
void foo(int n){
int i = 1, sum = 1;
while (sum <= n) {
i++;
sum+=i;
}
}
我的感觉是,只有当总和大于参数n
,循环才会终止。 并且,第j
次迭代的Sum
为: S(j) = S(j-1) + j
S(1) = S(0) + 1
S(2) = S(1) + 2
S(3) = S(2) + 3
...
S(n) = S(n-1) + n
我应该怎么走? 我被这种重复关系困扰。
当1 + 2 + 3 + ... + j
次大于n
时,循环将终止。 但是我不相信这是否可以。
证明这一点的经典方法是按两个顺序将序列写两次,即:
S(n) = 1 + 2 + 3 + ...+ n-2 + n-1 + n
S(n) = n + (n-1) + (n-2) + ...+ 3 + 2 + 1
如果您逐项总结这些术语,您将得到
2S(n)= n+1 + n+1 + n+1 + ... + n+1
用n
词
因此
S(n) = n*(n+1)/2
(据称是高斯发现的一个小学生的结果)
由此可见,它需要进行O(sqrt(n))次迭代。
您差不多完成了。 您需要注意的最后一件事是1 + 2 + 3 + ... + j
是(1 + j) * j / 2
或O(j^2)
。 这是数学(算术级数)中众所周知的公式。
它会在k
次迭代后中断
1 + 2 + .... + k > n
k*(k+1)/2 > n
k*k + k - 2*n >0
k
k = (-1 + sqrt(1+8n))/2
(舍弃负值)
因此,时间复杂度为sqrt(n)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.