22.1.7 master公式及O(NLogN)的排序
1 master 公式
-
T(N) = a * T(N/b) + O(N^d);
-
master公式用来求递归行为的时间复杂度,式中T(N/b)表示母问题被分解为子问题的规模,a表示子问题被调用的次数,O(N^d)表示算法中其他过程的时间复杂度。
例如:
public static int getMax(int[] arr)
{
return process(arr,0,arr.length-1);
}
public static int process(int[] arr,int L,int R)
{
if(L==R)
return arr[L];
int mid = L+((R-L)>>1);//mid = L+((R-L)/2),/2可以表示为右移一位。
int leftMax = process(arr,L,mid);
int rightMax = process(arr,mid,R);
return Math.max(leftMax,rightMax);
} -
其中,T(N) = 2 * T(N/2) + O(1);a = 2,b = 2,d = 0;
(2)求时间复杂度:
-
log以b为底a的对数 < d , 时间复杂度为O(N^d);
-
log以b为底a的对数 > d , 时间复杂度为O(N^log以b为底a的对数);
-
log以b为底a的对数 = d , 时间复杂度为O((N^d) * logN);
2 O(NLogN)的排序:
(1) 归并排序:
public static void main(String[] args)
{
int[] arr = {2,4,6,4,6,7,1,8,3,9,8};
process(arr,0,arr.length-1);
for(int cur:arr)
{
System.out.print(cur+" ");
}
}
public static void process(int[] arr,int L,int R)
{
if(L==R)
return;
int mid = L+((R-L)>>1);
process(arr,L,mid);
process(arr,mid+1,R);
mergeSoft(arr,L,mid,R);
}
public static void mergeSoft(int[] arr,int L,int M,int R)
{
int[] help = new int[R-L+1];
int i=0;
int p1 = L;
int p2 = M+1;
while(p1<=M && p2<=R)
{
help[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];
}
while(p1<=M)
help[i++] = arr[p1++];
while(p2<=R)