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

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

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

发布了12 篇原创文章 · 获赞 0 · 访问量 185
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览