大家好呀!我是小桑。
上次我们一起学习了复杂度分析中的时间复杂度,这次我们便来探讨一下时间复杂度兄弟篇之——空间复杂度。
空间复杂度
空间复杂度是指算法在执行时所需的内存空间大小,一般以字节为单位进行度量。尤其在处理大规模数据、特别是在内存受限的环境下,空间复杂度变得尤为重要。
尼尼: 除了时间,还有什么空间?
小桑: 是啊,空间也是我们必不可少的一部分。你总不可能只考虑产品的运行速度,不考虑所占的内存吧。
尼尼: emmm……好烦呀!
小桑: 别丧气,相比较与时间复杂度,空间复杂度可要简单多了。
尼尼: 真的吗?那我可要听听看是不是这样。可不要骗我哦!
计算空间复杂度的方法与计算时间复杂度有些类似。可以通过分析算法中变量、数组、对象等数据结构的使用情况来确定算法所需的内存空间。记为
在这里 n 同样作为数据集大小,f(n) 指的是规模 n 所占存储空间的函数。
Tip:这里我要强调一下空间复杂度是考虑程序运行过程中临时占用内存的大小,而不是可执行文件的大小。
代码分析
O(1)
1 int j = 0;
2 for (int i = 0; i < n; i++){
3 j++;
4 }
例如上面这一段简单的代码,随着n的变化,所开辟的内存空间并不会随着n的变化而变化。
那么此时我们的空间复杂度变为常量,表示为O(1)。
hh,这里的逻辑关系是不是和我们的时间复杂度大同小异呢! 聪明的宝子们一定可以轻松理解。
O(n)
1 int[] a = new int[n];
2 for (int i = 0; i < n; i++){
3 a[i] = i;
4 }
这里我们定义了一个整数型的数组,数组个数为n个,把每个小朋友(i)均匀的分配给每一个小房子(数组)里。所以自然随着n的增大,内存大小呈线性增长。
那么显然,空间复杂度便是O(n)。
O()
1 int[][] a = new int[n][n];
2 for (int i = 0; i < n; i++) {
3 for (int j = 0; j < n; j++) {
4 a[i][j] = i + j;
5 }
6 }
这里我构建了一个矩阵数组,样子就和我们线性代数中的矩阵差不多。对一个个数为n×n的数组,每个数组的值为相应行列相加的值(i+j)。
那么这样一个数组一定随着n的增大,呈平方增长,即 O()。
尼尼: 懂了懂了,学了时间复杂度再学这个感觉好轻松。
桑尼: 当然,在理解上空间确实比时间更要简单。但是重要性这两者都是我们需要考虑的哦。
总结
在编写程序时,除了考虑时间复杂度外,还需要考虑空间复杂度。在一些计算密集型的算法中,减少空间占用可以提高程序的性能。因此,我们需要根据具体情况,选择合适的算法来实现程序,以达到最优的效果。
除了这些在后面排序算法的讲解中,时间复杂度和空间复杂度会有更深层次的体验。记得关注 公众号【桑尼幻想曲】到时候,拿个小板凳坐好就可以了。
宝子们的 【点赞、关注、在看】 是桑尼创作的最大动力,我们下期见!