算法空间复杂度详解

news/2024/11/29 1:50:12/

 

如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作的动力之源,让我们一起加油,一起奔跑,让我们顶峰相见!!!

前言

避免在处理大规模问题时出现效率低下,耗费较多资源,所以引入了算法复杂度,算法复杂度可以来衡量算法的效率和算法的可行性,可以帮助选择出最优的算法来解决问题;

空间复杂度的概念

空间复杂度也是一个数学表达式,是对一个算法在运行过程中额外临时占用存储空间大小的量度 。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定

实例(含分析)

所需知识:大O渐近表示法,如有不懂的请到前一篇文章《时间复杂度》内学习

例一: 计算BubbleSort的空间复杂度?

 分析:

该算法是一个排序的算法,所计算的空间复杂度的大小是为了排序所额外开辟的空间;

结果:

根据上面的分析,该算法开辟的空间有3个,是常数个,根据大O渐近表示法,

BubbleSort的空间复杂度为  O(1) 

例二:计算Fibonacci的空间复杂度?返回斐波那契数列的前n项

 

 分析:

 结果:

根据上面的分析,该算法开辟的空间有n+2个,根据大O渐近表示法

Fibonacci的空间复杂度为: O(N)

例三:

 分析:

结果:每次调用开辟常数个空间,即O(1) ;会调用N次;会开辟N个O(1), 所以根据大O渐近表示法,

阶乘递归Fac的空间复杂度为 :O(N)  ;

例四    计算斐波那契递归Fib的空间复杂度?

分析:首先理解一下时间和空间

时间:是一去不复返的,用了就没了,是累积的;

空间:计算机内给某个变量或则函数开辟的空间,用完之后是会还给操作系统的,然后会被分配给其他人使用;是可以重复利用的:

普通函数是一次调用,而递归是多次调用;

当计算Fib(N)时,并不是同时调用Fib(N-1)  与Fib(N-2)

而是会像上图红色的箭头所示调用;这里调用了N-1次,开辟了N-1次常数大小的空间,空间复杂度为:O(N);当调用完后,又会像上图蓝色箭头所示返回,返回过后,所开辟的栈帧就销毁了,例如上面的Fib(2)的值返回后,为Fib(2)所开辟的空间油还给操作系统了,还给操作系统的空间会继续调用其他的Fib,知道算法结束;

结果:

根据上述的分析:整个算法在执行的过程中,最大值开辟了N-2个常数大小的空间,而为该算法开辟大的这些空间,会重复利用,来实现该算法,所以该算法的空间复杂度为:O(N)

栈帧的复用的理解

如下代码及结果

void Func1()
{int a = 10;printf("%p\n",&a);
}
void Func2()
{int b = 20;printf("%p\n",&b);
}int main()
{Func1();Func2();return 0;
}

 分析:



http://www.ppmy.cn/news/979164.html

相关文章

jaeger+elasticsearch(cassandra ) 单机部署以及(400)报错

Jaeger 快速体验 官网下载地址 https://www.jaegertracing.io/download/ GitHub 下载地址 https://github.com/jaegertracing/jaeger/releases 下载二进制文件压缩包后,运行解压后的 all-in-one 文件即可。 jaeger-all-in-one 采用内存存储数据,专为…

STP生成树协议(第二十一课)

STP生成树协议(第二十一课) STP-生成树协议 1、为什么需要STP协议 1)局域网中容易出现的问题:单点故障和单链路故障,即:当某一条链路故障或某一台设备故障导致大面积主机网络中断 2)如果预防单点故障和单链路故障: 增加冗余/备份设备:预防单点故障 增加冗余/备份…

红外雨量计(光学雨量传感器)调试

红外雨量计(光学雨量传感器)调试 红外雨量计是一种用来测量雨量的传感器,它通过红外线的反射来检测雨滴的落下。为了调试红外雨量计,你需要参考以下步骤: 1. 确认传感器的电源接线正确。检查传感器的接线是否正确&…

继承中类的作用域

继承中类的作用域 Bulk_quote bulk; cout<<bulk.isbn();class Disc_quote : public Quote{public:std::pair<size_t,double> discount_policy() const{ return {quantity,discount};}//其他成员与之前版本一致 };Bulk_quote bulk; Bulk_quote *bulkP &bul…

计算机流水线在正常程序中的体现(效果可视)

众所周知,流水线技术对于软件开发人员不是可见的(visiable),毕竟已经在在机器语言之下,是组成机器语言的基本逻辑 但今天我就带领大家看看我新发现的结果,那就是流水线的可视效果,包括流水线预测技术的侧面体现,当然也是可见的 首先我先声明一下需要的基础,需要懂16位以及32位操…

JavaScript学习 -- Base64编码

Base64编码是一种常用的将二进制数据转换为文本数据的方式。在JavaScript中&#xff0c;我们可以通过使用Base64编码算法&#xff0c;将二进制数据转换为可读的文本数据&#xff0c;以便于在网络传输、文件传输等场景下使用。在本篇博客中&#xff0c;我们将介绍Base64编码的基…

vue全局字体不生效的问题

今天接手了一个新项目&#xff0c;在熟悉项目的时候&#xff0c;意外发现&#xff0c;网站的字体和设计稿上的字体不一样。 于是查看一番之后&#xff0c;发现引入字体的方式错了。 原代码是这样的&#xff1a; body {font-family: HONORSansCN-DemiBold, HONORSansCN;font-…

如何轻松获取短视频资源?

短视频里面的素材其实主要包含三大部分&#xff1a; 拍摄的原创素材&#xff1a;比如情节剧、风景视频、知识百科、热门解说、便装、美妆、vlog等视频需要使用的素材 二次创作的素材&#xff1a;比如影视剪辑视频、鬼畜视频、文史解说等内容需要使用的素材 特效素材&#xf…