我的编程空间,编程开发者的网络收藏夹
学习永远不晚

递归算法的时间复杂度

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

递归算法的时间复杂度

递归算法应该都不陌生,其实最开始遇见递归应该是在数学课上,类似于f(x)=f(x-1)+f(x+1),f(1)=1,f(2)=4,f(3)=3这种数学题大家应该见过不少,其实思想就是层层递归,最终将目标值用f(1),f(2),f(3)表示。

之前做了一个需求,需要实现类似操作系统文件夹的功能,我们用MySQL数据库记录数据,表字段有4列,分别是id,index_name,pid,is_directory,index_name记录文件或文件的名字,pid记录它的父级id,is_directory标记它是文件还是文件夹。

记录被存下以后,就涉及到取数据的问题了,我们前端需要的目标数据结构是这样的:

[{"id":1,"name":"./"},{"id":2,"name":"./1.txt"},
{"id":3,"name":"./dir1/"},
{"id":4,"name":"./dir1/2.txt"},...]

有点类似linux系统的tree命令。

第一版代码是这样的:

tree = []
def getTree(pid):
              return
for index in childIndexes:
 if len(tree) == 0:
   if index.is_directory==1                            tree.append(
{'id':index.id,'name':'./'+index.index_name+'/'})                     
getTree(index.id)
                     else:                            
tree.append(
{'id':index.id,'name':'/'+index.index_name})
              else: 
                    for item in tree:  
if item['id'] == index.id
                                   if item.is_directory==1:                                          tree.append({'id':index.id,'name': 
item['name']+index.index_name+'/'})    
                               else:  
                                        tree.append
(
{'id':index.id,'name':item['name']+index.index_name
}
)

大概看一下这个算法的时间复杂度,第一层的遍历时间复杂度是n,第二层遍历的时间复杂度是n,内层的时间复杂度是O(n^2),再加上递归,最后的时间复杂度是O(2^n*n^2),这个算法可见很粗糙,假如递归深度到是100,最后执行效率简直会让人头皮发麻。接下来我们考虑一下如何优化。

第二版代码:

tree = []
def getTree(pid,path='./'):
              return
       for index in childIndexes:
             if len(tree) == 0: 
                    if index.is_directory==1                            tree.append({'id':index.id,
'name':path+index.index_name+'/'}) 
                           getTree(index.id, 
path+index.index_name+'/')
                    else:
                           tree.append({'id':index.id,
'name':path+index.index_name}) 
             else: 
                    if item.is_directory==1:                            tree.append({'id':index.id,
'name':path+index.index_name+'/'})
                     else: 
                           tree.append({'id':index.id,
'name':path+index.index_name})

我们用变量保存每一次的path,这次我们看看时间复杂度是多少。第一层遍历时间复杂度是O(n),加上递归,最后的时间复杂度是O(2^n*n),不算太理想,最起码比第一次好点。

再看看一个面试的常见的题目,斐波拉契数列,n=1,1,3,5,8,13...,求第n位是多少?

一看首先就想到了递归的方式:

def fibSquence(n):     
  if n in (1,2):       
   return 
   fibSquence(n-1)+ fibSquence(n-2)

这个算法的时间复杂度是O(2^n),关于时间复杂度具体看调用次数便能明白。我们考虑一下如何优化,比如求n=3是,需要先求n=2,n=1,但是最开始n=1,n=2已经求过,多了两步重复计算。

下面是优化的代码:

fibMap = {1:1,2:2}
def fibSquence(n):
       else:
        result = fibSquence(n-1)+ fibSquence(n-2)              fibMap.update({n:result})
              return result

我们用map报存中间值,map是基于hash实现的,时间复杂度是O(1),这样这个算法的时间复杂度就是O(n)。

但是事实上这个问题大可不必用递归方式求解。

fibMap = {1:1,2:2}
def fibSquence(n):
       else:
              for i in range(3,n+1): 
                    fibMap.update({i:fibMap[i-1]+fibMap[i-2]})
              return fibMap[n]

这样我们只用一次遍历,便可以求出目标值。

