求解:T(n) = T(n/2) + n/2 + 1
Solve: T(n) = T(n/2) + n/2 + 1
我很难用 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;
}
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)
另一种方法是将其记为T(n) = T(n/2) + n/2 + 1
。
while 循环确实 n/2
工作。传递给下一次调用的参数是 n/2
.
使用 master theorem 解决此问题,其中:
- 一=1
- b = 2
- f = n/2 + 1
Let c=0.9
1*(f(n/2) + 1) <? c*f(n)
1*(n/4)+1 <? 0.9*(n/2 + 1)
0.25n + 1 <? 0.45n + 0.9
0 < 0.2n - 0.1
即:
T(n) = Θ(n)
我很难用 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;
}
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)
另一种方法是将其记为T(n) = T(n/2) + n/2 + 1
。
while 循环确实 n/2
工作。传递给下一次调用的参数是 n/2
.
使用 master theorem 解决此问题,其中:
- 一=1
- b = 2
- f = n/2 + 1
Let c=0.9
1*(f(n/2) + 1) <? c*f(n)
1*(n/4)+1 <? 0.9*(n/2 + 1)
0.25n + 1 <? 0.45n + 0.9
0 < 0.2n - 0.1
即:
T(n) = Θ(n)