我很难用O表示法定义以下算法的运行时间。我的第一个猜测是O(n),但是迭代和我应用的数字之间的差距并不稳定。我怎么错误地定义了这个?
public int function (int n )
{
if ( n == 0) {
return 0;
}
int i = 1;
int j = n ;
while ( i < j )
{
i = i + 1;
j = j - 1;
}
return function ( i - 1) + 1;
}
答案 0 :(得分:29)
while
大约n/2
时间执行。
执行递归时,n
传递的值大约是原始n
的一半,所以:
n/2 (first iteration)
n/4 (second iteration, equal to (n/2)/2)
n/8
n/16
n/32
...
这类似于geometric serie。
事实上它可以表示为
n * (1/2 + 1/4 + 1/8 + 1/16 + ...)
因此它会收敛到n * 1 = n
所以O表示法是 O(n)