递归行为时间复杂度估算

简介: 递归行为时间复杂度估算

承接上文递归算法


递归行为时间复杂度估算


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公式

image.png

process就是母问题

L~R上有N个数

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

image.png

这个是子问题

它的数据规模是N/2

L ~ mid的位置

image.png

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

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

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

子问题被调用了2次

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

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

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

image.png

时间复杂度是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) 表示除去调用子过程之外 剩下部分的时间复杂度

再举个一个例子

上面的问题是

image.png

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

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

对这个问题做下调整

image.png

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

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

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

再求右侧2/3规模

image.png

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

这2次调用有重合区域

image.png

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

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

再做调整

image.png

左侧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)

再调整一下


image.png

左侧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)

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

image.png

相关文章
|
7月前
|
算法 Java 程序员
认识复杂度、对数器、二分法
认识复杂度、对数器、二分法
59 1
|
7月前
|
人工智能 算法 测试技术
【动态规划】【二分查找】C++算法 466 统计重复个数
【动态规划】【二分查找】C++算法 466 统计重复个数
|
6月前
|
存储 机器学习/深度学习 算法
数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)
数据结构和算法学习记录——空间复杂度的计算(冒泡排序、阶乘递归、斐波那契数列递归、常见复杂度对比、栈帧、栈溢出)
48 0
|
7月前
|
算法
删除有序数组中的重复项。要求空间复杂度O(1),++时间复杂度O(n)
删除有序数组中的重复项。要求空间复杂度O(1),++时间复杂度O(n)
33 0
|
7月前
|
人工智能 C++
查找题(二分解法c++)
查找题(二分解法c++)
59 0
|
7月前
|
算法 C++
动态规划的时间复杂度优化
动态规划的时间复杂度优化
|
Java
简单计算时间复杂度
简单计算时间复杂度
35 1
|
算法 测试技术 C#
C++二分算法:得到子序列的最少操作次数
C++二分算法:得到子序列的最少操作次数
算法:分治思想处理快排递归以及快速选择/最小K个数问题
算法:分治思想处理快排递归以及快速选择/最小K个数问题
|
算法 索引
算法:二分查找算法/朴素二分/查找区间左右端点二分
算法:二分查找算法/朴素二分/查找区间左右端点二分