平时我们写得算法可以用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)
递归的时间复杂度估计就说这么多了, 希望对大家有用。