0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

算法之空间复杂度

C语言编程学习基地 来源:51CTO 作者:慕雪年华 2022-08-31 10:29 次阅读

算法之空间复杂度:衡量一个算法运行需要开辟的额外空间

上次我们学习了时间复杂度,那么我们今天就来看看空间复杂度!

d790ab62-2840-11ed-ba43-dac502259ad0.png

概念

空间复杂度是对一个算法在运行过程中临时占用空间大小的度量

和时间复杂度不是真的计算时间一样,空间复杂度也不衡量算法具体占用的内存字节数。

空间复杂度计算的是额外开辟的变量的个数,适用大O渐近法

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

空间复杂度计算

NO.1 冒泡排序

voidBubbleSort(int*a,intn){     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;     }}

我们会发现,冒泡排序算法并没有额外定义非常多的变量,一共只有3个,属于常数阶

size_t end = n;int exchange = 0;size_t i = 1;

其空间复杂度为O(1)

计算时注意其与N的关系

当我们在算法中开辟空间,计算空间复杂度的时候,要注意开辟的这个空间与N有没有关系

int arr[N];//c99变长数组,和传过来的参数有关int*a=(int*)malloc(sizeof(int)*N);//和传过来的参数有关,O(N)int* a=(int*)malloc(sizeof(int)*3);//和传过来的参数无关,O(1)

NO.2 斐波那契数列

// 计算Fibonacci的空间复杂度?// 返回斐波那契数列的前n项long long* Fibonacci(size_t n){     if(n==0)     return NULL;
     long long * fibArray = (long long *)malloc((n+1) * sizeof(long long));     fibArray[0] = 0;     fibArray[1] = 1;     for (int i = 2; i <= n ; ++i)     {      fibArray[i] = fibArray[i - 1] + fibArray [i - 2];     }     return fibArray;}

和上面的斐波那契数列的递归代码不同,这里我们新创建了一个数组,用来保存计算出来的斐波那契数

一共malloc了n+1个长整型的空间,空间复杂度是O(N)

空间重复使用问题

如果是递归方法的斐波那契算法,其空间复杂度是多少呢?

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

答案也是O(N)

因为对于递归算法而言,其开辟的函数栈帧空间是可以重复利用的!

如fib(8)的调用,其开辟的函数栈帧,是可以在后续继续调用fib函数时重复使用的

d7abb4a2-2840-11ed-ba43-dac502259ad0.png

上图中f1和f2是两个函数,但执行了相同的功能。其函数调用的空间实际上是一个,f2在f1销毁后继承了它的空间

这就好比每一次新的递归都会开一家新的饭店,但是你下次还想吃东北菜的时候,可以去之前开的东北菜馆,咱没必要让别人再开一家馆子不是嘛?

不过由于斐波那契数的递归算法会递归非常多次,在数字很大的时候,会导致栈溢出

d7b9667e-2840-11ed-ba43-dac502259ad0.png

NO.3 阶乘

long long Fac(size_t N){     if(N == 0)      return 1;
     return Fac(N-1)*N;}

虽然函数本身的空间不计入时间复杂度,这里计算的是递归调用时额外开辟的函数栈帧空间

一共调用了N-1次,每个栈帧使用了常数个空间,空间复杂度是O(N)

常见复杂度对比

d7d42522-2840-11ed-ba43-dac502259ad0.png

d8a345d2-2840-11ed-ba43-dac502259ad0.png

结语

时间复杂度和空间复杂度可以帮我们很好的了解自己所写算法的好坏,在未来面试的时候,HR肯定也更喜欢效率高的算法

要多刷题,好好积累自己的能力,想必之后写出好算法也是水到渠成(吧?)

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4607

    浏览量

    92820
  • 计算
    +关注

    关注

    2

    文章

    449

    浏览量

    38782
  • 复杂度
    +关注

    关注

    0

    文章

    8

    浏览量

    7901

