递归程序复杂度计算->主定理

本文介绍了递归算法时间复杂度的计算方法,利用主定理来解析递归方程,得出不同情况下时间复杂度的表现形式。具体分为三种情况:当多项式的阶高于对数项时、等于对数项时及低于对数项时的时间复杂度表现。

对于递归算法的时间复杂度的阶的计算,一般使用主定理计算:

T(n)=aT(n/b)+f(n),一般f(n)执行为多项式时间,即T(n)=a(n/b)+O(n^d)

1.d>logb a,T(n)=O(n^d)

2.d=logb a,T(n)=O(n^d*logn)

3.d<logb a,T(n)=O(n^(logb a))

其中,logb a为以b为底a的对数

定理(Master Theorem)是一种用于快速求解分治法算法递归关系式的时间复杂度的工具,特别适用于将问题递归地分解为子问题的情况。定理适用于形如 $T(n) = aT(\frac{n}{b}) + f(n)$ 的递归关系式,其中:$a$ 表示子问题的数量($a \geq 1$),$b$ 表示每个子问题的规模($b > 1$),$f(n)$ 表示划分和合并子问题的额外开销(通常为 $n$ 的函数),目标是直接给出 $T(n)$ 的渐进上界(大 $O$ 记法),无需展开所有递归项[^2]。 定理有三种形式: 1. **情况一**:如果 $f(n) = O(n^{\log_b a - \epsilon})$,其中 $\epsilon > 0$,那么 $T(n) = \Theta(n^{\log_b a})$。这意味着当 $f(n)$ 的增长速度比 $n^{\log_b a}$ 慢时,递归部分的复杂度导作用。 2. **情况二**:如果 $f(n) = \Theta(n^{\log_b a})$,那么 $T(n) = \Theta(n^{\log_b a} \log n)$。此时,$f(n)$ 和递归部分的复杂度具有相同的增长速度,最终的复杂度为 $n^{\log_b a}$ 乘以对数因子。 3. **情况三**:如果 $f(n) = \Omega(n^{\log_b a + \epsilon})$,其中 $\epsilon > 0$,并且对于某个常数 $c < 1$ 和足够大的 $n$,有 $a f(\frac{n}{b}) \leq c f(n)$,那么 $T(n) = \Theta(f(n))$。即当 $f(n)$ 的增长速度比 $n^{\log_b a}$ 快时,$f(n)$ 起导作用。 以下是使用定理分析归并排序时间复杂度的示例: 归并排序的递归关系式为 $T(n) = 2T(\frac{n}{2}) + \Theta(n)$,这里 $a = 2$,$b = 2$,$f(n) = \Theta(n)$。 计算 $n^{\log_b a} = n^{\log_2 2} = n$,而 $f(n) = \Theta(n)$,符合定理的情况二。 所以归并排序的时间复杂度为 $T(n) = \Theta(n \log n)$。 ```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 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值