递归过程是不断压栈和出栈的过程,那该怎样估算它的时间复杂度呢,可以用到master公式
master公式的使用,需要递归过程可以写为:
T(N)= a * T(N/b) + 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);
int leftMax = process(arr, L, mid);
int rightMax = process(arr, mid + 1, R);
return Math.max(leftMax, rightMax);
}
上面的写成master公式就是:T(N)= 2 * T(N/2)+ O(1),这个时候a = 2, b = 2, d = 0;
如果上面的代码块写成下面的形式:
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];
}
for(int i = L; i <= R; i++){
System.out.println(arr[i]);
}
int mid = L + ((R - L) >> 1);
int leftMax = process(arr, L, mid);
int rightMax = process(arr, mid + 1, R);
return Math.max(leftMax, rightMax);
}
这时上面代码块的master公式需要改写成:T(N)= 2 * T(N/2)+ O(N)
针对可以写成master公式的递归过程,它们的时间复杂度可以由下面推出:
- log(b,a) > d时,时间复杂度是O(N ^ log(b,a))
- log(b,a) = d时,时间复杂度是O((N^d) * log(N))
- log(b,a) < d时,时间复杂度是O(N^d)