数据结构——复杂度讲解(2)

news2024/10/7 12:19:12

作者:几冬雪来

时间:2023年2月22日

内容:数据结构复杂度讲解

 

目录

前言: 

 复杂度讲解(2):

1.空间复杂度是什么: 

2.空间复杂度讲解: 

结尾: 


前言: 

在这之前我们写了一篇博客,内容是对我们的数据结构的复杂度进行了一个初步的讲解,并通过了几道题对我们的知识进行了巩固。但是我们的数据结构的复杂度讲解并没有就此结束,今天我们将对我们的数据结构的复杂度进行进一步的分析说明。

 复杂度讲解(2):

在我们上一篇的数据结构的讲解中,我们对我们复杂度中的时间复杂度进行了一个大致的说明,但是我们也说过,我们的时间复杂度只是我们算法效率的其中一个复杂度,因此今天我们将对另一个复杂度——空间复杂度进行讲解。 

1.空间复杂度是什么: 

在上一篇博客我们讲到,要衡量我们算法的效率可以从时间和空间两个维度进行讲解,时间复杂度是我们的代码大概运行的次数,那么我们的另一个维度,空间复杂度是什么呢?在我们的数据结构中,我们的空间复杂度也是一个数学表达式。它是对一个算法在运行过程中临时占用存储空间大小的量度

它在这里并不是计算我们的字节大小,而是计算变量的个数。 其次我们的空间复杂度的计算也是使用我们的大O的渐进表示法。它和我们时间复杂度的计算原理十分相似。

2.空间复杂度讲解: 

我们依旧写题进行举例,来计算我们的空间复杂度。就例如我们下面这个冒泡排序的空间复杂度的计算。

但是对于我们这个代码的空间复杂度出现了两种不一样的看法。 

有点人认为我们这里创造了3个临时变量,有人则认为我们这里的临时变量要更多,那是为什么呢? 首先是我们的最明显的三个临时变量,这个大家应该都是没有争议的。

到这里有人就下结论了,我们这里的变量的个数是一个常数,因此我们这里的空间复杂度应该被写为O(1)。但是有人就有不一样的看法,有人就看到了我们这个代码的参数,我们这里使用传址调用传递了我们一个数组的地址,而我们的数组中有n个值,所以我们这里的空间复杂度应该是O(N)

那么这里就引申了一个问题,在我们的这个冒泡排序中,到底有没有计算我们这个数组的空间

这里就要结合我们上面的定义,这里我们的数组并不是为了计算我们的数组所创建的,它是我们数据源的提供。因为我们要对我们的数组进行冒泡排序,所以我们才引进了这一个数组,所以我们这里数组的个数并未算入其中,所以我们这里就只创造了三个临时变量,我们的空间复杂度为O(1)

那么搞懂了这道题之后,接下来我们再写一道题。

这是我们的斐波那契函数,不同的是,这里我们并不是计算我们数组第n项的值,而是计算我们的前n项。 所以这里我们通过我们的malloc函数开辟了一块n+1大小的空间,而且这里我们的这块数组和我们的冒泡排序的题不一样,这里是为了计算我们的斐波那契前n项所额外开辟的一个数组,因此我们这个代码的空间复杂度是O(N)

通过这两个代码,其实我们可以看出我们的空间复杂度并没有时间复杂度那么复杂。

接下来我们再做几道题目来巩固一下知识。

在上面上面求出了冒泡排序和斐波那契函数的空间复杂度,那么接下来我们就再来求一求我们递归函数的空间复杂度。 

 

这里我们如果简单来看,我们这个函数并没有建立什么临时变量,因此我们的空间复杂度是O(1)。 但是其实这里我们运用到了递归的知识,而递归则要建立栈帧。而在这里,我们要建立N+1层栈帧

 

 这里我们就累计创建了N+1层栈帧,所以我们的空间复杂度是O(N)。这是为了运行我们的算法所而外开辟的空间。

 下来我们再看一道题。

这道题我们之前讲过它的时间复杂度,我们这个代码的时间复杂度是O(2^N)。 你瞒我瞒这个代码的空间复杂度也是O(2^N)吗?其实不是,我们这个代码的空间复杂度其实是O(N)。为什么?这里就涉及一个问题,递归调用是怎么样调用的?

这里我们斐波那契函数从N开始一开始我们调用的是N-1,接下来我们并不是调用同一行的N-2,我们是会继续往下执行,调用我们下方的N-2。 当我们最左边的斐波那契函数调用到不能再调用的时候我们就往回返回,接下来我们才继续往右边继续调用

 

而且在这里我们的第一次调用结束的Fib(2)和我们返回后再次向下调用的Fib(1)是同一块空间。 

 

