0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

好好分析一下如何求递归算法的时间复杂度

算法与数据结构 来源:代码随想录 作者:程序员Carl 2022-07-13 11:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

相信很多同学对递归算法的时间复杂度都很模糊,那么这篇来给大家通透的讲一讲。

同一道题目,同样使用递归算法,有的同学会写出了O(n)的代码,有的同学就写出了O(logn)的代码

这是为什么呢?

如果对递归的时间复杂度理解的不够深入的话,就会这样!

那么我通过一道简单的面试题,模拟面试的场景,来带大家逐步分析递归算法的时间复杂度,最后找出最优解,来看看同样是递归,怎么就写成了O(n)的代码。

面试题:求x的n次方

想一下这么简单的一道题目,代码应该如何写呢。最直观的方式应该就是,一个for循环求出结果,代码如下:

intfunction1(intx,intn){
intresult=1;//注意任何数的0次方等于1
for(inti=0;i< n; i++) {
        result = result * x;
    }
    return result;
}

时间复杂度为O(n),此时面试官会说,有没有效率更好的算法呢。

如果此时没有思路,不要说:我不会,我不知道了等等

可以和面试官探讨一下,询问:“可不可以给点提示”。面试官提示:“考虑一下递归算法”。

那么就可以写出了如下这样的一个递归的算法,使用递归解决了这个问题。

intfunction2(intx,intn){
if(n==0){
return1;//return1同样是因为0次方是等于1的
}
returnfunction2(x,n-1)*x;
}

面试官问:“那么这个代码的时间复杂度是多少?”。

一些同学可能一看到递归就想到了O(logn),其实并不是这样,递归算法的时间复杂度本质上是要看:递归的次数 * 每次递归中的操作次数

那再来看代码,这里递归了几次呢?

每次n-1,递归了n次时间复杂度是O(n),每次进行了一个乘法操作,乘法操作的时间复杂度一个常数项O(1),所以这份代码的时间复杂度是 n * 1 = O(n)。

这个时间复杂度就没有达到面试官的预期。于是又写出了如下的递归算法的代码:

intfunction3(intx,intn){
if(n==0){
return1;
}
if(n%2==1){
returnfunction3(x,n/2)*function3(x,n/2)*x;
}
returnfunction3(x,n/2)*function3(x,n/2);
}

面试官看到后微微一笑,问:“这份代码的时间复杂度又是多少呢?” 此刻有些同学可能要陷入了沉思了。

我们来分析一下,首先看递归了多少次呢,可以把递归抽象出一颗满二叉树。刚刚同学写的这个算法,可以用一颗满二叉树来表示(为了方便表示,选择n为偶数16),如图:

pYYBAGLOPHOADNe1AAEQVirlC3Q595.jpg

当前这颗二叉树就是求x的n次方,n为16的情况,n为16的时候,进行了多少次乘法运算呢?

这棵树上每一个节点就代表着一次递归并进行了一次相乘操作,所以进行了多少次递归的话,就是看这棵树上有多少个节点。

熟悉二叉树话应该知道如何求满二叉树节点数量,这颗满二叉树的节点数量就是2^3 + 2^2 + 2^1 + 2^0 = 15,可以发现:这其实是等比数列的求和公式,这个结论在二叉树相关的面试题里也经常出现

这么如果是求x的n次方,这个递归树有多少个节点呢,如下图所示:(m为深度,从0开始)

fc93b21c-025a-11ed-ba43-dac502259ad0.png

时间复杂度忽略掉常数项-1之后,这个递归算法的时间复杂度依然是O(n)。对,你没看错,依然是O(n)的时间复杂度!

此时面试官就会说:“这个递归的算法依然还是O(n)啊”, 很明显没有达到面试官的预期。

那么O(logn)的递归算法应该怎么写呢?

想一想刚刚给出的那份递归算法的代码,是不是有哪里比较冗余呢,其实有重复计算的部分。

于是又写出如下递归算法的代码:

intfunction4(intx,intn){
if(n==0){
return1;
}
intt=function4(x,n/2);//这里相对于function3,是把这个递归操作抽取出来
if(n%2==1){
returnt*t*x;
}
returnt*t;
}

再来看一下现在这份代码时间复杂度是多少呢?

依然还是看他递归了多少次,可以看到这里仅仅有一个递归调用,且每次都是n/2 ,所以这里我们一共调用了log以2为底n的对数次。

每次递归了做都是一次乘法操作,这也是一个常数项的操作,那么这个递归算法的时间复杂度才是真正的O(logn)

此时大家最后写出了这样的代码并且将时间复杂度分析的非常清晰,相信面试官是比较满意的。

总结

对于递归的时间复杂度,毕竟初学者有时候会迷糊,刷过很多题的老手依然迷糊。

本篇我用一道非常简单的面试题目:求x的n次方,来逐步分析递归算法的时间复杂度,注意不要一看到递归就想到了O(logn)!

同样使用递归,有的同学可以写出O(logn)的代码,有的同学还可以写出O(n)的代码。

对于function3 这样的递归实现,很容易让人感觉这是O(logn)的时间复杂度,其实这是O(n)的算法!

intfunction3(intx,intn){
if(n==0){
return1;
}
if(n%2==1){
returnfunction3(x,n/2)*function3(x,n/2)*x;
}
returnfunction3(x,n/2)*function3(x,n/2);
}

可以看出这道题目非常简单,但是又很考究算法的功底,特别是对递归的理解,这也是我面试别人的时候用过的一道题,所以整个情景我才写的如此逼真,哈哈。

大厂面试的时候最喜欢用“简单题”来考察候选人的算法功底,注意这里的“简单题”可并不一定真的简单哦!

