定义
T(N) = a * T(N/b) + O(N^d)
a:子规模问题调用的次数
1/b:子规模问题的规模(子问题等规模)
O(N^d):子规模问题之外的时间复杂度
用法
满足master公式的算法,可通过其系数 估算时间复杂度:
log(b,a) > d,时间复杂度为O(N^log(b,a)),
log(b,a) = d,时间复杂度为O(N^d * logN),
log(b,a) < d,时间复杂度为O(N^d)
用例
/**基础二分法求最大值 */
process(arr:number[],l:number,r:number):number{
if(l==r){
return arr[l];
}
let mid = l + ((r-l)>>1); //防溢出的求中点方式,万一数组很大的情况下
let lMax = this.process(arr,l,mid);
let rMax = this.process(arr,mid + 1,r);
return lMax > rMax ? lMax : rMax;
}
上方代码中 子问题规模为1/2,所以b=2,子规模调用次数为两次,所以a=2,除了子问题以外的其余部分复杂度为O(1),所以d=0
log(2,2) > 0,因此该算法的时间复杂度为O(N),说明二分递归求最大值算法 和遍历一遍的时间复杂度一致
注意:
子问题每次的规模相等才满足master,用例是从数组的1/2处拆分做递归,子问题规模都是1/2。如果从一个数组的1/3处拆分为两部分,其中一次调用的规模为1/3,另一次为2/3,则其不满足master公式。若将该数组拆分为等量三部分,3次递归的规模都为1/3,也满足master公式。