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

平时我们写得算法可以用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)

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值