递归 - 空间复杂度 

在本文中, 我们将讨论如何分析递归算法的空间复杂度.
在计算递归算法的空间复杂度时,最需要考虑的两个部分就是: 递归相关空间 (recursion related space)和非递归相关空间(non-recursion related space).

递归相关空间


递归相关空间指的是递归直接产生的内存开销,也就是在递归调用过程中开辟的堆栈内存空间。为了完成一个典型的函数调用,系统中在开辟内存空间时,会存放一下3个重要的数据信息:
  1. 调用函数的返回地址. 一旦程序调用结束,需要这个地址返回, 即程序调用结束进行下一步的地址;
  2. 该调用函数所需要的参数;
  3. 调用函数的内部变量.
尽管堆栈是在递归调用时产生的最小消耗. 旦只要调用过程结束,这些空间也会被释放掉。 
对于递归算法,函数的调用将会持续产生调用链,直至调用到基本型 (base case) (亦称作. bottom case).这意味着每个函数的调用也是逐步累积的.
对于递归算法, 如果没有其他的内存消耗, 这个算法的空间上限就是该递归调用直接产生的内存开销。
还是拿练习 printReverse说事,我们每次调用只是打印了一个字符,所以在递归调用之外我们没有用掉其他的内存开销, .对于每一次的递归调用, 假设需要一个固定常量的空间. 那么根据前面的分析,他会调用 n 次函数链,  n 就是输入的字串长度. 所以该算法的空间复杂度即为 {\mathcal{O}(n)}O(n).
为了更好地说明, 对于递归调用序列 f(x1) -> f(x2) -> f(x3) 的执行步骤序列以及堆栈的布局如下图所示:
 f(x1) 将会被分配一定额外的空间以便调用f(x2). 对于 f(x2)调用f(x3).时候的内存操作也是同样类型的情况,直到 f(x3),的调用到达了基本型, 当到达 f(x3).时,不在分配额外空间。
这种调用机制导致有时分配给堆栈的空间有时超出内存限制,会导致一种程序崩溃的情况,叫做栈溢出(stack overflow),所以当设计采用这种递归调用机制的程序时,首要考虑的就是输入量是否会导致溢出情况的发生。
 

非递归相关空间


显而易见, 所谓非递归相关空间即与递归调用链过程中不直接相关的内存开销, 比如为全局变量所分配的空间(一般情况下都存放在堆heap中).
不论是否是递归程序,在执行下一个子程序之前总需要一个全局变量来存放输入的数据。  同样对于调用函数的返回值也需要开辟空间来存放.后者的一种情况就是我们前面讨论过的 记忆化 处理方式. 例如在处理斐波那契额数列的记忆化递归算法中, 我们使用一个map来存储每次递归调用返回的结果值. 因此, 在计算该算法的空间复杂度的时候, 我们同时也需要考虑记忆化操作所带来的空间成本.  
 
 
 
 
 
 
 
 
 
 

