以下递归算法的复杂性是什么?
void rec(n){
if(n<=0)
return;
else
rec(n/3)+rec(n/2);
}
答案 0 :(得分:4)
上述程序的时间复杂度为O(2 ^ k)
,其中k为递归深度。
在这里,2
源自以下事实:在每个递归调用中,我们都给另外两个递归调用提供了调用。现在,让我们分析最深的递归深度(k
)。
在上图中,递归路径在每个步骤中除以2将花费更长的时间才能达到其小于1的值(这是基本情况),因此它将是最深的递归深度。因为,每次我们将n
除以2
。日志步骤将达到少于1
。尽管我们也将n
除以3
。将n
除以2
将花费更长的时间,因此是最深的递归深度的决定因素。有关详细信息:
在
1st
调用中,我们将n减小n /2。
在2nd
调用中,我们将n减小n (n / 2)/ 2 = n / 4 = n / 2 ^ 2。
因此,在Kth
步骤中,我们减少了n 作者:n / 2 ^ k =1。
因此,n = 2 ^ k。
两边都以2为底的对数,
log2 n = log2(2 ^ k)
log2 n = k log2(2)
log2 n = k * 1 [因为log2(2)是1]
因此,在最深的递归深度中,我们需要k = log(n)
步才能达到n = 1,再需要一步才能达到n <=0。但是,总体而言,递归深度将在{{1 }}到log3 n
。
因此,在最坏的情况下,总体时间复杂度为log2 n
。但是,由于我们也将O(2 ^ log n)
除以n
,因此从顶部到叶节点的所有递归路径深度都不会与3
相同。因此,我们可以将时间复杂度总结为log n
,其中k是递归深度。