master公式是用于剖析递归行为时间复杂度的公式。
T [n] = aT[n/b] + f (n)(直接记为T [n] = aT[n/b] + O(N^d))
其中a是发生相同规模子递归的次数,b是子递归的规模,f(n)是剩余子式的时间复杂度。
举例说明:
public class master公式 {
public static int process(int[] arr,int L, int R) {
if (L == R) {
return arr[L];
}
/**
* 求中点的一种写法,好处是相较于传统的写法,它可以防止数据的溢出。
* 原理如下:
* R — L为该区域的总长度,>>为右移一位,也就是直接除2的意思,这样子得到(R-L) >> 1的意思就是总长度的一半。
* L为最左边的数,再加上总长度的一半,就刚好是中点。
*/
int mid = L + ((R-L) >> 1);
int leftMax = process(arr, L, mid);
int rightMax = process(arr, mid + 1, R);
return Math.max(leftMax, rightMax);
}
}
上面代码中我们可以知道,他的子递归为leftMax和rightMax,次数为2,规模为二分之一,其余操作的时间复杂度为O(1),
所以T[n] = 2T[n/2] + O(1)。
①当d<logb a时,时间复杂度为O(n^(logb a))
②当d=logb a时,时间复杂度为O((n^d)*logn)
③当d>logb a时,时间复杂度为O(n^d)
上面的这个例子a=2,b=2,d=0,所以他符合情况二。时间复杂度为O(N),
注意:适用范围为子过程规模相等的情况,否则不适用。