广告
返回顶部
首页 > 资讯 > 数据库 >递归算法的时间复杂度
  • 512
分享到

递归算法的时间复杂度

2024-04-02 19:04:59 512人浏览 泡泡鱼
摘要

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

递归算法应该都不陌生,其实最开始遇见递归应该是在数学课上,类似于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]

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

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

作者:杨轶

来源:宜信技术学院

您可能感兴趣的文档:

--结束END--

本文标题: 递归算法的时间复杂度

本文链接: https://www.lsjlt.com/news/42897.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 递归算法的时间复杂度
    递归算法应该都不陌生,其实最开始遇见递归应该是在数学课上,类似于f(x)=f(x-1)+f(x+1),f(1)=1,f(2)=4,f(3)=3这种数学题大家应该见过不少,其实思想就是层层递归,最终将目标值用...
    99+
    2022-10-18
  • 递归算法时间复杂度怎么算
    递归算法的时间复杂度可以通过递归树来计算。递归树是一个树形结构,表示递归算法的执行过程。树的根节点表示原始问题,每个节点表示递归调用...
    99+
    2023-05-30
    递归算法时间复杂度 递归算法
  • 递归算法的时间复杂度是什么
    递归算法的时间复杂度取决于递归的深度以及每次递归的时间复杂度。如果递归的深度为n,每次递归的时间复杂度为T,那么递归算法的时间复杂度...
    99+
    2023-08-28
    递归算法
  • Python递归时间复杂度
    目录思路一:for循环思路二:递归递归也是常见算法之一,其时间复杂度一般认为O(logn),但递归算法的时间复杂度本质上是要看: 递归的次数 * 每次递归中的操作次数 举例面试题:求...
    99+
    2022-11-13
  • 算法分类 ,时间复杂度 ,空间复杂度,优
        今天给大家带来一篇关于算法排序的分类,算法的时间复杂度,空间复杂度,还有怎么去优化算法的文章,喜欢的话,可以关注,有什么问题,可以评论区提问,可以与我私信,有什么好的意见,欢迎提出. 前言: 算法的复杂度分为时间复杂度与空间复杂...
    99+
    2023-01-30
    复杂度 算法 时间
  • C语言算法的时间复杂度和空间复杂度
    目录1.算法效率1.1 如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例 3.空间复杂度4...
    99+
    2022-11-13
  • 数据结构--算法的时间复杂度和空间复杂度
    文章目录 算法效率时间复杂度时间复杂度的概念大O的渐进表示法计算实例 时间复杂度实例 常见复杂度对比例题 算法效率 算法效率是指算法在计算机上运行时所消耗的时间和资源。这是衡量算法...
    99+
    2023-09-08
    算法 数据结构 时间效率 复杂度
  • web算法的时间复杂度和空间复杂度是什么
    这篇文章主要介绍了web算法的时间复杂度和空间复杂度是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web算法的时间复杂度和空间复杂度是什么文章都会有所收获,下面我们一起来...
    99+
    2022-10-19
  • Java算法之时间复杂度和空间复杂度的概念和计算
    目录一、算法效率二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3 时间复杂度的三种情况2.4 常见时间复杂度计算举例2.4.1 例子2.4.2 冒泡排序时间复杂度...
    99+
    2022-11-12
  • 数据结构与算法—时间复杂度和空间复杂度
    目录 1. 什么是数据结构? 2.什么是算法? 3、算法的复杂度 4、时间复杂度 (1) 时间复杂度的概念:  (2) 大O的渐进表示法:  六个例题: (3) 时间复杂度对比:  两个例题:  OJ题分析时间复杂度 5、空间复杂度 (1...
    99+
    2023-10-24
    数据结构
  • 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)
    文章目录 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)1、(直接)插入排序1.1、算法思想1.2、排序过程图解1.3、排序代码 2、希尔排序3、冒泡排序3.1、算法思想3.2、排...
    99+
    2023-10-19
    算法 排序算法 c语言 c++
  • C语言中算法的时间复杂度和空间复杂度是什么
    这篇文章给大家分享的是有关C语言中算法的时间复杂度和空间复杂度是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.前言1.1 什么是数据结构?数据结构(Data Structure)是计算机存储、组织数据的方...
    99+
    2023-06-29
  • 如何理解算法时间复杂度
    这篇文章主要讲解了“如何理解算法时间复杂度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解算法时间复杂度”吧!我们可以用下面的表达式来表示:通常主要有...
    99+
    2022-10-19
  • C语言 超详细讲解算法的时间复杂度和空间复杂度
    目录1.前言1.1 什么是数据结构?1.2 什么是算法?2.算法效率2.1 如何衡量一个算法的好坏2.2 算法的复杂度2.3 复杂度在校招中的考察3.时间复杂度3.1 时间复杂度的概...
    99+
    2022-11-13
  • Java如何分析算法的时间和空间复杂度
    目录计算复杂性算法的复杂性恒定复杂性–O(1)对数复杂性–O(Log N)线性复杂度–O(N)N Log N复杂性–O(N Log N...
    99+
    2022-11-13
  • Java数据结构与算法系列精讲之时间复杂度与空间复杂度
    目录概述算法的衡量标准时间复杂度最优时间复杂度平均时间复杂度最坏时间复杂度O(1)O(n)O(n^2)O(logN)空间复杂度O(1)O(n)概述 从今天开始, 小白我将带大家开启 ...
    99+
    2022-11-13
  • Java时间复杂度、空间复杂度的深入详解
    目录算法效率时间复杂度什么是时间复杂度推导大 O 阶的方法算法情况计算冒泡排序的时间复杂度计算二分查找的时间复杂度计算阶乘递归的时间复杂度计算斐波那契递归的时间复杂度空间复杂度计算冒...
    99+
    2022-11-12
  • ASP编程算法面试:如何优化算法的时间复杂度?
    在 ASP 编程中,算法是至关重要的。它们可以帮助我们解决各种问题,从字符串匹配到图形渲染。不过,好的算法不仅需要正确性,还需要高效性。在这篇文章中,我们将探讨如何优化 ASP 编程算法的时间复杂度。 什么是时间复杂度? 在开始讨论优化算...
    99+
    2023-09-28
    编程算法 面试 path
  • Java 关于时间复杂度和空间复杂度的深度刨析
    目录1.算法效率2.时间复杂度2.1时间复杂度的概念2.2大O的渐进表示法2.3常见时间复杂度计算2.3.1常用的时间复杂度量级2.3.2常见示例举例2.3.2示例答案及分析3.空间...
    99+
    2022-11-12
  • C语言数据结构之算法的时间复杂度
    目录1、算法的复杂度2、时间复杂度2.1 时间复杂度的定义2.2 大O的渐进表示法3、常见时间复杂度计算举例3.1 冒泡排序的时间复杂度3.2 二分查找的时间复杂度3.3 阶乘(递归...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作