当前位置: 首页 > news >正文

暑期数据结构 空间复杂度

3.空间复杂度
空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。


注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

我们直接上例题来讲解

void lystyle(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; i++){if (a[i - 1] > a[i]){swap(&a[i - 1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

首先我们要思考一下void lystyle(int*a;int n)这个函数声明中创建的a和n算不算到空间复杂度里面去,显然是不用的

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。(计算的是函数额外创建的变量个数)

这整个函数里面一共创建了三个变量分别是exchange,i,n占用的内存是不同的

因此创建变量是常数个,O(1)这个地方不知道为啥是O(1)可以看上一期的暑期数据结构 时间复杂度-CSDN博客

我们接下来看一个很有意思的事

但是为啥会导致这样呢?

原因在于我们使用函数时会开辟一片空间,函数结束时会将那片空间还给系统 ,但是下次另一个函数使用时开辟的那个空间还是原来函数的

那么还是上一期的函数(时间复杂度我会放到每日一题以一个数学专业的学生去讲解)

long long Fib(int N)
{if (N <= 3)return 1;return Fib(N - 1) + Fib(N - 2);
}

那么这个地方的空间复杂度是多少呢?

有人可能说是O(0)但是只有函数本身声明中的变量才不算入空间复杂度里面,但是递归产生的变量会被算到时间复杂度里面

那么还有人可能说和时间复杂度一样是O(N*N),因为我每递归一次就执行了一次语句

但是结果也不对

那么答案是多少呢?

答案是O(N)

这个地方递归执行是有顺序的

这个地方return Fib(N - 1) + Fib(N - 2);

要先计算Fib(N - 1)再计算Fib(N - 2);

要计算Fib(N - 1)就要先算Fib(N - 2)+Fib(N -3 )

递归是一步一步实现的,不遇到return 不停止我们以N=6来画一个计算的过程图

这个地方我们看箭头4和5,我们先执行函数Fib(3)使用完之后函数空间还给系统,但是执行Fib(4)本质上再开辟的那个空间还是和Fib(3)一样的

因此这个地方同一深度的函数的是同一片空间(深度从上到下看)

因此这个地方的空间复杂度就是O(N)(我么只看最左侧看它最深度有多深就行)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • GPT-4o mini模型:小型化AI解决方案的创新应用案例
  • LeetCode.27.移除元素
  • JVM(面试用)
  • Aigtek超声功率放大器在建筑结构检测中的应用
  • 企业需要了解的平滑替代FTP 的文件传输软件知识
  • 2.1 Python的语法特点
  • 尚硅谷谷粒商城项目笔记——八、安装node.js【电脑CPU:AMD】
  • CUDA是什么?工作原理是什么?
  • spring+SSM+Mybatis面试题(上)(30道)
  • 【北京仁爱堂】痉挛性斜颈的“清淡饮食”,不是让你只吃素,很多患者都误解了!
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • Pytorch 高效快速加载大规模数据集
  • 控制反转(IOC)与依赖注入(DI)模式解析及实践
  • IAP程序升级 与 电脑BIOS 的关系
  • hashmap底层原理(数据结构 put原理 get原理 remove原理)
  • Angular 响应式表单 基础例子
  • Apache Zeppelin在Apache Trafodion上的可视化
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Flannel解读
  • git 常用命令
  • Java编程基础24——递归练习
  • node-glob通配符
  • Object.assign方法不能实现深复制
  • PHP面试之三:MySQL数据库
  • Python连接Oracle
  • ReactNativeweexDeviceOne对比
  • Vultr 教程目录
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 开发基于以太坊智能合约的DApp
  • 理清楚Vue的结构
  • 十年未变!安全,谁之责?(下)
  • 使用 Docker 部署 Spring Boot项目
  • 微信支付JSAPI,实测!终极方案
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 阿里云ACE认证之理解CDN技术
  • 阿里云移动端播放器高级功能介绍
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #define
  • #pragma pack(1)
  • #pragma 指令
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (C++哈希表01)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (分类)KNN算法- 参数调优
  • (剑指Offer)面试题34:丑数
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (正则)提取页面里的img标签
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET IoC 容器(三)Autofac
  • .net 获取url的方法
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