功能的时间复杂度

时间:2020-10-20 13:54:14

标签: recursion time-complexity recursive-backtracking

以下两个函数的时间复杂度是多少?

int fun1(int n){
if(n>0)
return (2*fun1(n-1)+1);
else return 1;
}

int fun2(int n){
if(n>0)
return (fun2(n-1)+fun2(n-1)+1);
else return 1;
}

很明显,对于fun2,我们将递归方程写为T(n)= 2 * T(n-1)+ 1,但是如何为fun1写递归方程呢?

2 个答案:

答案 0 :(得分:2)

快速浏览一下代码(我可能是错的)。 fun1具有O(n)的时间复杂度(线性),fun2具有O(2 ^ n)的时间复杂度(指数)。

当您想象递归级别时,那么一个深度级别会使递归调用的数量增加一倍。因此,对于n == 10,有1个fun2(10)调用,然后有2个fun2(9)调用,4个fun2(8)调用,8个fun2(7)调用,6个为6 32 for 5,64 for 4,128 for 3,256 for 2,512 for 1,1024调用fun2(0)。最后提到的只是返回1。

这是一个很好的示例,在使用递归实现类似功能时,您应该三思而后行。一个简单的修补程序(用2 * fun2(n-1)代替fun2(n-1)+ fun2(n-1))使其变为O(n)。

这也解释了为什么不应该使用朴素递归来实现斐波那契数。坦率地说,在这种情况下,没有任何递归的简单循环会更好。

因此,用于计算时间复杂度的方程式应包含2 ^ something + something。 ;)

答案 1 :(得分:0)

您对fun2是正确的。

为了娱乐1,请考虑一下您通常的数学规则,而忽略时间的复杂性。 2 * fun1(n-1)= fun1(n-1)+ fun1(n-1),除非可以重新定义乘法规则,例如在现代分析中(我相信这是所教的数学脉络。因为我当时在那堂课:))

因此,根据分布规则,fun1实际上与fun2相同,因此具有相同的时间复杂度。