承接上文递归算法
递归行为时间复杂度估算
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个数
首先看子问题的规模是不是等量的
这个是子问题
它的数据规模是N/2
L ~ mid的位置
这个也是子问题的调用 规模是N/2
也就是说子问题规模调用的时候都是等量的
所以这类问题可以用master公式来计算时间复杂度
子问题被调用了2次
T(N)=2*T(N/2)
调用了2次 每一次子问题的规模是N/2
除了子问题之外 剩下的时间复杂度是?
时间复杂度是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) 表示除去调用子过程之外 剩下部分的时间复杂度
再举个一个例子
上面的问题是
在L~R范围找中点位置 即L~R 切一半 左边找最大值
右边找最大值 然后就找出了整体的最大值
对这个问题做下调整
把左侧2/3的大小跑个递归
求左侧2/3做一个最大值
所以子问题的规模是T(2/3 N)=T(N/(3/2))
再求右侧2/3规模
还是 T(N/(3/2))规模
这2次调用有重合区域
虽然有重合部分 但也是符合master公式的
T(N)=2 * T(N (3/2))+O(1)
再做调整
左侧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)
再调整一下
左侧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)
- 如果 > d 时间复杂度是O(N^())
- 如果 = d 时间复杂度是O(N^d * )
刚才那个问题 a=2,b=2,d=0
=1
1>0
所以匹配上述第二种情况
所以时间复杂度是O(N)
说明递归行为等效于从左到右遍历一遍求最大值