这里就是我们的大概的运行过程。这里我们通过对比时间复杂度和空间复杂度也可以知道一个道理。

时间一去不复返,不可以重复利用

空间用了之后归还,可以重复利用 

到这里,除了一部分比较复杂的空间复杂度,我们的空间复杂度到这里就基本讲解完了。通过以上用例,我们可以看出对比起我们的时间维度,我们的空间维度的例题讲解就相对较少。但是从我们后面的两道题目的讲解来看,我们算法效率的空间复杂度并不是那么简单的。最后一题如果没有进行讲解的话,可能大部分人都会掉到坑里大多数人以为空间销毁就是指这块空间消失了,其实我们空间的销毁实际上可以理解为是将我们这块空间的使用权还给我们的操作系统

  

类似我们的这个代码,就能大概解释我们上面的两道题。 

 

在我们这里一开始我们就调用了F1,调用完了F1之后,我们这里没有后续的操作,那么我们这里的F1运行结束,结束完了之后我们的栈帧就要进行销毁,空间销毁可以说是我们把使用权还给操作系统。 接下来我们要调用F2,因为在F1调用之后,我们将这块空间还给了操作系统,所以在创建F2的时候,我们又要向操作系统申请空间。这里操作系统就会给我们开辟一块空间命名为F2,在F2中我们又定义一个变量为b,因为我们的a和b执行的指令和内容基本一致,因此我们这块空间又被取了一个b的名字,这就导致了我们这里a和b的地址是一样的

如果这里我们不想让它们共用同一块空间,和上面的代码不一样,在上面那个代码中,我们是调用完了F1之后再调用F2,而在这个代码中,我们是先调用F1,然后再在F1中调用F2,这是一种链式调用。

 

在我们第一种代码中的F1或者F2中多几个变量,也可能导致地址不一样。

结尾: 

这篇博客基本将我们的数据结构的时间复杂度和空间复杂度都讲解完了,但是这并不意味着我们的算法效率那部分内容到这里就彻彻底底的结束了,在我们后面学习其他内容又或者是写题的时候,有的时候我们或多或少也会再次接触到我们的时间和空间复杂度,这篇博客是我返校上课的第一篇博客,可能是我个人没有适应学校的这种环境,导致我感觉自己写的博客有点乱,后面我会调整一下自己,希望这篇博客对大家能有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/362889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度探讨】哪些领域将迎来区块链爆发性增长

发表时间:2022年12月6日 信息来源:bsvblockchain.org 如果我们不在日常业务和政府流程中采用区块链技术,就会浪费太多的技术价值和资金。这意味着未来几年,我们可能会看到区块链技术的快速落地,而有些国家已经为这种爆…

实验室设计建设方案主要内容

实验室设计建设整体解决方案SICOLAB需要综合考虑实验室的功能需求、空间布局、设备选型、安全防护、节能环保等多方面因素。以下是一个基本的实验室设计建设方案的流程:一、需求分析:了解实验室的使用目的、实验内容、使用人数、设备种类、实验标准等&am…

程序员赚钱指南,兼职社区招募

👨‍💻作者简介:大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享。 🎉专栏推荐:目前在写一个CV方向专栏,后期会更新不限于目…

正则表达式(Java)

定义 正则表达式(Regular Expression)是一种文本模式匹配的工具,可以用来搜索、替换或提取文本中的模式。它可以用来检查文本是否符合某种模式,或者从文本中提取出符合某种模式的部分 一般用法 未分组 public static void mai…

php+vue加油站会员服务系统 java微信小程序

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 3.2网站性能需求分析 10 3.3网站功能分析 10 3.4系统…

九龙证券|市场化转融资业务试点上线首日平稳运行

2月21日,中国证券金融股份有限公司(下称“中证金融”)商场化转融资事务试点迎来首个买卖日。全天该事务试点平稳运转,商场化转融资规模合计10亿元。 业内人士以为,商场化转融资事务形式下,证券公司参加转融…

Docker之路(2.Docker详细安装、使用阿里云镜像加速、卸载)

1.安装Docker 1.1 确定Linux环境系统信息 我这里使用的是阿里云的云服务器系统内核是3.10以上的 # 查看系统内核版本 uname -aLinux版本信息 # 查看系统版本信息 cat /etc/os-release1.2 安装 官方安装帮助文档 https://docs.docker.com/engine/install/centos/ 这块看文档…

【Redis】网络模型:Redis的IO多路复用

【Redis】网络模型:Redis的IO多路复用 文章目录【Redis】网络模型:Redis的IO多路复用一、用户空间和内核态空间二、IO模型1、阻塞IO2、非阻塞IO3、IO多路复用4、异步IO5、信号驱动IO六、对比三、IO多路复用1、IO多路复用-select方式2、IO多路复用模型-po…

