我知道当你将问题集的大小分成指定的分数时,你要处理O(log(n))。但是,当他们进行多于1次递归调用时,我很困惑。例如,在此函数中,我们将计算指数的值。
message=The messages for {0} - {1, list}
进行分析后,我得到的运行时间等于O(N)。我对么?谢谢你的时间
答案 0 :(得分:4)
是的,你是对的,至少在最坏情况分析下。
请注意,对于n = 2^k
,对于某些自然k
,除了到达stop子句时,条件始终为true,并且递归函数将运行两次。
当确定时,就足以分析:
T(n) = T(n/2) + T(n/2) + X
其中X
是常量,(如果忽略其他递归调用,则每个递归调用都需要不断的工作量。)
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;不会改变显示的结果