递归行为的时间复杂度估计

平时我们写得算法可以用for循环来得出算法的时间复杂度,那么大家有没有想过递归的时间复杂度呢?是不是递归的时间复杂度算不了呢?不是的,递归行为的时间复杂度可以用master公式进行估算

master公式

T(N) = a*T(N/b) + O(N^d)

公式解释:
b :样本被分为几个部分
a :总体相当与一个部分样本发生多少次
O(N^d) :除了递归之外的其他时间复杂度,比如for循环

复杂度估算
  • log(b,a) > d :时间复杂度为O(N^log(b,a))
  • log(b,a) = d :时间复杂度为O(N^d * log(N))
  • log(b,a) < d :复杂度为O(N^d)
    下面我们以一个例子来理解递归的时间复杂度估计
    代码:
 1package com.atguigu.datastructure;
2
3public class aaa {
4    public static void main(String[] args) {
5        int[] arr = {4,6,1,54,0,4,4,44};
6        int max = getMax(arr, 0, arr.length - 1);
7        System.out.println(max);
8    }
9
10    public static int getMax(int[] arr, int l, int r) {
11        if (l == r) {
12            return arr[l];
13        }
14        int mid = (l + r) / 2;
15        int maxLeft = getMax(arr, l, mid);
16        int maxRight = getMax(arr, mid+1, r);
17        return Math.max(maxLeft, maxRight);
18    }
19}

该算法使用递归查找一个数组中的最大值。该算法把数据一分为二,并且递归求出左右两边的最大值


数据集被分为两个部分,所以b=2
所以整体是部分的两倍,因此a=2
除此之外,只有获取两个值的最大值的操作,因此O(N^d)=O(1),故d=0.
则T(N) = aT(N/b) + O(N^d) = T(N) = 2T(N/2) + O(N^0)
又因为log(b,a)=log(2,20=1 > d=0
根据log(b,a) > d :时间复杂度为O(N^log(b,a))
时间复杂度为O(N^1)=O(N)

递归的时间复杂度估计就说这么多了, 希望对大家有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值