在学习算法并参考CLRS时,我遇到了一个问题
T(n) = T(n-a) + T(a) + cn ; a >= 1 and c > 0
it is Big-theta(n^2), can be easily proved by recursion tree method
我可以通过递归树的方法解决它。
在我的实验室与朋友讨论时,一位朋友突然宣布,这个问题永远无法通过替代方法解决。
我自己尝试解决它,但找不到任何模式。
此外,我在第一步的扩展对我来说似乎有点不对劲:
T(n) = T(n-2a + T(a) + c(n-1)) + T(a) + cn
T(n) = T(n-3a + 2T(a) + c(n-1)(n-2)) + T(a) + cn
这似乎无处可去......
你能用替代方法解决吗?你猜的是什么?
答案 0 :(得分:1)
你的第一行扩展并不好,但第二行是合乎逻辑的(仔细看看,关于括号,你没有做过两次相同的事情)。
以下是如何做到这一点:
T(n) = T(n-a) + T(a) + cn
T(n) = T(n-2a) + T(a) + c(n-a) + (T(a) + cn)
= T(n-2a) + 2T(a) + c(2n-a)
= T(n-3a) + T(a) + c(n-2a) + (2T(a) + c(2n-a))
= T(n-3a) + 3T(a) + c(3n - 3a)
...
= T(n-ka) + kT(a) + ck(n - (k-1)a/2) // The last part come from n+(n-a)+...+(n-(k-1)a) = k(n - (k-1)a/2)
为了概括,您可以看到,在步骤j
,分解T(n-ja)
将为您提供T(n-(j+1)a)
,一个新的T(a)
和一个c(n-ja)
。然后,
Sum(c(n-ja), j=0..k-1)=c*(k*n - a*Sum(j), j=0..k-1))
= c(kn-a*(k-1)k/2)
这会给你结果。
拿k=n/a
,你得到:
T(n) = T(0) + nT(a)/a + c(n/a)(n-(n/a-1)a/2)
粗略地给出了
T(n) ~ nT(a)/a + c n^2 /(2a)
自Theta(n^2)
以来c>0
。