And*_*laM 5 algorithm recursion big-o loops time-complexity
我在确定下一个函数的时间复杂度时遇到问题:
void fun(int n)
{
console.log(n);
for(int i=n;i>1;i--)
{
fun(i/2);
}
}
Run Code Online (Sandbox Code Playgroud)
观察它,我可以说递归树的最大高度是logn,从级别 1 到级别,每个级别logn都会有n-k调用,但我不知道如何使用这些信息。当我尝试写递推方程时,我得到如下结果:
T(n)=T(n/2)+T((n-1)/2)+T((n-2)/2)+...+T(1),
但我再次尝试简化它失败了。如何解决这个问题以便我知道什么是复杂性?
小智 -1
好的,您正确地确定了树的深度和节点数,并且正确地编写了循环方程,但是让我们采用不同的方法,看看我们是否可以注意到任何模式,以便我们可以进一步简化方程。
对于 n=1,复杂度将是常数 c,可以说:
T(1)=1
T(2)=T(1)+1
T(3)=T(1)+T(1)+1=T(2)+T(1)
T(4)=T(2)+T(1)+T(1)+1=T(3)+T(2)
T(5)=T(2)+T(2)+T(1)+T(1)+1=T(4)+T(2)
T(6)=T(3)+T(2)+T(2)+T(1)+T(1)+1=T(5)+T(3)
...
Run Code Online (Sandbox Code Playgroud)
现在我注意到模式,该方程可以写为:
T(n)=T(n-1)+T(n/2)
Run Code Online (Sandbox Code Playgroud)
现在,要估计复杂性可能会很棘手,而且我无法给您答案,因为我相信这是 100% 真实的。但就我个人而言,由于方程中的第一个因素比第二个因素更强,我认为时间复杂度至少为O(n)。