是的,至少在最坏情况分析下你说得对。
请注意,对于某个自然数 k
,当 n = 2^k
时,除了到达停止条件外,条件始终为真,并且递归函数将运行两次。
当此条件建立时,仅需分析:
T(n) = T(n/2) + T(n/2) + X
其中X
是某个常数,(如果忽略其他递归调用,则每次递归调用都需要完成相同的工作量)。
根据主定理情况1,得出:
f(n) = X
a = 2, b = 2, c = 0 (since X is in O(n^0)=O(1))
由于 c=0 < 1 = log_2(2)
,因此满足情况1的条件,我们可以得出函数 T(n)
在 Theta(n^log_2(2)) = Theta(n)
中。
平均情况分析:
对于平均情况,使用均匀分布的数字 n
,在该数字的二进制表示中,一半位于上方(1),另一半位于下方(0)。
由于除以2基本上是算术右移,而且条件 isEven(n)
仅在最低有效位为0时为真,这意味着平均复杂度函数为:
T(n) = 0.5 T(n/2) + 0.5 * 2 T(n/2) + X = 0.5 * 3 * T(n/2) + X
= 1.5 * T(n/2) + X
So
T(n) = 3/2 T(n/2) + X
情况1仍然适用(假设常数X
不变):
a = 3/2,b=2,c = 0
则平均情况时间复杂度为Theta(n^log_1.5(2))~=Theta(n^0.58)
快速说明:
这假定所有算术操作确实是O(1)
的。如果不是这种情况(数字很大),则应该将它们的复杂度放在定义T(n)
中的常数位置,并重新分析。假设每个此类操作都是次线性的(与表示其的位数无关),则结果仍为Theta(n)
,因为主定理的情况1仍适用。(对于平均情况,“优于”~O(n^0.58)
的任何函数都不会改变所示的结果。
a=pow(x,n/2); return a*a;
- karakfa