有关计算代码时间复杂度的问题

时间:2014-11-18 18:55:21

标签: c performance algorithm big-o time-complexity

我知道所有符号(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))。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

在这个算法中,关键是计算while循环执行的次数。我们称之为x。要查找x,我们必须了解sx方面的行为。

变量s最多是序列的第一个x项的总和(1,2,3 ......)。那就是:

s = x*(x+1)/2

现在我们必须了解xn方面的表现。也就是说,我们需要找到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)

首先,你已经说服了自己,问题受到ns增长的限制。

让我们看看s的增长速度。每次迭代时,i的当前值都将被添加,i本身将添加1.即,在第j次迭代中,i == j。

所以,给定任何迭代,s的当前值总和从1到当前i,大致为i^2,将与n进行比较

因此,迭代次数基本上为i,将由n限制,这就是为什么这里是sqrt(n)的关系。