如果认真读完本篇,相信大家对递归算法的有一个新的认识的,同一道题目,同样是递归,效率可是不一样的!



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4761

    浏览量

    97146
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    免停电接线的电能质量在线监测装置的安装和调试复杂吗?

    操作门槛,具体难度因电压等级与现场条件而异。 、安装环节的复杂度分析 安装难度核心取决于 电压等级 和 现场预留条件 ,整体可分为 “低压简易安装” 和 “中高压专业安装” 两类: 1. 低压系统(0.4kV/380V):安装
    的头像 发表于 12-05 18:00 3313次阅读
    免停电接线的电能质量在线监测装置的安装和调试<b class='flag-5'>复杂</b>吗?

    支付宝“碰一下”的革新背后:国民技术MCU的隐形力量

    该类别中唯的中国企业。短短两个月内,“碰一下”已连续获得三项国际奖项。此前,在国际权威市场调研机构JuniperResearch公布的2025年“未来数字奖”
    的头像 发表于 11-21 19:15 1081次阅读
    支付宝“碰<b class='flag-5'>一下</b>”的革新背后:国民技术MCU的隐形力量

    程序运行慢,是否需检查算法时间复杂度过高?

    程序运行慢,需检查算法时间复杂度是否过高?
    发表于 11-17 08:08

    复杂的软件算法硬件IP核的实现

    关系的“硬件汇编”语言,即 Hardware Assembly(HASM),第二步就将 HASM 文本描述的具体逻辑实现直接翻译成 HDL 文本。在这里主要分享一下 HASM 以及 C to HAL
    发表于 10-30 07:02

    AES和SM4算法的可重构分析

    、AES和SM4算法特点分析 基于前面几篇分享,我们对AES和SM4的算法流程有了较为清晰的认识,接下来对AES和SM4算法的共同点进行
    发表于 10-23 07:26

    NTT设计介绍

    位去乘以另个数据的每位,其算法时间复杂度为。NTT可以看作是定义在有限域上的快速傅里叶变换,算法
    发表于 10-22 06:05

    DFT算法与FFT算法的优劣分析

    算法之间有什么不同,采用相关算法的依据。下面就来介绍一下两种算法的不同以及适用的些场合。 DFT算法
    的头像 发表于 08-04 09:30 894次阅读

    “碰一下”支付终端应用在酒店:智能无卡入住与客房控制

    “碰一下”支付终端和“碰一下”支付机具今年已在各种餐饮零售门店推广应用。就连天波小编家附近的村口小超市也用上了“碰一下”支付终端。近日,卤味龙头企业绝味食品宣布,全国门店将接入“支付宝碰一下
    的头像 发表于 07-04 09:57 625次阅读
    “碰<b class='flag-5'>一下</b>”支付终端应用在酒店:智能无卡入住与客房控制

    鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析

    ); // 递归地狱! } 优化方案 → 改用循环(时间复杂度O(n)): function myFun2(n) { let [a, b] = [0, 1]; for (let i = 0; i
    发表于 06-12 17:09

    苏州高美达选购我司HS-TGA-101热重分析

    在材料研究与生产领域,精准分析材料热性能至关重要。苏州高美达公司经过多方调研与严格测试,最终选定我司的HS-TGA-101热重分析仪,为其材料研发与质量把控注入强大助力。苏州高美达
    的头像 发表于 06-12 09:47 721次阅读
    苏州高<b class='flag-5'>求</b>美达选购我司HS-TGA-101热重<b class='flag-5'>分析</b>仪

    ADIN2111集成10BASE-T1L PHY的低复杂度、2端口以太网交换机技术手册

    ADIN2111是款低功耗、低复杂度、双以太网端口交换机,它集成了10BASE-T1L PHY和个串行外设接口(SPI)端口。该器件使用低功率受限节点,面向工业以太网应用且符合IEEE
    的头像 发表于 05-15 11:41 1203次阅读
    ADIN2111集成10BASE-T1L PHY的低<b class='flag-5'>复杂度</b>、2端口以太网交换机技术手册

    tcl罗格朗楼道声光开关电路图太复杂了,请高手帮忙分析一下电路图的控制原理?

    上图是我自己根据tcl罗格朗楼道声光开关实物画的电路图,太复杂了,请高手帮忙分析一下电路图的控制原理?或者发份原厂电路图及分析?谢谢!
    发表于 03-15 18:33

    “碰一下”支付背后的4G技术

    不知道你是否有留意,近期,在线下支付场景中,多了个支付宝“碰一下”支付的设备,只需要“解锁手机—碰一下—确认”即可完成支付,对比打开付款码支付,步骤确实更加简洁。
    的头像 发表于 01-03 16:27 5002次阅读

    AI时代芯片复杂度飙升,思尔芯国产硬件仿真加速芯片创新

    引言在人工智能(AI)技术蓬勃发展的今天,芯片的复杂度正以前所未有的速度飙升,轻松跨越了百亿逻辑门级别的大关。这趋势不仅推动了半导体行业的快速发展,也对硬件仿真系统提出了更高的挑战和要求。在近日
    的头像 发表于 12-27 18:01 1183次阅读
    AI时代<b class='flag-5'>下</b>芯片<b class='flag-5'>复杂度</b>飙升,思尔芯国产硬件仿真加速芯片创新

    ADS58C20热阻有顶面(9.3/W)和底面(0.5/W),请问一下折算为面的热阻怎么计算?

    ADS58C20热阻有顶面(9.3/W)和底面(0.5/W),请问一下折算为面的热阻怎么计算?
    发表于 12-12 06:43