递归的时间复杂度怎么算_递归行为的时间复杂度估计

本文介绍了计算递归时间复杂度的Master公式,详细解释了公式中的各个参数含义,如b代表样本被分的部分,a代表总体与部分的关系,O(N^d)表示非递归操作的时间复杂度。通过一个寻找数组最大值的递归算法实例,分析得出当数据集被分为两部分,a=2,d=0时,时间复杂度为O(N)。
摘要由CSDN通过智能技术生成
平时我们写得算法可以用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}

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

b87c5bbfde2a4c70a0f82e770cc626a4.png

数据集被分为两个部分,所以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、付费专栏及课程。

余额充值