具体数学-第2课(成套方法求解递归式)

原文链接:

具体数学-第2课 - WeiYang Blog

今天主要讲了关于递推式和求和的一些方法,主要是成套方法。

约瑟夫环推广

上一节课说到,约瑟夫环问题的解是
\[f(n) = 2l + 1\]
其中 \(n = {2^m} + l\)
\(n\) 写成二进制可以发现, \(f(n)\) 就是 \(n\) 的二进制循环左移1位。
现在做一下推广,求解如下递推式:
\begin{array}{l}f(1) = \alpha \\f(2n) = 2f(n) + \beta \\f(2n + 1) = 2f(n) + \gamma \end{array}
可以设
\[f(n) = A(n)\alpha + B(n)\beta + C(n)\gamma \]
同样,令 \(n = {2^m} + l\)
可以解出
\begin{array}{l}A(n) = {2^m}\\B(n) = {2^m} - 1 - l\\C(n) = l\end{array}
再从二进制角度理解一下,将递推式继续推广:
\[\begin{array}{*{20}{l}}{f(j) = {\alpha _j},1 \le j < d}\\{f(dn + j) = cf(n) + {\beta _j},0 \le j \le d,n \ge 1}\end{array}\]
可以得到解为
\[f({({b_m}{b_{m - 1}} \ldots {b_1}{b_0})_d}) = {({\alpha _{​{b_m}}}{\beta _{​{b_{m - 1}}}}{\beta _{​{b_{m - 2}}}} \ldots {\beta _{​{b_1}}}{\beta _{​{b_0}}})_c}\]

递推式求和

求解如下递推式:
\begin{array}{l}{R_0} = \alpha \\{R_n} = {R_{n - 1}} + \beta n + \gamma \end{array}
用成套方法求解,设
\[{Rn} = A(n)\alpha + B(n)\beta + C(n)\gamma \]
首先令 {R_n} = 1 ,可以得到 \alpha = 1,\beta = 0,\gamma = 0 ,所以 \(A(n) = 1\)
再令 {R_n} = n ,可以得到 \(\alpha = 0,\beta = 0,\gamma = 1\) ,所以 \(C(n) = n\)
最后令 \({R_n} = {n^2}\) ,可以得到 \(\alpha = 0,\beta = 2,\gamma = - 1\) ,所以 \(2B(n) - C(n) = {n^2}\) ,所以 \(B(n) = ({n^2} + n)/2\)

再来一个更复杂的递推式:
\begin{array}{l}{R_0} = \alpha \\{R_n} = 2{R_{n - 1}} + \beta n + \gamma \end{array}
同样的方法,设
{R_n} = A(n)\alpha + B(n)\beta + C(n)\gamma
首先令 \({R_n} = 1\) ,可以得到 \(\alpha = 1,\beta = 0,\gamma = -1\) ,所以 \(A(n) - C(n) = 1\)
再令 \({R_n} = n\) ,可以得到 \(\alpha = 0,\beta = -1,\gamma = 2\) ,所以 \(2C(n) - B(n) = n\)
这时候能不能令 \({Rn} = {n^2}\) 呢?答案是不能,因为如果 \({R_n} = {n^2}\) ,那么
\[{n^2} = 2{(n - 1)^2} + \beta n + \gamma \] 显然不可能成立。
观察系数,可以令 \({R_n} = 2^n\) ,可以得到 \(\alpha = 1,\beta = 0,\gamma = 0\) ,所以 \(A(n) = 2^n\)
所以
\[A(n) = {2^n},B(n) = {2^{n + 1}} - n + 2,C(n) = {2^n} + 1\]

### 回答1: 时间复杂度的求解取决于实际的算法,一般可以分析算法的执行步骤,统计每个步骤所用的时间,从而求得时间复杂度。对于递归算法,可以通过分析递归函数的执行次数,以及每次调用递归函数所消耗的时间,来求解时间复杂度。 ### 回答2: 要求解递归的时间复杂度,我们可以按照以下步骤进行: 1. 首先,确定递归的形。递推通常具有递归的特点,即问题的规模需要通过不断缩小来递归求解。例如,递归可能包含递归调用,或者具有递归的结构。 2. 其次,推导递归递归深度。递归的时间复杂度通常与递归的深度相关,即需要确定递归递归深度。 3. 然后,分析递归函数的时间代价。将递归的执行过程分为不同的子问题,确定每个子问题的时间代价。这可能涉及到递归子问题的规模和计算时间。 4. 最后,通过递归的时间代价和递归递归深度来确定递归的时间复杂度。 需要注意的是,递归的时间复杂度可能与递归的规模有关,也可能与递归的深度有关,具体取决于具体的情况和问题的性质。同时,递归的时间复杂度也可能需要通过数学推导或递归树等方法进行求解。 总的来说,求解递归的时间复杂度需要通过对递归的分析、递归深度的确定以及递归函数的时间代价的分析来进行。 ### 回答3: 求解递归的时间复杂度需要以下步骤: 1. 确定递归的形:首先,我们需要确定递归的形递归方程,即描述递归的基本操作和递归关系的数学等。这通常需要根据问题的特点和递归的实现进行分析。 2. 求解递归方程:接下来,我们需要求解递归方程,即找到递归。这可以通过代入法、特征根法或母函数法等数学方法来实现。在这一步骤中,我们可以得到递归的通项公,并进一步进行化简。 3. 分析递归的时间复杂度:一旦我们得到递归的通项公,我们可以通过分析公的增长率来确定递归的时间复杂度。具体来说,我们可以评估递归中的递归调用次数和每次递归操作的时间复杂度,然后将它们相乘得到最终的时间复杂度。 4. 递归的边界条件:最后,我们需要递归的边界条件,即递归的终止条件。这是因为递归只有在满足终止条件时才能收敛,否则递归会无限进行下去。在分析时间复杂度时,我们需要考虑递归的基本操作在边界条件下的执行次数和时间复杂度。 需要注意的是,求解递归的时间复杂度可能涉及到数学推理和推导,需要运用到数学分析的方法。具体的求解过程会根据不同的递归和问题而有所不同。同时,我们也可以借助工具和数值计算对递归进行近似求解,以便更好地估计时间复杂度的上界和下界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法码上来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值