目录
01 master公式求递归时间复杂度
master公式(也称主方法)是用来利用分治策略来解决问题经常使用的时间复杂度的分析方法,(补充:分治策略的递归解法还有两个常用的方法叫做代入法和递归树法,以后有机会和亲们再唠),众所周知,分治策略中使用递归来求解问题分为三步走,分别为分解、解决和合并,所以主方法的表现形式:
T [n] = aT[n/b] + f (n)(直接记为T [n] = aT[n/b] + O (N^d))
其中 a >= 1 and b > 1 是常量,其表示的意义是n表示问题的规模,a表示递归的次数也就是生成的子问题数,子问题规模应该一致,b表示每次递归是原来的1/b之一个规模,f(n)表示分解和合并所要花费的时间之和。
解法:
①当d < logb a时,时间复杂度为O(n^(logb a))
②当d == logb a时,时间复杂度为O((n^d)*logn)
③当d > logb a时,时间复杂度为O(n^d)
三个系数一旦确定,时间复杂度就确定了
public class RecursionTest {
// 递归原理分析
public static int getMax(int[] arr){
return process(arr,0, arr.length - 1);
}
// 求arr数组中i 到 j 中的最大值
public static int process(int arr[], int L, int R){
if(L == R){
return arr[L];
}
int mid = L + ((R - L) >> 1); // 求中点:如果直接用(l + r)/2 可能会超出界限
int leftMax = process(arr, L, mid); // 分而治之的思想
int rightMax = process(arr, mid + 1, R);
return Math.max(leftMax,rightMax);
}
}
02 归并排序
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
- 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
- 自下而上的迭代;
2.1 算法步骤
先让左侧部分有序, 再让右侧部分有序生成两个有序序列
-
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
-
设定两个指针,最初位置分别为两个已经排序序列的起始位置;
-
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
-
重复步骤 3 直到某一指针达到序列尾;
-
将另一序列剩下的所有元素直接复制到合并序列尾。