如何得出以下程序的运行时复杂度?
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!
。
如果我错过了什么,谁能解释一下?
答案 0 :(得分:2)
T(n) = n T(n-1)
的确是O(N!)
-但这是function
的错误重复关系。
循环从i = 0
到i = 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。