递归行为时间复杂度估算

承接上文递归算法

递归行为时间复杂度估算

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)

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值