039.递归master公式
一、Master公式定义
Master公式用于分析所有子问题规模相同的递归算法的时间复杂度。其标准形式为:
\[T(n) = a \cdot T\left(\frac{n}{b}\right) + O(n^c)
\]
其中:
- a:递归调用的次数(子问题的个数)
- b:每次递归问题规模缩小的比例
- c:递归外操作的时间复杂度指数
- a、b、c都是常数
二、Master公式的三种情况
情况1:\(\log_b a < c\)
- 复杂度:\(O(n^c)\)
- 解释:递归外的工作量占主导
情况2:\(\log_b a > c\)
- 复杂度:\(O\left(n^{\log_b a}\right)\)
- 解释:递归调用的工作量占主导
情况3:\(\log_b a = c\)
- 复杂度:\(O(n^c \cdot \log n)\)
- 解释:内外工作量平衡,需乘以\(\log n\)
三、常见算法示例
1. 归并排序
递归关系式:
\[T(n) = 2T\left(\frac{n}{2}\right) + O(n)
\]
参数分析:
- \(a = 2\)(分成两个子问题)
- \(b = 2\)(每个子问题规模为\(n/2\))
- \(c = 1\)(合并操作为\(O(n)\))
计算比较:
- \(\log_b a = \log_2 2 = 1\)
- \(c = 1\)
- \(\log_b a = c\) → 情况3
时间复杂度:
\[O(n^c \cdot \log n) = O(n \log n)
\]
2. 二分查找
递归关系式:
\[T(n) = T\left(\frac{n}{2}\right) + O(1)
\]
参数分析:
- \(a = 1\)
- \(b = 2\)
- \(c = 0\)
计算比较:
- \(\log_b a = \log_2 1 = 0\)
- \(c = 0\)
- \(\log_b a = c\) → 情况3
时间复杂度:
\[O(n^c \cdot \log n) = O(\log n)
\]
3. 快速排序(最好情况)
递归关系式:
\[T(n) = 2T\left(\frac{n}{2}\right) + O(n)
\]
与归并排序相同,时间复杂度为:
\[O(n \log n)
\]
四、特殊情况
对于形式为:
\[T(n) = 2T\left(\frac{n}{2}\right) + O(n \log n)
\]
的时间复杂度为:
\[O\left(n (\log n)^2\right)
\]
注意
仅适用于等规模划分:如果子问题规模不同,不能使用Master公式
I am the bone of my sword

浙公网安备 33010602011771号