递归式求解-主定理

本文详细介绍了主定理在递归式求解中的应用,分为三种情况讨论了函数f(n)与n的关系,分别对应不同的渐进边界。通过例题示范,解释了如何根据f(n)与n的比较来确定递归式的复杂度,涉及多项式、对数和指数函数的比较。对于特殊情况,文章提到了一个额外的定理作为补充解决方法。

1.主定理:设a>=1和b>1为常数,设f(n)为一函数,T(n)由递归式

对非负整数定义,其中n/b指下取整或上取整.那么T(n)可能有如下的渐进界:

(1)若对于某常数 ε>0,有,则;

(2)若.则;

(3)若对于某常数 ε>0,有,且某常数 c<1与所有足够大的n,有,则



2.主定理的使用方法.

由主定理的三种情况可以看出,每一种情况都要比较 f(n) 与进行比较.(求复杂度时,通常取上界)

第一种情况,f(n)与进行比较,较大,则解为

第二种情况,两种函数同样大,这是乘以对数因子lgn,即

第三种情况,f(n)较大,则递归式的解为


3.例题示范

例题(1).,求这个递归式的复杂度.

第一步.计算,可求得=n^2,

第二步.与f(n)=n进行比较,因此符合第一种情况,解得


例题(2)

第一步.计算,可求得a=1, b=3/2,因此=

第二步.与f(n)=1进行比较,符合第二种情况,解得


例题(3)第三中情况和第一种类似,不再举例


例题(4)

第一步.计算,a=2, b=2,    = n.看上去符合第三种情况,因为f(n)=lgn渐进大于n,但是不是多项式大于. 

 对于任意正常数ε,比值f(n)与等于nlgn/n = lgn.渐进小于n^ε,(可用求极限方法分子分母同时求导求得).这种情况落在情况二和情况三之间.

这种情况下的递归式求解要用到:(算法导论4.4-2)

定理:若,其中k>=0,则主定理中递归式的解为


定理可用于求解递归算法的时间复杂度,在递归算法分析里是一个关键工具。在求解递归算法的时间复杂度时,非递归算法可通过找出执行次数最多的代码并计算其执行次数来得到,但递归算法无法用这种方式求解。虽然利用递推方法求解时间复杂度较为简单,但适用情况较少,且常需复杂的公式推导,因此常借助定理和递推树等方式来求解 [^2]。 定理有相关规则用于确定递归算法的时间复杂度,例如规则3:若$f(n)=Ω(n^{log_b(a + ε)})$(其中$ε > 0$为常数),且存在$n_0$,当$n > n_0$时,$a * f(n / b) ≤ cf(n)$成立($c < 1$为常数),则$T(n) = O(f(n))$ [^4]。 ### 示例代码 以下是一个使用定理分析递归算法复杂度的示例(假设分析归并排序的复杂度): ```python # 归并排序函数 def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) # 合并两个有序数组 def merge(left, right): result = [] i = j = 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result.extend(left[i:]) result.extend(right[j:]) return result # 测试代码 arr = [38, 27, 43, 3, 9, 82, 10] sorted_arr = merge_sort(arr) print(sorted_arr) ``` 上述代码实现了归并排序算法,归并排序递归式可使用定理分析其时间复杂度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值