如何找到以下递归代码的时间复杂度?

时间:2019-05-04 12:08:00

标签: algorithm recursion data-structures time-complexity

如何得出以下程序的运行时复杂度?

public void function(int n){
   if(n==1) return;
   for(int i=0;i<n;i++){
     function(i)
   }
}

function(4);

我了解的是

T(n) = n(T(n-1));
T(n-1) = (n-1)(T(n-2))
T(n-2) = (n-2)(T(n-2))

用后续扩展替换n(T(n-1))后,

T(n) = n((n-1)((n-2)(T(n-2))))

除了

n*(n-1)*(n-2)...1 = n!

但是,在不同的帖子中,我看到这是2^n而不是n!。 如果我错过了什么,谁能解释一下?

1 个答案:

答案 0 :(得分:2)

T(n) = n T(n-1)的确是O(N!)-但这是function错误重复关系。

循环从i = 0i = n-1运行,这意味着递归调用为function(0)function(1)function(2) ...,{{1 }}。因此,递归关系为:

function(n-1)

有一个巧妙的技巧可以帮助您解决此问题。考虑T(n) = T(0) + T(1) + T(2) + ... + T(n-1) 中的术语,并与T(n-1)一起写扩展:

T(n)

看看这是怎么回事?彼此相减,只剩下带下划线的项T(n) = T(0) + T(1) + T(2) + ... + T(n-3) + T(n-2) + T(n-1) ------ T(n-1) = T(0) + T(1) + T(2) + ... + T(n-3) + T(n-2)

T(n-1)

现在可以用与以前相同的方式解决这种重复发生的方式:

T(n) - T(n-1) = T(n-1)
T(n) = 2 T(n-1)

q.e.d。