1. 递归式简介
1.1 什么是递归式
递归式(Recurrence Relation)是用于定义序列的数学方程,其中序列的每一项都通过前面若干项来定义。递归式在计算机科学中广泛用于描述分治算法的时间复杂度。
一个递归式包含两个部分:
- 基础情况(Base Case):递归终止条件
- 递归情况(Recursive Case):将问题分解为更小的子问题
1.2 常见递归式示例
斐波那契数列
最经典的递归式例子是斐波那契数列:
int fib(int n) {
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}归并排序
归并排序的递归式为:
void mergeSort(vector<int>& arr, int left, int right) {
if (left >= right) return;
int mid = left + (right - left) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right); // O(n) 合并操作
}2. 代入法求解递归式
代入法(Substitution Method)是求解递归式最基本的方法,通过猜测解的形式,然后用数学归纳法证明。
2.1 方法步骤
- 猜测解的形式
- 假设解对某个常数 成立
- 用数学归纳法证明
2.2 示例:证明 的解为
猜测:( 为某个正常数)
基础情况:设 ,则 (当 足够大时成立)
归纳假设:假设对所有小于 的值,不等式成立,即
归纳证明:
当 时, 成立。
得证:
2.3 代入法的局限性
代入法需要猜测解的形式,对于某些递归式难以猜测正确解。这时我们可以使用递归树方法来辅助猜测。
3. Master 定理
Master 定理(Master Theorem)提供了一种直接求解形如以下递归式的方法:
其中:
- :子问题数量
- :子问题规模的缩减比例
- :分解和合并子问题的代价
3.1 Master 定理的三种情况
令 为关键项,比较 与 的相对增长速度:
| 情况 | 条件 | 结论 |
|---|---|---|
| 情况 1 | ,其中 | |
| 情况 2 | ,其中 | |
| 情况 3 | ,其中 |
情况 2 的关键:当 与 多项式级别相等时(差一个对数因子),解需要再乘以一个对数因子。
3.2 Master 定理的几何直观
n n
/ \ / \
/ \ / \
/ \ / \
n/2 n/2 n/4 n/4
/ \ / \ / \ / \
/ \ / \ / \ / \
... ... => ... ... ...
每层代价: f(n) 子问题数: a
子问题规模: n/b 深度: log_b n
每层处理的代价为 ,共 层,共有 个叶子节点。
4. 经典应用示例
4.1 二分查找
递归式:
参数:,,
分析:
比较 与 :
属于情况 2(),所以:
int binarySearch(vector<int>& arr, int target, int left, int right) {
if (left > right) return -1;
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target)
return binarySearch(arr, target, mid + 1, right);
else
return binarySearch(arr, target, left, mid - 1);
}4.2 归并排序
递归式:
参数:,,
分析:
比较 与 :
属于情况 2(),所以:
4.3 Strassen 矩阵乘法
Strassen 算法将两个 矩阵乘法分解为 7 个子矩阵乘法:
递归式:
参数:,,
分析:
比较 与 :
- ,其中
属于情况 1,所以:
这比朴素的 矩阵乘法更快。
5. 扩展 Master 定理
标准 Master 定理的情况 2 仅适用于 与 多项式级别相等的情况。扩展 Master 定理(Akra-Bazzi 定理的特例)可以处理多对数因子的情况。
5.1 扩展形式
| 情况 | 条件 | 结论 |
|---|---|---|
| 情况 2a | ,其中 | |
| 情况 2b | ,其中 |
5.2 示例:递归式
参数:,,
分析:
,属于情况 2a(),所以:
6. Master 定理的局限性
Master 定理并非万能,以下情况不能直接使用:
| 限制 | 示例 | 说明 |
|---|---|---|
| 子问题规模不同 | 不是 形式 | |
| 不是多项式 | 增长过快 | |
| 不是常数 | 必须为常数 | |
| 缺少多项式级别差距 | 介于情况 1 和 2 之间 |
对于无法直接应用 Master 定理的递归式,可以使用递归树法或Akra-Bazzi 定理求解。
7. 总结
| 方法 | 适用场景 | 特点 |
|---|---|---|
| 代入法 | 所有递归式 | 需要猜测解的形式 |
| 递归树法 | 复杂递归式 | 直观,但计算繁琐 |
| Master 定理 | 快速得到精确答案 | |
| Akra-Bazzi 定理 | 更一般的递归式 |
掌握这些技术,可以快速分析大多数分治算法的时间复杂度,从而更好地理解算法效率。