递归式-代入法求解过程

代入法

substitution method

  1. Guess the from of the solution
  2. verify by induction
  3. solve the consts

example

T ( n ) = 4 T ( n / 2 ) + n T(n) = 4T(n/2) + n T(n)=4T(n/2)+n
[ T ( 1 ) = Θ ( 1 ) ] [T(1) = \Theta(1)] [T(1)=Θ(1)]

—Guess: T ( n ) = O ( n 3 ) T(n) = O(n^3) T(n)=O(n3)
—Assume: T ( k ) ≤ c k 3 , f o r   k < n T(k) \leq ck^3, for \:k < n T(k)ck3,fork<n

T ( n ) = 4 T ( n / 2 ) + n ≤ 4 c ( n / 2 ) 3 + n T(n) = 4T(n/2)+n \leq 4c(n/2)^3+n T(n)=4T(n/2)+n4c(n/2)3+n
= c 2 n 3 + n =\frac{c}{2}n^3+n =2cn3+n
= c n 3 − ( c 2 n 3 − n ) =cn^3-(\frac{c}{2}n^3 - n) =cn3(2cn3n)
≤ c n 3 \leq cn^3 cn3, 当且仅当 ( c 2 n 3 − n ) ≥ 0 (\frac{c}{2}n^3 - n) \geq 0 (2cn3n)0. example: ∃   c ≥ 1 , n ≥ 2 \exists \: c \geq 1, n \geq 2 c1,n2

Base case, T ( 1 ) = Θ ( 1 ) ≤ c T(1) =\Theta(1) \leq c T(1)=Θ(1)c, 只要 c c c足够大即可满足。

由此,可以看到 T ( n ) = O ( n 3 ) T(n)=O(n^3) T(n)=O(n3)是成立的。
直观上来看,按照渐进趋势,当 n n n趋于无穷大时, ∃   s o m e   c   s . t .   ( c 2 n 3 − n ) ≥ 0 \exists \:some \:c \: s.t.\: (\frac{c}{2}n^3-n)\geq 0 somecs.t.(2cn3n)0成立。证毕。

鉴于此,我们可以看到,要使上述归纳成立,则余数 ( c 2 n 3 − n ) ≥ 0 (\frac{c}{2}n^3-n)\geq 0 (2cn3n)0,且为常数比较好。因此,再次猜测如下:
—Guess: T ( n ) = O ( n 2 ) T(n) = O(n^2) T(n)=O(n2)
—Assume: T ( k ) ≤ c k 2 , f o r   k < n T(k) \leq ck^2, for \:k < n T(k)ck2,fork<n

T ( n ) = 4 T ( n / 2 ) + n ≤ 4 c ( n / 2 ) 2 + n T(n) = 4T(n/2)+n \leq 4c(n/2)^2+n T(n)=4T(n/2)+n4c(n/2)2+n
= c n 2 + n =cn^2+n =cn2+n
= c n 2 − ( − n ) =cn^2-(-n) =cn2(n)
直观上, 我们感觉到 T ( n ) = O ( n ) T(n) = O(n) T(n)=O(n)成立, 但是没有证明归纳法的严格形式 T ( n ) ≤ c n 2 T(n) \leq cn^2 T(n)cn2
造成这种情况的原因, 可能是我们在假设时忽略了低阶项的缘故, 因此

—Assume: T ( k ) ≤ c 1 k 2 − c 2 k , f o r   k < n T(k) \leq c_1k^2 - c_2k, for \:k < n T(k)c1k2c2k,fork<n

T ( n ) = 4 T ( n / 2 ) + n ≤ 4 ( c 1 ( n / 2 ) 2 − c 2 ( n / 2 ) ) + n T(n) = 4T(n/2)+n \leq 4 \big(c_1(n/2)^2 - c_2(n/2) \big) +n T(n)=4T(n/2)+n4(c1(n/2)2c2(n/2))+n
= c 1 n 2 − 2 c 2 n + n =c_1n^2 - 2c_2n + n =c1n22c2n+n
= c 1 n 2 − c 2 n − ( c 2 − 1 ) n =c_1n^2 - c_2n - (c_2 - 1)n =c1n2c2n(c21)n, 当 c 2 − 1 ≥ 0 c_2 - 1 \geq 0 c210, 即 c 2 ≥ 1 c_2 \geq 1 c21
≤ c 1 n 2 − c 2 n \leq c_1n^2 - c_2n c1n2c2n

Base case, T ( 1 ) = Θ ( 1 ) ≤ c 1 − c 2 T(1) =\Theta(1) \leq c_1 - c_2 T(1)=Θ(1)c1c2, 只要 c 1 c_1 c1相对于 c 2 c_2 c2足够大即可满足
T ( 1 ) = Θ ( 1 ) T(1) = \Theta (1) T(1)=Θ(1)
证毕。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值