如何解决以下复发?

Posted

技术标签:

【中文标题】如何解决以下复发?【英文标题】:How to solve the following recurrence? 【发布时间】:2016-05-30 02:04:37 【问题描述】:

我不熟悉主定理、递归树和替换方法之外的递归求解技术。我猜想为大 O 界解决以下递归不使用这些方法之一:

T(n) = T(n-1) + 2T(n-2) + 1

【问题讨论】:

T(n) 的基本情况是什么? 这是使用歼灭者方法的好地方......我实际上不知道该怎么做。 :-) 未提供基本情况。我猜它不需要实现大 O 界限? 提示:T(n) = 2^n。此外,请查看this math stackexchange question。 【参考方案1】:

我们可以替换U(n) = T(n) + 1/2然后得到一个循环

U(n) = T(n) + 1/2
     = T(n-1) + 2T(n-2) + 1 + 1/2
     = T(n-1) + 1/2 + 2(T(n-2) + 1/2)
     = U(n-1) + 2U(n-2),

这有点神奇,但正如 templatetypedef 所提到的,可以使用 annihilator 方法创建魔法。现在我们只需要解决线性齐次递归。特征多项式x^2 - x - 2 因子为(x+1)(x-2),因此解为U(n) = a(-1)^n + b2^n,其中ab 是任意常数。等价于T(n) = a(-1)^n + b2^n - 1/2,即Theta(2^n),特殊情况除外。

【讨论】:

【参考方案2】:

此递归称为non-homogeneous linear recurrence.,通过将其转换为齐次递归来解决:

T(n) = T(n-1) + 2T(n-2) + 1
T(n+1) = T(n) + 2T(n-1) + 1

从 2 中减去 1 并更改基数,得到T(n) = 2 T(n-1) + T(n-2) - 2 T(n-3)。对应的特征方程为:

x^3 - 2x^2 - x + 2 = 0

有解决方案x = -1, 1, 2。这意味着递归看起来像:

c1 * (-1)^n + c2 * 2^n + c3 * 1^n = c1 * 2^n + c2 (-1)^n + c3

在知道 T(0) 和 T(1) 的情况下可以找到所有这些常数。对于您的复杂性分析,很明显这是指数级O(2^n)

【讨论】:

以上是关于如何解决以下复发?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sympy 解决复发问题

r 如何使用ROC分析比较复杂的复发风险模型。该分析使用置换方法的实现

如何求解递归 T(n) = 2T(n^(1/2)) + log n? [关闭]

如何使用流解决以下练习

如何解决以下 xmlns MSBuild 错误?

如何解决此分段错误:以下代码的 11 错误?