当递归函数的时间执行函数满足如下的关系式时,可以使用公式法计算时间复杂度:
其中:
- $a$ 为递归次数;
- $\frac {N} {b}$ 为子问题规模;
- $O(N^d)$ 为每次递归完毕之后额外执行的操作的时间复杂度;
- 如果 $\log_b a < d$,时间复杂度为 $O(N^d)$
- 如果 $\log_b a > d$,时间复杂度为 $O(N^{\log_b a})$
- 如果 $\log_b a = d$,时间复杂度为 $O(N^d \times \log N)$
例子
求数组 arr[l..r]中的最大值,用递归方法实现。
- Java 实现
1 | public class RecursiveMax { |
其中:
- 递归次数 $a$ 为 $2$;
- 子问题规模 $\frac {N} {b}$ 为 $\frac {N} {2}$,即 $b$ 为 $2$;
- 每次递归完毕之后额外执行的操作的时间复杂度 $O(N^d)$ 为 $O(1)$,即 $d$ 为 $0$。
满足:
所以,该算法复杂度为 $O(N^{\log_2 2}) = O(N)$