master: T(n) = a * T(N/b) + O(N^d);
当:
1) log(b,a) > d 复杂度为O(N^log(b,a)) //log以b为底,a的对数
2) log(b,a) = d 复杂度为O(N^d*logN)
3) log(b,a) < d 复杂度为O(N^d)
符合子问题规模是等规模的行为,均可使用master公式求解时间复杂度。
例子:
public static int[] markNo(int size) {
if (size == 1) {
return new int[]{1};
}
int halfSize = (size + 1) / 2;
int[] base = markNo(halfSize);
int[] ans = new int[size];
int index = 0;
// 一半变为基数
for (int i = 0; index < halfSize; i++, index++) {
ans[index] = (base[i] * 2 + 1);
}
// 另一半变成偶数
for (int i = 0; index < size; i++, index++) {
ans[index] = (base[i] * 2);
}
return ans;
}
a: 子问题调用的次数,本程序的次数为1次;
N:为母问题规模,本程序的母问题规模为N;
T(N/b): 子问题规模,本程序的子问题规模为:N/2(二分);
O(n^d): 子问题以为的时间复杂度,本程序为O(N^1);
a =1;b=2;d=1
可得本程序的master公式为:T(N) = 1 * T(N/2) + O(N^1);
log(b,a) d
log(2,1) =0
所以log(2,1) <1
命中 3) log(b,a) < d 复杂度为O(N^d)
所以,本程序的时间复杂度为:T(N) = O(N)