使用条件
子规模的时间复杂度相同时,该定理适用
公式内容
T ( N ) = a T ( N b ) + O ( N d ) T(N) = aT(\frac{N}{b})+O(N^d) T(N)=aT(bN)+O(Nd)
( 1 ) l o g b a > d , O ( N l o g b a ) (1) \quad log_{b}^{a} > d, \quad O(N^{log_{b}^{a}}) (1)logba>d,O(Nlogba)
( 2 ) l o g b a < d , O ( N d ) (2) \quad log_{b}^{a} < d, \quad O(N^{d}) (2)logba<d,O(Nd)
( 3 ) l o g b a = d , O ( N d l o g N ) (3) \quad log_{b}^{a} = d, \quad O(N^{d}logN) (3)logba=d,O(NdlogN)
public class Demo {
public int process(int[] arr, int left, int right) {
if (left == right) {
return arr[left];
}
int mid = left + ((right - left) >> 1);
int leftMax = process(arr, left, mid);
int rightMax = process(arr, mid + 1, right);
return Math.max(leftMax, rightMax);
}
}
分析
上述递归代码的子规模都是 N 2 \frac{N}{2} 2N故符合Master公式
- a: process函数有两次调用子规模的语句, 故a=2
- b: 子问题规模为
N
2
\frac{N}{2}
2N, 即
- O(
N
b
\frac{N}{b}
bN) = O(
N
2
\frac{N}{2}
2N), 即
- b = 2
- O(
N
b
\frac{N}{b}
bN) = O(
N
2
\frac{N}{2}
2N), 即
- d: process函数中除了子规模的调用都是常数级别的操作, 即
- O(
N
d
N^d
Nd) = O(1), 即
- d = 0
- O(
N
d
N^d
Nd) = O(1), 即
此时 l o g b a \quad log_{b}^{a} logba= l o g 2 2 log_{2}^{2} log22=1,d=0,1>0
故上述递归代码时间复杂度为: O ( N ) O(N) O(N)