LeetCode递归 -2(Recursion) 培训专题 讲解文章翻译 (附链接) (2019-04-09 15:50)的更多相关文章

  1. LeetCode 递归(Recursion) 培训专题 讲解文章翻译 (附链接)

     递归 - 时间复杂度 在本文中, 我们主要介绍如何分析递归算法程序中的时间复杂度.. 在一个递归程序中, 它的时间复杂度 O(T) 一般来说就是他总共递归调用的次数 (定义为 R) 以及每次调用时所 ...

  2. Activity Process Task Application 专题讲解

    Activity Process Task Application 专题讲解 Activity.和进程 为了阅读方便,将文档转成pdf http://files.cnblogs.com/franksu ...

  3. 程序员的算法课(3)-递归(recursion)算法

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  4. Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences)

    Leetcode之深度优先搜索&回溯专题-491. 递增子序列(Increasing Subsequences) 深度优先搜索的解题详细介绍,点击 给定一个整型数组, 你的任务是找到所有该数组 ...

  5. Leetcode之深度优先搜索&回溯专题-980. 不同路径 III(Unique Paths III)

    Leetcode之深度优先搜索&回溯专题-980. 不同路径 III(Unique Paths III) 深度优先搜索的解题详细介绍,点击 在二维网格 grid 上,有 4 种类型的方格: 1 ...

  6. Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game)

    Leetcode之深度优先搜索&回溯专题-679. 24 点游戏(24 Game) 深度优先搜索的解题详细介绍,点击 你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+, ...

  7. Leetcode之深度优先搜索&回溯专题-638. 大礼包(Shopping Offers)

    Leetcode之深度优先搜索&回溯专题-638. 大礼包(Shopping Offers) 深度优先搜索的解题详细介绍,点击 在LeetCode商店中, 有许多在售的物品. 然而,也有一些大 ...

  8. Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands)

    Leetcode之并查集专题-765. 情侣牵手(Couples Holding Hands) N 对情侣坐在连续排列的 2N 个座位上,想要牵到对方的手. 计算最少交换座位的次数,以便每对情侣可以并 ...

  9. Leetcode之并查集专题-684. 冗余连接(Redundant Connection)

    Leetcode之并查集专题-684. 冗余连接(Redundant Connection) 在本问题中, 树指的是一个连通且无环的无向图. 输入一个图,该图由一个有着N个节点 (节点值不重复1, 2 ...

随机推荐

  1. Inno Setup入门(十二)——Pascal脚本(1)

    事件函数(1) Inno Setup支持以下函数和过程. function InitializeSetup(): Boolean; 该函数在安装程序初始化时调用,返回False 将中断安装,True则 ...

  2. 【mybatis】mybatis 中update 更新操作,null字段不更新,有值才更新

    示例代码如下: <update id="updateGoodsConfigQuery" parameterType="com.pisen.cloud.luna.ms ...

  3. GNURADIO简单运用

    本文是关于 RF hacking..所以这个就此不表…还是让我们来看看关键的无线解锁器吧..通常我们 hacking 一个无线设备的第一步就是找到目标的工作频率. 我们可以通过每个无线设备自带的FCC ...

  4. [Python爬虫] 之二十三:Selenium +phantomjs 利用 pyquery抓取智能电视网数据

    一.介绍 本例子用Selenium +phantomjs爬取智能电视网(http://news.znds.com/article/news/)的资讯信息,输入给定关键字抓取资讯信息. 给定关键字:数字 ...

  5. 【Swift】学习笔记(三)——字符和字符串

    基本了解了变量的创建和基础数据类型,但是在开发中用得最多的还是字符串.那什么是字符串呢? Swift 的String类型表示特定序列的Character(字符) 类型值的集合,它是值类型具有可变性 S ...

  6. Unity学习笔记 之 关于 Unity UI 的 Slider 的代码记录

    代码例如以下: using UnityEngine; using System.Collections; //1.引入 UI . using UnityEngine.UI; public class ...

  7. HDU - 3038 How Many Answers Are Wrong (带权并查集)

    题意:n个数,m次询问,每次问区间a到b之间的和为s,问有几次冲突 思路:带权并查集的应用.[a, b]和为s,所以a-1与b就能够确定一次关系.通过计算与根的距离能够推断出询问的正确性 #inclu ...

  8. LIME:模型预測结果是否值得信任?

    花了一天时间对LIME论文:http://arxiv.org/pdf/1602.04938v1.pdf 细致阅读和代码阅读,实验.大体理解了作者的设计思路. 背景: 我们在建立模型的时候,常常会思考我 ...

  9. Eclipse githup

    1:选择对应eclipse版本的githup组件版本,详见网址: http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of ...

  10. 解决window10系统电脑插入耳机之后没有声音的问题

    其实办法也是从百度百科上查到的 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄     可能是因为自己某个不小心的操作更改了设置 1. 首先要点开设置按钮,在搜索栏输入控制面板 (当然知道控制面板在哪里的小伙伴就不用 ...