求解递推方程 T(n) = 3 + m * T(n - m)

Posted

技术标签:

【中文标题】求解递推方程 T(n) = 3 + m * T(n - m)【英文标题】:Solving the recurrence equation T(n) = 3 + m * T(n - m) 【发布时间】:2018-06-23 01:59:06 【问题描述】:

我明天有一个计算机科学期中考试,我需要帮助确定以下特定递归函数的复杂性,这比我已经研究过的东西要复杂得多:它有两个变量

T(n) = 3 + mT(n-m)

在m是常数的更简单的情况下,公式可以很容易地通过编写解包关系得到;然而,在这种情况下,拆包并没有让生活变得更轻松,如下所示(假设 T(0) = c):

T(n) = 3 + mT(n-m)

T(n-1) = 3 + mT(n-m-1)

T(n-2) = 3 + mT(n-m-2)

...

显然,根据这些不等式没有直接的消除。所以,我想知道在这种情况下是否应该使用另一种技术。

【问题讨论】:

【参考方案1】:

不用担心m - 这只是一个常量参数。但是,您正在错误地展开递归。展开的每一步都涉及三个操作:

    用参数值取T的值,即mless 乘以m 添加常量3

所以,它看起来像这样:

T(n) = m * T(n - m) + 3 =                                        (Step 1)
     = m * (m * T(n - 2*m) + 3) + 3 =                            (Step 2)
     = m * (m * (m * T(n - 3*m) + 3) + 3) + 3 = ...              (Step 3)

等等。展开T(n) 直到步骤k 将由以下公式给出:

T(n) = m^k * T(n - k*m) + 3 * (1 + m + m^2 + m^3 + ... + m^(k-1))

现在你设置n - k*m = 0 使用初始条件T(0) 并得到:

k = n / m

现在您需要使用几何级数之和的公式 - 最后您将获得 T(n) 的封闭公式(我将最后一步留给您)。

【讨论】:

@A.Loc - 您在问题中写道T(0)=c,对吗?但这并不重要,你只需要估计总步数

以上是关于求解递推方程 T(n) = 3 + m * T(n - m)的主要内容,如果未能解决你的问题,请参考以下文章

算法复杂度,求解递归方程

数字信号处理线性常系数差分方程 ( 使用递推解法求解 “ 线性常系数差分方程 “ | “ 线性常系数差分方程 “ 初始条件的重要性 )

倍增原理

龙格库塔求解常微分方程

在 Python 中求解递归微分方程组

递归关系:求解 T(n-1) 的大 O