原文标题:【算法】几分钟时间让你彻底学会—空间复杂度!

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于纹理复杂度的快速帧内预测算法

    【正文快照】:0引言帧内编码利用相邻像素块之间的相关[1]来减少视频图像的空间冗余,提高了编码效率。但是在H.264/AVC的帧内预测采用全搜索算法中,为了确定一个宏块的最优预测模式,要遍历色度块和亮度块的17种预测模式,计算
    发表于 05-06 09:01

    时间复杂度是指什么

    原理->微机原理->软件工程,编译原理,数据库数据结构1.时间复杂度时间复杂度是指执行算法所需要的计算工作量,因为整个算法的执行时间与基本操作重复执行的...
    发表于 07-22 10:01

    各种排序算法的时间空间复杂度、稳定性

    各种排序算法的时间空间复杂度、稳定性一、排序算法分类:二、排序算法比较:注:1、归并排序可以通过手摇算法
    发表于 12-21 07:48

    LDPC码低复杂度译码算法研究

    在描述置信传播(BP)译码算法基础上, 研究和分析了两种降低复杂度的译码算法。Min.Sum 算法主要讨论了简化校验节点的消息更新运算,并应用密度进化方法对此
    发表于 03-31 15:22 7次下载
    LDPC码低<b class='flag-5'>复杂度</b>译码<b class='flag-5'>算法</b>研究

    图像复杂度对信息隐藏性能影响分析

    算法进行实验,研究图像的复杂度差异对信息隐藏性能的影响。实验结果表明了所提复杂度评价方法的有效性以及复杂度分类的合理性,依据图像复杂度准则对
    发表于 11-14 09:57 5次下载

    虚拟MIMO中低复杂度功率分配算法

    一种基于线性注水原理的低复杂度功率分配算法。该算法通过快速排除信道条件较差的协作用户,并利用各协作用户功率值之间的线性递推关系式,将最优功率分配算法中的迭代运算转化为线性运算,在实现功
    发表于 03-09 15:22 1次下载
    虚拟MIMO中低<b class='flag-5'>复杂度</b>功率分配<b class='flag-5'>算法</b>

    算法是什么?python的时间,空间复杂度和常用算法实例说明免费下载

    一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可
    发表于 09-29 08:00 3次下载
    <b class='flag-5'>算法</b>是什么?python的时间,<b class='flag-5'>空间</b><b class='flag-5'>复杂度</b>和常用<b class='flag-5'>算法</b>实例说明免费下载

    如何求递归算法的时间复杂度

    那么我通过一道简单的面试题,模拟面试的场景,来带大家逐步分析递归算法的时间复杂度,最后找出最优解,来看看同样是递归,怎么就写成了O(n)的代码。
    的头像 发表于 07-13 11:30 2256次阅读

    如何求递归算法的时间复杂度

    相信很多同学对递归算法的时间复杂度都很模糊,那么这篇Carl来给大家通透的讲一讲。
    的头像 发表于 07-13 11:33 1601次阅读

    常见机器学习算法的计算复杂度

    时间复杂度不是测量一个算法或一段代码在某个机器或者条件下运行所花费的时间。时间复杂度一般指时间复杂性,时间复杂度是一个函数,它定性描述该
    发表于 10-02 12:45 812次阅读

    算法时空复杂度分析实用指南1

    我以前的文章主要都是讲解算法的原理和解题的思维,对时间复杂度空间复杂度的分析经常一笔带过,主要是基于以下两个原因:
    的头像 发表于 04-12 14:37 509次阅读
    <b class='flag-5'>算法</b>时空<b class='flag-5'>复杂度</b>分析实用指南1

    算法时空复杂度分析实用指南2

    类似的,想想之前说的数据结构扩容的场景,也许`N`次操作中的某一次操作恰好触发了扩容,导致时间复杂度提高,但总的时间复杂度依然保持在`O(N)`,所以均摊到每一次操作上,其平均时间复杂度依然是`O(1)`。
    的头像 发表于 04-12 14:38 527次阅读
    <b class='flag-5'>算法</b>时空<b class='flag-5'>复杂度</b>分析实用指南2

    算法时空复杂度分析实用指南(上)

    本文会篇幅较长,会涵盖如下几点: 1、Big O 表示法的几个基本特点。 2、非递归算法中的时间复杂度分析。 3、数据结构 API 的效率衡量方法(摊还分析)。 4、递归算法的时间/
    的头像 发表于 04-19 10:34 810次阅读
    <b class='flag-5'>算法</b>时空<b class='flag-5'>复杂度</b>分析实用指南(上)

    算法时空复杂度分析实用指南(下)

    Big O 表示法的几个基本特点。 2、非递归算法中的时间复杂度分析。 3、数据结构 API 的效率衡量方法(摊还分析)。 4、递归算法的时间/空间
    的头像 发表于 04-19 10:35 686次阅读
    <b class='flag-5'>算法</b>时空<b class='flag-5'>复杂度</b>分析实用指南(下)

    如何计算时间复杂度

    1 算法与时间复杂度 算法(Algorithm)是求解一个问题需要遵循的,被清楚指定的简单指令的集合。 算法一旦确定,那么下一步就要确定该算法
    的头像 发表于 10-13 11:19 2960次阅读
    如何计算时间<b class='flag-5'>复杂度</b>