相信很多小伙伴刷题的时候面对力扣上近两千道题目,感觉无从下手,我花费半年时间整理了Github项目:leetcode刷题攻略。 里面有200道经典算法题目刷题顺序、配有60w字的详细图解,常用算法模板总结,以及难点视频讲解,按照list一道一道刷就可以了!star支持一波吧!

关于算法的性能分析,之前已经讲解过这几篇:

  • 关于时间复杂度,你不知道的都在这里!
  • O(n)的算法居然超时了,此时的n究竟是多大?
  • 通过一道面试题目,讲一讲递归算法的时间复杂度!

那么一直还没有讲空间复杂度,所以打算陆续来补上,内容不难,大家可以读一遍文章就有整体的了解了。

什么是空间复杂度呢?

是对一个算法在运行过程中占用内存空间大小的量度,记做S(n)=O(f(n)。

空间复杂度(Space Complexity)记作S(n) 依然使用大O来表示。利用程序的空间复杂度,可以对程序运行中需要多少内存有个预先估计。

关注空间复杂度有两个常见的相关问题

  1. 空间复杂度是考虑程序(可执行文件)的大小么?

很多同学都会混淆程序运行时内存大小和程序本身的大小。这里强调一下空间复杂度是考虑程序运行时占用内存的大小,而不是可执行文件的大小。

  1. 空间复杂度是准确算出程序运行时所占用的内存么?

不要以为空间复杂度就已经精准的掌握了程序的内存使用大小,很有多因素会影响程序真正内存使用大小,例如编译器的内存对齐,编程语言容器的底层实现等等这些都会影响到程序内存的开销。

所以空间复杂度是预先大体评估程序内存使用的大小。

说到空间复杂度,我想同学们在OJ(online judge)上应该遇到过这种错误,就是超出内存限制,一般OJ对程序运行时的所消耗的内存都有一个限制。

为了避免内存超出限制,这也需要我们对算法占用多大的内存有一个大体的预估。

同样在工程实践中,计算机的内存空间也不是无限的,需要工程师对软件运行时所使用的内存有一个大体评估,这都需要用到算法空间复杂度的分析。

来看一下例子,什么时候的空间复杂度是O(1)呢,C++代码如下:

int j = 0;
for (int i = 0; i < n; i++) {j++;
}

第一段代码可以看出,随着n的变化,所需开辟的内存空间并不会随着n的变化而变化。即此算法空间复杂度为一个常量,所以表示为大 O(1)。

什么时候的空间复杂度是O(n)?

当消耗空间和输入参数n保持线性增长,这样的空间复杂度为O(n),来看一下这段C++代码

int* a = new int(n);
for (int i = 0; i < n; i++) {a[i] = i;
}

我们定义了一个数组出来,这个数组占用的大小为n,虽然有一个for循环,但没有再分配新的空间,因此,这段代码的空间复杂度主要看第一行即可,随着n的增大,开辟的内存大小呈线性增长,即 O(n)。

其他的 O(n^2), O(n^3) 我想大家应该都可以以此例举出来了,那么思考一下 什么时候空间复杂度是 O(logn)呢?

空间复杂度是logn的情况确实有些特殊,其实是在递归的时候,会出现空间复杂度为logn的情况

至于如何求递归的空间复杂度,我会在专门写一篇文章来介绍的,敬请期待!

我是程序员Carl,可以找我组队刷题,「代码随想录」目前正在循序渐进讲解算法,目前已经讲到了动态规划,点击这里和上万录友一起打卡学习!

可以在B站上关注我的视频

B站上找我

另外我已经将「代码随想录」的算法文章按照由浅入深的刷题顺序编排起来,整理成册,陆续整理出PDF版本了

先上图:

赶紧去下载看看,你会发现相见恨晚!

关于空间复杂度,你可能有几个疑问?相关推荐

  1. C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)

    排序算法分类 内部排序算法又分为基于比较的排序算法和不基于比较的排序算法,其分类如下: 比较排序:   直接插入排序    希尔排序 (插入)  冒泡排序     快速排序  (交换) 直接选择排序  ...

  2. 排序算法时间复杂度、空间复杂度、稳定性比较

    排序算法分类 排序算法比较表格填空 排序算法 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定 冒泡排序 :-----: :-–: :-–: :-–: 选择排序 :-----: :-–: :-–: ...

  3. python排序算法的时间复杂度_Python算法的时间复杂度和空间复杂度(实例解析)

    算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...

  4. 【数据结构入门】算法的时间复杂度和空间复杂度详解

    文章目录 (1)算法效率 (2)时间复杂度的计算 1)什么是时间复杂度 2)大O渐进表示法(估算) 3)时间复杂度计算实例 4)总结 5)一些思考 (3)空间复杂度的计算 (4)常见复杂度对比 本篇前 ...

  5. Bee常见疑问收集(V1.9.8)

    Bee常见疑问收集: 原文地址: FAQ_CN.md · automvc/bee - Gitee.com Bee常见疑问收集: Q: Bee支持几种数据库? A: MySQL,MariaDB,Orac ...

  6. 数据结构(02)— 时间复杂度与空间复杂度转换

    1. 时间复杂度转化为空间复杂度 常用的降低时间复杂度的方法有递归.二分法.排序算法.动态规划等,降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构. ​ ...

  7. 算法的时间与空间复杂度详解

    算法(Algorithm)是指用来操作数据.解决程序问题的一组方法.对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别. 那么我们应该如何去衡量不同 ...

  8. 读阮一峰对《javascript语言精粹》的笔记,我有疑问。

    <javascript语言精粹>是一本很棒的书籍,其中作者在附录列出了12种他所认为的javascript语言中的糟粕. 我最近开始跟读前端前辈的博客,其中读到了阮一峰的<12种不宜 ...

  9. Java数组合并,完成排序,从时间复杂度,和空间复杂度考虑

    2019独角兽企业重金招聘Python工程师标准>>> 提供方法,直接调用,支持任意个数组的合并成一个数组,并且完成排序,每个数组元素个数不定.需要提供两个方法,分别做到时间复杂度最 ...

  10. 有关包络Spectral Envelope的疑问

    在有关MFCC的许多文章中,很多都是引用国外一篇PPT的. 这篇地址在这里 其中有关于Spectral Envelope(包络)的理解我一直有一些疑问. 疑问 为什么有如下假定? Spectrum = ...

