Algorithm 假设递归函数的递推关系
计算递归程序时间复杂度的方法是什么? 让我们以这段代码为例Algorithm 假设递归函数的递推关系,algorithm,recursion,time-complexity,Algorithm,Recursion,Time Complexity,计算递归程序时间复杂度的方法是什么? 让我们以这段代码为例 int hypo(int a, int n) { if(n == 1) return 0; else return a + hypo(a,n-1) * hypo(a,n-1); } 这种形式的大多数简单问题都可以用主定理来解决。看 对于更复杂的问题,存在更复杂的方法。:-) 您必须做的第一件事是编写指定运行时间的方程式(这通常很简单,不涉及任何求解)。在您的示例中,用
int hypo(int a, int n)
{
if(n == 1)
return 0;
else
return a + hypo(a,n-1) * hypo(a,n-1);
}
这种形式的大多数简单问题都可以用主定理来解决。看
对于更复杂的问题,存在更复杂的方法。:-) 您必须做的第一件事是编写指定运行时间的方程式(这通常很简单,不涉及任何求解)。在您的示例中,用
f(a,n)
表示参数a
和n
的函数运行时间,然后:
不依赖于f(a,n)
,所以让我们编写它a
f(n)
是一个常数;让我们用f(1)
k
- 如果
,则n>1
,其中f(n)=c+2*f(n-1)
是一个常数(另一个)c
f(n)=c+2*f(n-1)
和f(1)=k
。没有通用方法,但在您的情况下,很容易计算f(2)
,f(3)
,…:
f(2) = c + 2 * f(1) = c + 2 * k
f(3) = c + 2 * f(2) = 3 * c + 4 * k
f(4) = c + 2 * f(3) = 7 * c + 8 * k
f(5) = c + 2 * f(4) = 15 * c + 16 * k
从这里很容易找到
f(n)
(你可以通过归纳证明公式,或者说“这很明显”)。计算出执行hypo
(无递归调用)一次的成本,并计算出递归调用该方法的次数。一般来说,你必须按照@MAV所说的做,但是你的例子很糟糕,不是返回hypo(a,n-1)*hypo(a,n-1)只是找到b=hypo(a,n-1);返回b*2。您的代码必须具有可怕的时间复杂度2^n,但如果您喜欢我所说的,它不仅是多项式,而且是线性的;)基本上,对于您的代码,获取hypo(a,n)的时间就是获取hypo(a,n-1)两次的时间。也就是说,t(a,n)=2*t(a,n-1)同样,t(a,1)基本上是1,从这里你可以得到complexity@piotrekg2我不同意阿里·阿米里的评论和否决票。你应该取消删除你的答案-它实际上回答了问题,给出了一个很好的递归关系,并提到了如何加速它。主定理在这里并不实际适用。重复出现的形式错误。