遵循递归算法的时间复杂度是多少?

时间:2018-12-07 05:11:16

标签: algorithm time-complexity master-theorem

以下递归算法的复杂性是什么?

void rec(n){
 if(n<=0)
    return;
 else
    rec(n/3)+rec(n/2); 
}

1 个答案:

答案 0 :(得分:4)

上述程序的时间复杂度为O(2 ^ k),其中k为递归深度。 在这里,2源自以下事实:在每个递归调用中,我们都给另外两个递归调用提供了调用。现在,让我们分析最深的递归深度(k)。

enter image description here

在上图中,递归路径在每个步骤中除以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是递归深度。