最新文章

  1. TI BLE协议栈 按键流程分析
  2. Java Management extentsions(jmx)与tomcat
  3. python中cgi到底是什么_十分钟搞懂什么是CGI(转)
  4. linux crontab工作日志,linux使用crontab执行定时任务
  5. Java 将excel中的内容导入数据库中
  6. #10010 「一本通 1.1 练习 6」糖果传递 (数学+贪心)
  7. Java的挥发性修饰符
  8. 10-排序6 Sort with Swap(0, i) (25 分)
  9. 草稿 前端开发 代码的编写习惯 缩进的意义 HTML的格式
  10. .NET Core 3.0 RC1 发布,最终版本将于下周发布
  11. 学习环境搭建:UDK2017 下载以及编译
  12. 怎么提高文公写作水平?公文写作礼仪类模板(1)
  13. c语言中的各种“零”
  14. excel 一列的数据除以另一列
  15. CVE-2021-1647 Windows Defender缓冲区溢出导致的任意代码执行漏洞复现
  16. oracle 连接查询(内、外连接、自连接、子查询)
  17. C#使用随机数模拟器来模拟世界杯排名(一)
  18. 使用联通云OSS小程序直传
  19. 网络状态显示小地球不要慌!
  20. java学习第6天,今天是循环结构

热门文章

  1. ubuntu16.04 jdk安装及环境配置
  2. MFC 单文档应用程序 dialog 变量传递
  3. 似然(Likelihood)
  4. ROS-Academy-for-Beginners之ORB-SLAM2 双目视觉初探
  5. windows server 2008 r2 安装
  6. 快速排序(java版)
  7. Chrome浏览器扩展开发系列之十五:跨域访问的XMLHttpRequest对象
  8. SameMovie HBOMax Video Downloader for Mac如何在 Mac 上下载 HBO Max 视频?
  9. VoosteQ Material Comp for Mac - 尖端音频压缩器
  10. Arturia系列合成器插件大合集:Arturia V Collection 8 for mac