我想找到递推方程来计算时间复杂度
int Fib(int n)
{
if (n <= 1)
return n;
else
return Fib(n - 1) + Fib(n - 2);
}
我可以解决递推方程,但我很难找到方程和基本情况。
这是正确的等式吗?
T(n)= T(n-1)+ T(n-2)+1
,对于基本情况?
T(0)= 0
T(1)= 0
一般来说,如何找到算法的基本情况?
答案 0 :(得分:3)
对于复杂性,此示例中的基本情况通常并不重要。我个人可能会设置T(0) = 1
,T(1) = 1
,因为没有时间是零。但只要看看你的复发关系。它本身就是斐波纳契式的序列,无论基本情况如何,它都将成指数(几乎 - )。
基本情况的一般问题是你需要一个具体的答案(&#34;计算Fib(0)
需要多长时间?&#34;),但实际的&#34;时间单位& #34;在复杂性计算中通常定义不明确。确切地说,您应该将T(0)定义为等于常量 k_1
,并将T(1)定义为等于常量 k_2
,并从那里工作。如果您需要常量的数值来解决递归关系,那么可能出现了问题。
同样,您可以将递归关系设置为T(n) = T(n-1) + T(n-2) + k_3
。
请注意,如果&#34;时间单位&#34;对于您的复杂性计算是&#34;添加的执行次数&#34;,忽略其他逻辑,那么您的基本情况在0
是正确的。如果(例如)添加是由用户提供的函数完成的,那么这将是一种分析时间的有用方法,该函数的性能超出了分析的范围。