Master公式(计算递归复杂度)

Master公式

在计算涉及递归的算法的时候,计算复杂度就会变得有些麻烦。Master公式就是用来进行剖析递归行为和递归行为时间复杂度的估算的

  • Master公式:T(N) = a*T(N/b) + O(N^d)

  • 公式解释:n表示问题的规模,a表示递归的次数也就是生成的子问题数,N/b表示子问题的规模。O(N^d)表示除了递归操作以外其余操作的复杂度

  • 结论(证明省略):
    ①当d<logb a时,时间复杂度为O(N^(logb a))
    ②当d=logb a时,时间复杂度为O((N^d)*logN)
    ③当d>logb a时,时间复杂度为O(N^d)

  • 注意:子问题规模必须等分,不管你是分成几部分

  • 补充阅读:想要了解更多请点击 点我点我

举个例子

下面代码,T(N) = 2 * T(N/2) + O(1)

  • 源代码:
package LeetCode;
/**
 * @Description:
 * @ProjectNmae: gitTest
 * @PackageName: LeetCode
 * @ClassName: test
 * @Author: Y-peak
 * @Date: 2021.08.27 15:27   星期五
 */

public class test {
    public static void main(String[] args) {
        int[] arr = new int[]{1,1,2,7,23,4,4};
        System.out.println(function(arr,1,3));
    }
    //求数组arr [L,N] 范围内的最大值
    public static int function(int[] arr, int L,int R)
    {
        if(L == R)
            return arr[L];
        int mid = L + ((R-L)>>1);
        int leftMax = function(arr,L, mid);
        int rightMax = function(arr, mid + 1, R);  //两次递归,问题规模等分。
        return Math.max(leftMax,rightMax);
    }
}

与上面对比一下,下面的代码:T(N) = 2 * T(N/2) + O(N)

package LeetCode;

/**
 * @Description:
 * @ProjectNmae: gitTest
 * @PackageName: LeetCode
 * @ClassName: test
 * @Author: Y-peak
 * @Date: 2021.08.27 15:27   星期五
 */

public class test {
    public static void main(String[] args) {
        int[] arr = new int[]{1,1,2,7,23,4,4};
        System.out.println(function(arr,1,3));
    }
    //求数组arr [L,N] 范围内的最大值
    public static int function(int[] arr, int L,int R)
    {
        if(L == R)
            return arr[L];
        for (int i = L; i < R; i++)    //时间复杂度为 O(N)
            System.out.println("哎,我就是玩,我就是增加复杂度");
        int mid = L + ((R-L)>>1);
        int leftMax = function(arr,L, mid);
        int rightMax = function(arr, mid + 1, R);
        return Math.max(leftMax,rightMax);
    }
}
  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值