我正在尝试分析此算法的复杂性,我预测它是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
答案 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)