通过替代方法解决复发问题

时间:2017-09-27 12:31:53

标签: algorithm computer-science proof clrs

在学习算法并参考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

这似乎无处可去......

你能用替代方法解决吗?你猜的是什么?

1 个答案:

答案 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