剖析递归行为实质和递归行为时间复杂度的估算
1.递归算法的时间复杂度:
master公式的使用:T(N)=a*T(N/b)+O(N^d) master公式的适用范围:划分的子过程规模是一样的情况下,只是发生了a次,这种情况下才能运用master来求解。
(1)log(b,a)>d —>复杂度为O(N^log(b,a))
(2)log(b,a)=d —>复杂度为 O(N^d*logN)
(3)log(b,a)<d —>复杂度为O(N^d)
2.接下来通过递归的方法求出一个数组中的最大值
public class Test2 { //在整个数组找到最大值,通过递归的方式在数组中找到最大值 //递归思路,先在数组的左半部分找出最大值,然后在数组的右半部分找出最大值,然后比较两个最大值的大小,找出全局的最大值 public static void main(String[] args) { int[] arr = {4,3,2,1}; System.out.println(getMax(arr,0,arr.length-1)); } public static int getMax(int[] arr,int L,int R){ //在L到R的范围上找到最大值,先找左边部分的最大值,然后找到右边部分的最大值 //边界条件,什么时候这个问题不需要再进行划分?当只有一个元素的时候,不用再进行划分了,直接返回当前 if(L==R){ return arr[L]; } int mid = (L+R)/2; int maxLeft = getMax(arr,L,mid); int maxRight= getMax(arr,mid+1,R); return Math.max(maxLeft,maxRight); } }
3.算法分析:
(1)主函数:getMax(arr,0,3)。递归函数就是系统在帮你压栈的操作。所谓的递归函数就是系统栈。任何递归行为都可以改成非递归。
(2)T(N)=aT(n/b)+O(n^d) T(N)表示样本量为N的情况下的时间复杂度。该式是估计递归行为时间复杂度的通式。n/b代表的是子过程的样本量,子问题的样本量要比原始问题的样本量要小,对于本问题,所有子过程的样本量都是N/2,发生了2次,出去递归过程之外,剩下的就是进行比对了,所以时间复杂度就是O(1)。于是在b=2,a=2,d=0的时候的式子就是:T(N)=2T(N/2)+O(1)。只要满足上面式子的,可以通过上述规律求出时间复杂度。这里的d是0,a是2,b是2,所以时间复杂度是:O(N^log(b,a))=O(N),即时间复杂度是O(N)。
(3)log(b,a)=d —>复杂度为 O(N^d*logN)
(4)T(n)=2T(n/2)+O(n^2) 即d=2的时候,时间复杂度是:O(N^2)