算法的空间复杂度指什么(几分钟时间让你彻底学会)

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

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

算法的空间复杂度指什么(几分钟时间让你彻底学会)(1)

概念

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

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

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

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

空间复杂度计算NO.1 冒泡排序

void BubbleSort(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; } }

我们会发现,冒泡排序算法并没有额外定义非常多的变量,一共只有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函数时重复使用的

算法的空间复杂度指什么(几分钟时间让你彻底学会)(2)

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

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

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

算法的空间复杂度指什么(几分钟时间让你彻底学会)(3)

NO.3 阶乘

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

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

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

常见复杂度对比

算法的空间复杂度指什么(几分钟时间让你彻底学会)(4)

算法的空间复杂度指什么(几分钟时间让你彻底学会)(5)

结语

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

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

-----------------------------------

51CTO丨作者:慕雪年华

为了帮助大家,轻松,高效学习C语言/C ,给大家分享我收集的资源,从最零基础开始的,帮助大家在学习C语言的道路上披荆斩棘!

编程学习书籍分享:

算法的空间复杂度指什么(几分钟时间让你彻底学会)(6)

编程学习视频分享:

算法的空间复杂度指什么(几分钟时间让你彻底学会)(7)

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

对于C/C 感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C 的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页