以下递归算法的时间复杂度是多少?
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 是递归深度。
【讨论】:
以上是关于以下递归算法的时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章