1、利用Master公式求递归算法的时间复杂度
1.1、Master公式
1.2、参数含义
a表示被划分成a个相同规模的子问题
b表示每个子问题处理的数据规模
O(n^d)表示合并子问题解所要花费的时间复杂度
1.3、适用范围
Master公式只适用于子问题规模相同的递归算法。
什么是子问题规模相同呢?
举个例子及,假定需要从数组中找出最大的数,并且用递归算法实现,可以有以下两种实现:
// 非等区间划分,子问题规模不一致,无法使用Master公式估算时间复杂度
int getMax1(int[] nums, int left, int right) {
if(left >= right) return nums[left];
int partitionSize = (right-left)/3;
// 划分区间,两个子问题规模分别为n/3和2n/3
int leftMax = getMax1(nums, left, left + partitionSize);
int rightMax = getMax1(nums, left + partitionSize + 1, right);
return leftMax > rightMax ? leftMax : rightMax;
}
// 等区间划分,子问题规模都为n/2,可使用Master公司估算时间复杂度
// T(n) = 2×T(n/2) + O(1)
// a = 2, b = 2, c = 0
// 根据Master计算公式可得,时间复杂度为O(N)
int getMax2(int[] nums, int left, int right) {
if(left >= right) return nums[left];
int mid = (left+right)/2;
// 划分区间,两个子问题规模都为n/2
int leftMax = getMax2(nums, left, mid);
int rightMax = getMax2(nums, mid + 1, right);
return leftMax > rightMax ? leftMax : rightMax;
}


202

被折叠的 条评论
为什么被折叠?



