剖析递归行为实质和递归行为时间复杂度的估算

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)

转载于:https://www.cnblogs.com/bigdata-stone/p/10467616.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值