我在2周前看到了一个网页,无论我搜索了多少浏览历史记录,我都找不到它。它是这样的: f(n)= 2f(n-1)的时间复杂度是SOMETHING,但f(n)= f(n-1)+ f(n-1)的时间复杂度是我不记得的其他时间。 当我读它时它听起来是正确的,因为在第一种情况下f(n-1)被计算一次(然后乘以2),但第二种实际上试图计算f(n-1)两次,所以它的时间复杂度应该更高。
这是真的吗?如果是这样,那么SOMETHING和OTHER_THING会是什么?
P.S。对我来说,通过这种分析,SOMETHING应该是线性的,因为在递归树的每个级别我们只计算一个东西然后乘以2.所以它将是n级的树,有两个操作(一个用于计算下一个f,以及每个级别乘以2的一个。那就是O(2n)= O(n)。 对于OTHER_THING,它是指数级的,因为递归树有n个级别,并且在每个级别我们有2个下一个f的计算。所以这是常规的O(2 ^ n)。
答案 0 :(得分:0)
func(integer n)
if n == 1
return c;
return func(n - 1) + func(n - 1)
对于上面的代码,递推方程等于T(n) = T(n - 1) + T(n - 1) + c
。如果我们扩展这个递推方程,我们有sum {2^i}
s.t 1 <= i <= (n - 1)
。这个等式是geometric series,只是算法是O(2^n)
。
但是轰鸣声代码在O(n)
中运行,因为它只触及1
和n
之间的每个数字。这里的递推方程是T(n) = T(n - 1) + c
。
func(integer n)
if n == 1
return c
res = func(n - 1)
return 2 * res