T(N) = a*T(N/b)+O(N^d)
解释:在递归中,母问题也就是TN,如果可以分成b个等规模的子问题,母问题要调用a次子问题才可以解决,剩余过程的复杂度为O(N^d)的话,那母问题的时间复杂度就可以直接求解。
时间复杂度三种情况:
1.log(b,a) < d 复杂度为O(N^d)
2.log(b,a) >d 复杂度为O(N^log(b,a)
3.log(b,a) = d 复杂度为O(N^d*logN)
举例子:
递归求一个数组中的最大值
public static int process(int[] arr,int left,int right) {
int mid = left + ((right-left)>>1);
if(left == right) {
return arr[left];
//当一个范围内只有一个数时就直接返回
}
int leftMax = process(arr,left,mid);//分别取左右两边的最大值
int rightMax = process(arr,mid+1,right);
return Math.max(leftMax, rightMax);//结果是两边的最大值
}
本问题中子问题的规模是母问题的一半,一个求左边一个求右边,然后调用子问题2次,剩余过程一次求中间值一次返回
所以a = 2 b = 2 O(N^d) = 1 d = 0;
套公式符合第二个 log(b,a) >d 所以时间复杂度为O(N^log(b,a)) = O(N)