循环内部递归的复杂性

时间:2013-12-03 11:24:58

标签: algorithm loops recursion complexity-theory

我正在尝试分析此算法的复杂性,我预测它是t(n) = n*t(n) + 1并通过主要定理求解t(n) n^logn。但是,我不确定,并坚持下去。

  Algorithm CheckPath(m[0..n-1][0..n-1],v1,v2)
       if v1==v2
       return 0
   cost = 0
   for i = 0 to n-1
     if  m[v1]m[v2]!=0 //any path exits
       cost2 = m[v1]m[v2]+checkpath(m,i,v2)
       if cost2<cost OR cost==0
         cost = cost2
return cost

编辑:我将costtmp更正为成本2,当我检查v1==v2 return 0

时,它不会进入无限循环

2 个答案:

答案 0 :(得分:2)

我认为你的做法是错误的。你有一个算法,它运行在一些图表上。因此,尝试在底层图上找到它的复杂性,而不是在你运行的递归上。

但是要回答你的原始问题,你的递归具有指数复杂性(并且可能不会终止),除非你的图是一个DAG(有向无环图)。原因是因为您没有标记已经到达的顶点。因此,递归可以在两个顶点u和v之间无限循环,这样边(u,v)和(v,u)在E中(或者如果你的图是未定向的,那么任何边都会导致这个)。 / p>

答案 1 :(得分:0)

对我来说似乎是:

t(n)   = 1 + t(1) + t(2) + ... + t(n-3) + t(n-2) + t(n-1) 
t(n-1) = 1 + t(1) + t(2) + ... + t(n-3) + t(n-2)
t(n-2) = 1 + t(1) + t(2) + ... + t(n-3)
...
t(4) = 1 + t(1) + t(2) + t(3) = 8
t(3) = 1 + t(1) + t(2) = 4
t(2) = 1 + t(1) = 2
t(1) = 1 

查看序列的前几个成员,看起来封闭的表单是t(n) = 2^(n-1)

我们可以通过归纳证明这一点吗?

n == 1我们t(1) = 2^(1-1) = 1 假设每个t(k) = 2^(k-1)都有k < n。 然后:

t(n) = 1 + t(1) + t(2) + ... + t(n-1) = 1 + 2^0 + 2 + 4 + ... + 2^(n-2) = 2^(n-1)

因此,T(n) = O(2^n)