以下递归算法的时间复杂度是多少?

Posted

技术标签:

【中文标题】以下递归算法的时间复杂度是多少?【英文标题】:What will be the time complexity of following recursive algorithm? 【发布时间】:2019-05-08 20:53:44 【问题描述】:

以下递归算法的复杂度是多少?

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

【问题讨论】:

它没完没了? n怎么会变成负数或零? @StrangerintheQ:如果是整数,非常容易(1/2 在我知道的大多数语言中产生零)。如果浮动,将需要更多;如果双倍,则更长(例如1/1e1000 通常为零)。遇到麻烦的唯一方法是,如果有理数以弹性整数作为提名和分母(如 Ruby 的 Rational)。 【参考方案1】:

上述程序的时间复杂度为O(2 ^ k),其中k为递归深度。 在这里,2 源于这样一个事实,即在每个递归调用中,我们都在调用另外两个递归调用。现在,让我们分析最深的递归深度 (k)。

在上图中,每一步除以 2 的递归路径将需要更长的时间才能达到小于 1 的值(这是基本情况),因此它将是最深的递归深度。因为,每次我们将n 除以2。它将采取日志步骤达到少于1。虽然我们也将n 除以3。将n 除以2 将花费更长的时间,因此是最深递归深度的决定因素。详情:

1st 调用中,我们将 n 减少 n / 2。 在 2nd 调用中,我们将 n 减少 (n / 2) / 2 = n / 4 = n / 2^2. 因此,在Kth 步骤中,我们减少了 n 由:n / 2^k = 1。 所以,n = 2 ^ k。

两边取log base 2,

log2 n = log2 (2^k) log2 n = k log2(2) log2 n = k * 1 [因为 log2(2) 是 1 ]

因此,在最深的递归深度中,我们需要k = log(n) 步才能达到 n = 1,再多一步才能达到 n log3 n 到 @ 之间987654338@.

因此,在最坏的情况下,总体时间复杂度为O(2 ^ log n)。但是,由于我们还将n 除以3,因此从顶部到叶节点的所有递归路径深度都不会与log n 相同。因此,我们可以得出时间复杂度为O(2 ^ k),其中 k 是递归深度。

【讨论】:

以上是关于以下递归算法的时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

将以下递归算法的时间复杂度 T(n) 表示为递归方程:

请问递归算法的时间复杂度如何计算呢?

统计页码数字0~9分别出现了多少次

具有三个递归调用的递归函数的时间复杂度

题目3. 平衡二叉树算法查找树中某节点的时间复杂度是多少?

该算法的比特成本时间复杂度是多少(Java 示例)?