计算递归算法时间复杂度通用公式

计算递归算法时间复杂度通用公式最近看 算法导论 公开课视频 虽然本科没有学过此类课程 但也能感觉得出来教学水平高于母校 在此就吐槽这一句 进入正题 第一二课讲到一种分析递归算法的时间复杂度的方法 递归树 长期处于学习技术阶段没有科研导致数学水平直线下降 为了看懂课程不得不捡回一点数学的基础知识 递归算法时间复杂度的计算可以类比于高中时期数列的通项公式计算 虽然曾经基本看到什么类型的题目就知道套用什么公式 现在全忘了 说多

最近看《算法导论》公开课视频,虽然本科没有学过此类课程,但也能感觉得出来教学水平高于母校,在此就吐槽这一句,进入正题。

第一二课讲到一种分析递归算法的时间复杂度的方法——递归树。长期处于学习技术阶段没有科研导致数学水平直线下降,为了看懂课程不得不捡回一点数学的基础知识。递归算法时间复杂度的计算可以类比于高中时期数列的通项公式计算,虽然曾经基本看到什么类型的题目就知道套用什么公式,现在全忘了,说多了都是泪。但是递归算法时间复杂度的计算又有别于数列通项公式的计算,高中套用的那些公式不符合这种情况。下面介绍具体方法。

对于一个递归算法,首先我们可以分析得出其中一个递归方程:

计算递归算法时间复杂度通用公式

我们直接考虑一般情况,当h(n)的时间复杂度为计算递归算法时间复杂度通用公式时,假设h(n)=计算递归算法时间复杂度通用公式,下面对公式进行递归树的展开。

计算递归算法时间复杂度通用公式计算递归算法时间复杂度通用公式计算递归算法时间复杂度通用公式

计算时间复杂度就是将构建的递归树的所有节点的值进行求和,S(n) = h(n)+a*h(n)+a2*h(n/b2)+…+ai-1*h(n/bi-1i),设i-1行为倒数第二行,最后一行的值都为常数即T(1)对于时间复杂度的计算无影响,在求和时直接省略,则可得n/b= 1,i = logbn

将h(n) = 计算递归算法时间复杂度通用公式代入S(n) = h(n)+a*h(n)+a2*h(n/b2)+…+ai-1*h(n/bi-1i)中可得S(n) = 计算递归算法时间复杂度通用公式*[1+a/ bk+(a/ bk)2+…+(a/ bk)i-1],为等比数列求和。

1.当k=0时,即h(n)为常数,

a = 1时,S(n) = i*1 =  logbn = O(logn),

当a !=1时,S(n) = 计算递归算法时间复杂度通用公式 = 计算递归算法时间复杂度通用公式 = O(计算递归算法时间复杂度通用公式)

2.当k!=0时,

当公比为1时,即a/ b= 1,S(n) = 计算递归算法时间复杂度通用公式*(i*1) =计算递归算法时间复杂度通用公式*logbn = O(h(n)*logn)

当公比不为1时,S(n) = 计算递归算法时间复杂度通用公式 = 计算递归算法时间复杂度通用公式

当公比大于1时,即a/ bk>1,计算递归算法时间复杂度通用公式>k,则S(n) = O(计算递归算法时间复杂度通用公式)

当公比小于1时,即a/ bk<1,计算递归算法时间复杂度通用公式

上面讲完了理论,就得使用实际的例子来运用一下,就拿排序算法中运用递归思想的归并排序来讲,归并排序的思路是将无序数列平均分直到每份的个数为1,将分割的部分两两合并,每次合并都得到一个有序数列,直到最后合并完成。根据算法的表述,可得到归并排序的递归方程为T(n) = 2*T(n/2) + f(n),其中f(n)为每次合并的复杂度,由于每次合并依次将两个有序序列中最小的放入结果序列中,因此复杂度为O(n),因此递归方程表示为T(n) = 2*T(n/2) + n,直接利用通用公式求解得到该方程的复杂度为f(n)*logn即n*logn。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210467.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午7:37
下一篇 2026年3月19日 上午7:37


相关推荐

  • win11安装 OpenClaw 完整搭建安装指南:从新手到专家教程

    win11安装 OpenClaw 完整搭建安装指南:从新手到专家教程

    2026年3月12日
    2
  • SQL保留小数点前面的0 round trunc 上取整,下取整[通俗易懂]

    SQL保留小数点前面的0 round trunc 上取整,下取整[通俗易懂]SELECTto_char(.2,’90.00′)FROMdual;SELECTto_char(.2,’00.00′)FROMdual;SELECTto_char(.2,’99.99′)FROMdual;SELECTto_char(.2,’90.99′)FROMdual;SELECTDECODE(substr(.2,1,1),’.’,0||.2,.2)F

    2022年7月20日
    42
  • intellj 激活码2021(最新序列号破解)

    intellj 激活码2021(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    110
  • 详解布隆过滤器的原理和实现「建议收藏」

    详解布隆过滤器的原理和实现「建议收藏」为什么需要布隆过滤器想象一下遇到下面的场景你会如何处理: 手机号是否重复注册 用户是否参与过某秒杀活动 伪造请求大量id查询不存在的记录,此时缓存未命中,如何避免缓存穿透 针对以上问题常规做法是:查询数据库,数据库硬扛,如果压力并不大可以使用此方法,保持简单即可。改进做法:用list/set/tree维护一个元素集合,判断元素是否在集合内,时间复杂度或空间复杂度会比较高。如果是微服务的话可以用redis中的list/set数据结构,数据规模非常大此方案

    2022年10月6日
    4
  • DB4O详细介绍

    DB4O详细介绍深入db4o深入db4o这是RickGrehan发表在TheServerSide上的一篇关于面向对象数据库–db4o的文章,较全面地介绍了db4o的关键特性,希望对大家认识db4o能有所帮助。(2007.12.07最后更新)db4o-针对对象的数据库-是一个完全的对象数据库;它以使对象在其生命周期中-无论是在数据库内或是在外-都保持着它们的本性这样一种方…

    2022年7月21日
    15
  • 什么是大数据架构?需要学什么内容?[通俗易懂]

    什么是大数据架构?需要学什么内容?[通俗易懂]大数据架构设计用来处理对传统数据库系统而言太大或太复杂的数据的引入、处理和分析。组织进入大数据领域的门槛各不相同,具体取决于用户的权限及其工具的功能。对某些组织来说,大数据可能意味着数百个GB的数据,而对另一些组织来说,大数据则意味着数百个TB的数据。随着处理大数据集的工具的发展,大数据的涵义也在不断地变化。慢慢地,这个术语更多的是指通过高级分析从数据集获取的价值,而不是严格地指数据的大小…

    2022年5月16日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号