假设有一个算法/函数运行如下:
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'的关系的总和吗?其他方法?我感谢任何帮助。
答案 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)),