以下代码的运行时间复杂度是多少?

时间:2014-09-21 09:40:47

标签: c algorithm

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时,循环将终止。但我不相信,如果可以的话。

3 个答案:

答案 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 / 2O(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)