承接上文​​递归算法​

递归行为时间复杂度估算

​master公式​

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

1、 T(N)指母问题的数据量是N级别的

母问题有N个数据 规模是N

2、T(N/b) 子问题的规模都是N/b的规模

就是说母问题的规模是N个数据

但每一次的子过程规模是等量的都是N/b的规模

3、a表示这个子问题被调了多少次

4、O(N^d) 表示除了子问题之外剩下过程的时间复杂度

这样一类问题的递归 可以用master公式来求解时间复杂度

​结合上文的递归算法来理解下master公式​

递归行为时间复杂度估算_数据

process就是母问题

L~R上有N个数

首先看子问题的规模是不是等量的

递归行为时间复杂度估算_数据_02

这个是子问题

它的数据规模是N/2

L ~ mid的位置

递归行为时间复杂度估算_数据_03

这个也是子问题的调用 规模是N/2

也就是说子问题规模调用的时候都是等量的

所以这类问题可以用master公式来计算时间复杂度

子问题被调用了2次

T(N)=2*T(N/2)

调用了2次 每一次子问题的规模是N/2

除了子问题之外 剩下的时间复杂度是?

递归行为时间复杂度估算_递归_04

时间复杂度是O(1)

所以这个递归求最大值的master公式为:

T(N)=2*T(N/2)+O(1)

(就是master公式当a=2,b=2,d=0的时候)

​总结​

  • T(N/b) 表示调用子问题的规模是不是等量的都是N/b规模
  • a表示子问题是等量的情况下 被调用了多少次
  • O(N^d) 表示除去调用子过程之外 剩下部分的时间复杂度

​再举个一个例子​

上面的问题是

递归行为时间复杂度估算_时间复杂度_05

在L~R范围找中点位置 即L~R 切一半 左边找最大值

右边找最大值 然后就找出了整体的最大值

对这个问题做下调整

递归行为时间复杂度估算_时间复杂度_06

把左侧2/3的大小跑个递归

求左侧2/3做一个最大值

所以子问题的规模是T(2/3 N)=T(N/(3/2))

再求右侧2/3规模

递归行为时间复杂度估算_时间复杂度_07

还是 T(N/(3/2))规模

这2次调用有重合区域

递归行为时间复杂度估算_数据_08

虽然有重合部分 但也是符合master公式的

T(N)=2 * T(N (3/2))+O(1)

​再做调整​

递归行为时间复杂度估算_数据_09

左侧1/3大小调一次递归

右侧1/3大小调用一次递归

中间1/3大小调用一次递归

分别求出3个最大值

然后把三个最大值比较 然后返回

也是符合master公式的

T(N)= 3 * T(N/3)+O(1)

调用3次

每一次子问题的规模是T(N/3)

三个最大值出来之后 决策一下 还是O(1)的过程

假设在求出每个最大值之后 再打印所有值

那么时间复杂度是 T(N)= 3 * T(N/3)+O(N)

​再调整一下​

递归行为时间复杂度估算_时间复杂度_10

左侧1/3处求个最大值

右侧2/3处求个最大值

这样就不符合master公式了

T(N)=T((1/3) N) + T((2/3) N)+O(1)

因为子问题规模不一样

只要满足master公式的递归

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

当a、b、d确定

  • 如果
  • 如果 > d 时间复杂度是O(N^())
  • 如果 = d 时间复杂度是O(N^d * )

刚才那个问题 a=2,b=2,d=0

=1

1>0

所以匹配上述第二种情况

所以时间复杂度是O(N)

说明递归行为等效于从左到右遍历一遍求最大值

递归行为时间复杂度估算_数据_11