opencv-StereoBM算法流程(二)

OpenCV BM对于处理非畸变的立体图像, 主要有以下 3 个步骤:1. 预处理滤波: 使图像亮度归一化并加强图像纹理2. 立体匹配: 沿着水平极线用 SAD 窗口进行匹配搜索3. 再滤波: 去除坏的匹配点.匹配之后, 如果左右视差检查使能了 disp12MaxDiff > 0, 还有使用cv::validateDispari…

【服务器数据恢复】raid5阵列2块硬盘先后离线的数据恢复案例

服务器数据恢复环境: 华为s系列服务器; 24块硬盘组成一组raid5磁盘阵列,其中包含1块热备盘。 服务器故障&检测: 服务器工作状态下raid5中有一块硬盘离线,热备盘激活替换离线硬盘并开始进行数据同步,在同…

(二十一)、实现评论功能(1)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1&#xff0c;评论回复模块的样式布局 1.1 在detail页面添加uview中的 Empty 内容为空组件 <!-- 评论区 --><view class"comment"><u-empty mode"comment" icon"http://cdn.uviewui.com/uview/empty/comment.png"></u-emp…

大厂面试官在校招面试中爱问啥?

如果你在简历中写了这句话&#xff0c;保证能拿到大厂面试机会&#xff1a;扎实的计算机基础&#xff0c;良好的数据结构与算法功底。 然后&#xff0c;你就会被问到头皮发麻。 虽然是段子&#xff0c;但也一定程度上说明了大厂非常注重计算机基础&#xff0c;也是真的喜欢问…

左耳听风——笔记四:分布式

左耳听风&#xff1a;分布式 分布式系统介绍 分布式系统和单体系统 使用分布式系统主要有两方面原因。 增大系统容量。我们的业务量越来越大&#xff0c;而要能应对越来越大的业务量&#xff0c;一台机器的性能已经无法满足了&#xff0c;我们需要多台机器才能应对大规模的…

【C语言进阶】指针进阶的详细讲解--(数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C语言进阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.字符指针&#xf…

stm32f407探索者开发板(二十)——独立看门狗实验

文章目录一、独立看门狗概述1.1 独立看门狗二、常用寄存器和库函数配置2.1 独立看门狗框图2.2 键值寄存器IWDG_KR2.3 预分频寄存器IWDG_PR2.4 重装载寄存器IWDG_RLR2.5 状态寄存器IWDG_SR2.6 IWDG独立看门狗操作库函数三、手写独立看门狗实验3.1 操作步骤3.2 iwdg.c3.3 iwdg.h3…

论文阅读-SegNeXt: 重新思考基于卷积注意力的语义分割

论文信息 论文名称&#xff1a;SegNeXt: Rethinking Convolutional Attention Design for Semantic Segmentation 项目GitHub&#xff1a; GitHub - Visual-Attention-Network/SegNeXt: Official Pytorch implementations for "SegNeXt: Rethinking Convolutional Atten…

知识点滴 - 自行车分类

旅行车 旅行自行车&#xff08;Touring bicycle&#xff09;由公路自行车发展而来&#xff0c;适合超远程自给自足的旅行&#xff0c;有较舒适放松的车架几何设计&#xff0c;能够负重&#xff0c;有很低的最低档位&#xff0c;配件选择方面追求可靠耐用。 专业的长途旅行车均以…

pytorch中padding应用总结

卷积操作作为卷积神经网络的核心模块&#xff0c;在其计算过程中必须考虑图像“边缘像素”的卷积方式。查阅资料发现&#xff0c;我们可以采用“卷积之前进行边界填充”或“卷积之后进行边界填充两种方式”&#xff0c;同时边界填充的具体手段包含常量填充、零填充、镜像填充以…

大数据处理学习笔记1.3 使用Scala集成开发环境

文章目录零、本讲学习目标一、搭建Scala的IntelliJ IDEA开发环境&#xff08;一&#xff09;启动IDEA&#xff08;二&#xff09;安装Scala插件&#xff08;三&#xff09;配置IDEA使用的默认JDK&#xff08;四&#xff09;创建Scala项目1、创建Scala项目 - ScalaDemo2、创建Sc…

求选择最少的区间数目可以覆盖连续区间 [0,n]:跳跃游戏,视频拼接,灌溉花园的最少水龙头数目

选择最少区间数目覆盖区间。 贪心方法 假设有一个人想过桥&#xff0c;0 和 n 分别是河的两岸&#xff0c;一开始&#xff0c;人在 0 给你一些小区间&#xff0c;我们把这些区间视作桥。一开始我们肯定要选择包含 0 的区间&#xff0c;且要保证尽可能走得远。假如我们已经走到…