递归算法的优化大概就是避免重复运算,将中金状态保存起来,以便下次使用,从结构上来看,是将时间复杂度转换为空间复杂度来解决。递归算法的效率其实是非常低的,能不用递归就尽量不用递归;当然了也要具体问题具体对待,比如说开始提到我做的项目遇到的问题,不用递归我还真想不出其他更好的方式解决。

作者:杨轶

来源:宜信技术学院

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

递归算法的时间复杂度

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

递归算法时间复杂度怎么算

递归算法的时间复杂度可以通过递归树来计算。递归树是一个树形结构,表示递归算法的执行过程。树的根节点表示原始问题,每个节点表示递归调用的一次子问题,叶子节点表示递归结束的情况。对于每个节点,我们需要计算它的时间复杂度。假设一个节点的问题规模为
2023-05-30

递归算法的时间复杂度是什么

递归算法的时间复杂度取决于递归的深度以及每次递归的时间复杂度。如果递归的深度为n,每次递归的时间复杂度为T,那么递归算法的时间复杂度可以表示为O(T^n)。需要注意的是,在一些情况下,递归算法的时间复杂度可能会被优化,例如使用记忆化递归(M
2023-08-28

关于递归算法的时间复杂度,你还不够了解

本篇通过一道面试题,一个面试场景,来好好分析一下如何求递归算法的时间复杂度。相信很多同学对递归算法的时间复杂度都很模糊,那么这篇Carl来给大家通透的讲一讲。
递归算法2024-12-03

C++ 递归函数的时间复杂度如何分析?

递归函数的时间复杂度分析涉及:识别基本情况和递归调用。计算基本情况和每次递归调用的时间复杂度。求和所有递归调用的时间复杂度。考虑函数调用次数与问题大小之间的关系。例如,阶乘函数的时间复杂度为 o(n),因为每次递归调用将递归深度增加 1,总
C++ 递归函数的时间复杂度如何分析?
2024-04-17

算法分类 ,时间复杂度 ,空间复杂度,优

今天给大家带来一篇关于算法排序的分类,算法的时间复杂度,空间复杂度,还有怎么去优化算法的文章,喜欢的话,可以关注,有什么问题,可以评论区提问,可以与我私信,有什么好的意见,欢迎提出.前言: 算法的复杂度分为时间复杂度与空间复杂度,时间复杂度
2023-01-30

算法必备知识:时间复杂度与空间复杂度的计算

我们今天要讲的内容:时间、空间复杂度分析。只要讲到数据结构与算法,就一定离不开时间、空间复杂度分析。复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半。这就就像内功心法,上乘武功还需搭配心法。

C++ 函数递归详解:递归的复杂度分析

递归是一种函数调用自身的过程。递归的时间复杂度可以通过计算递归调用次数来分析,例如阶乘函数为 o(n^2),斐波那契数列第 n 项的递归函数为 o(φ^n),其中 φ 是黄金比。C++ 函数递归详解:递归的复杂度分析什么是递归?递归是一
C++ 函数递归详解:递归的复杂度分析
2024-05-04

【算法】懂点算法(一)— 算法的时间空间复杂度

在本文中,笔者介绍了什么是算法、为什么要用算法、如何衡量算法的时间复杂度和空间复杂度以及算法的最坏情况和平均情况的概念。

C语言中算法的时间复杂度和空间复杂度是什么

这篇文章给大家分享的是有关C语言中算法的时间复杂度和空间复杂度是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.前言1.1 什么是数据结构?数据结构(Data Structure)是计算机存储、组织数据的方
2023-06-29

C++ 递归函数的空间复杂度如何分析?

c++++递归函数的空间复杂度取决于它在函数调用期间分配在栈上的数据大小。递归调用的深度决定了所需的栈空间,可分为:无终止条件:o(1)常量递归深度:o(n)对数递归深度:o(log n)C++ 递归函数的空间复杂度分析简介递归函数在
C++ 递归函数的空间复杂度如何分析?
2024-04-17

编程热搜

目录