master公式:求递归问题的时间复杂度公式,只适用于过程规模相同的情况(拆分过程相同)。
- T ( N ) = a × T ( N b ) + O ( N d ) T(N) = a \times T(\frac{N}{b}) + O(N^d) T(N)=a×T(bN)+O(Nd)
其中:
当
d
<
l
o
g
b
a
d \lt log_ba
d<logba 时,时间复杂度为 O(
N
l
o
g
b
a
N^{log_ba}
Nlogba)
当
d
=
l
o
g
b
a
d = log_ba
d=logba 时,时间复杂度为 O(
N
d
×
l
o
g
N
N^d\times{logN}
Nd×logN)
当
d
>
l
o
g
b
a
d \gt log_ba
d>logba 时,时间复杂度为 O(
N
d
N^d
Nd)
一个经典的递归案例就是 fibonacci 数列,代码如下:
int fibo1(int n) {
if(n == 1 || n == 0)
return n;
return fibo1(n - 1) + fibo1(n - 2);
}
此时,会发现该递归的过程规模不相同! 所以不能使用master公式。 这也是为什么各大搜索网站结果,都没有搜索结果。
但如果强行进行计算呢?
- 该递归使用了两次,所以 a = 2;
- 递归内使用了 n-1 or n-2,所以问题规模被拆分成了 N − 1 N \frac{N-1}{N} NN−1 的规模,因为b等于问题规模除以N后的倒数,所以 b = N 2 N − 1 b = \frac{N^2}{N-1} b=N−1N2;
- 中间的处理过程为两个返回结果相加,复杂度为 O(1) = O( N 0 N^0 N0),所以 d = 0;
- 经过计算符合 d < log b a \log_ba logba ,时间复杂度为 O( N log b a N^{\log_ba} Nlogba);
- 最终结果为 O( N l o g N 2 N − 1 2 N^{log_{\frac{N^2}{N-1}}2} NlogN−1N22),经过换底公式化简为 lg 2 2 lg ( N ) − lg ( N − 1 ) \frac{\lg2}{2\lg{(N)} - \lg{(N-1)}} 2lg(N)−lg(N−1)lg2
而 fibonacci 的时间复杂度应为 O(
2
N
2^N
2N),结果差别比较大。
计算过程还不是很严谨,记住:过程规模不相同不符合。别犯题目那样的错。