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)

版权声明:本文为bigdata-stone原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/bigdata-stone/p/10467616.html