使用Big-O表示法确定算法的运行时

时间:2014-02-14 03:49:09

标签: performance function big-o complexity-theory time-complexity

假设有一个算法/函数运行如下:

    function(n)
       int x = 1
       int y = 1
       while( y <= n) {
          x++
          y = y + x
          print("something")
       }

如果我想用Big-O表示法来描述它的运行时间,我会说它会是O(logn)。

但是,我这样说是因为作为一般的经验法则,如果算法跳过元素集'n'中的某些元素(就像在这种情况下那样),那么算法的运行时间很可能是O(logn) 。我怎么去证明这一点呢?我应该检查'y'及其与'n'的关系的总和吗?其他方法?我感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

正如我在评论中提到的,y在函数中以二次方式增长,因此运行时间为O(sqrt(n)),而不是O(logn)。

对于简单算法,您可以在while循环中计数,以计算它为不同的n值运行的次数。这将为您找出想要证明的内容提供一个良好的起点。

要真正证明这一点,只需找出y的公式。您可以通过为小值计算y来处理该问题。你会看到一种模式。

答案 1 :(得分:0)

我试图证明这一点,这就是我想到的事情

x(1) = 1
y(1) = 3
x(n) =  x(n-1) + 1
y(n) = y(n-1) + x(n)

y(n-1)= y(n-2) + x(n-1)
y(n) = y(n-2) + x(n) + x(n-1)
...
y(n) = y(1) + x(n) +x(n-1) + ...+ x(2) 

因为x(n)是具有方差1的算术序列,所以

y(n) = n(n+1)/2  (Approximate)  

然后我们回到@mbroshi提到的结论:y在你的函数中以二次方式增长,因此运行时间为O(sqrt(n)),