void foo(int n){
int i = 1, sum = 1;
while (sum <= n) {
i++;
sum+=i;
}
}
我的感觉是,只有当总和大于参数n
时,循环才会终止。
并且,Sum
迭代j
为: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
时,循环将终止。但我不相信,如果可以的话。
答案 0 :(得分:2)
证明这一点的经典方法是在两个命令中编写两次系列,即:
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 :(得分:1)
你差不多完成了。您需要注意的最后一件事是1 + 2 + 3 + ... + j
是(1 + j) * j / 2
或O(j^2)
。这是一个众所周知的数学公式(算术级数)。
答案 2 :(得分:1)
时,它会在
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)
。