zoukankan      html  css  js  c++  java
  • 剖析递归行为实质和递归行为时间复杂度的估算

    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)

  • 相关阅读:
    二叉查找树(二)
    白话红黑树系列之一——初识红黑树
    二叉查找树(三)
    白话红黑树系列之二——红黑树的构建
    二叉查找树(一)
    二叉查找树(五)
    选择实现—简单工厂
    嵌入式开发er的C语言能力自测(面试)题top 16
    AOP探索笔记
    浅谈.net插件式编程
  • 原文地址:https://www.cnblogs.com/bigdata-stone/p/10467616.html
Copyright © 2011-2022 走看看