递归函数的大O.

时间:2015-09-19 16:04:22

标签: algorithm recursion big-o time-complexity

我知道当你将问题集的大小分成指定的分数时,你要处理O(log(n))。但是,当他们进行多于1次递归调用时,我很困惑。例如,在此函数中,我们将计算指数的值。

message=The messages for {0} - {1, list}

进行分析后,我得到的运行时间等于O(N)。我对么?谢谢你的时间

1 个答案:

答案 0 :(得分:4)

是的,你是对的,至少在最坏情况分析下。

请注意,对于n = 2^k,对于某些自然k,除了到达stop子句时,条件始终为true,并且递归函数将运行两次。

当确定时,就足以分析:

T(n) = T(n/2) + T(n/2) + X

其中X是常量,(如果忽略其他递归调用,则每个递归调用都需要不断的工作量。)

来自master theorem case 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基本上是算术右移,当且仅当最低有效位为0时,条件isEven(n)为真,这意味着平均复杂度函数为:

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

所以

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仍然适用。 (对于一般情况,任何功能&#34;比~O(n^0.58)更好&#34;不会改变显示的结果