前言
这是我第二篇知识点分享向博客,书接上文,这次讲解空间复杂度。
时间复杂度的链接放在这里了手把手教你拿下时间复杂度
与上一篇博客一样,这次我也会用详细的讲解与多个例子带你理解空间复杂度。所以可以先放心的点点免费的赞鼓励鼓励自己。
同学们,我要开始装~了。
一、空间复杂度是什么?
先看定义:空间复杂度是对于一个算法在运行过程中临时占用的储存空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,而是计算的是变量的个数。空间复杂度计算规则与时间复杂度类似,也使用大O渐进表示法。
在这里我有几点要说明一下:
- 为什么不是以bytes为最基础的单位计算。因为复杂度的计算实质上算是一种估算,所以我们一般以变量的个数为基础单位。
char类型变量占8比特,int占32比特,double占64。要是以比特为基础单位,我们每次在进行空间复杂度计算的时候都需要将变量类型转换成比特,这无疑大大增加了工作量。
-
大O渐进表示法,是为了选取一个式子中影响结果最大的项的表示法。可以理解为一种估算。
-
别有太大心理负担接下来会以简单的例子来加深理解的,在这里我们理解空间复杂度以变量为单位计算就行了。
二、几个常见情况(就快结束了呢)
情况一
//计算BubbleSort的空间复杂度
void BubbleSort(int *a,int n)//冒泡排序法,这里有两个变量
{
for(int end=n;end>0;--end)//这里新增一个变量
{
for(int i=0;i<end;i++)//这里新增一个变量
{
if(a[i]>a[i+1])
Swap(&a[i],&a[i+1]);
}
}
}
思考一下时间复杂度是多少,这里有几个容易产生疑惑的点:
- int *a,这个传过来的形参是一个数组,那为什么不算n格变量呢?因为int *a其实只是传过来了数组的首地址,只能算是一个变量。
- 第二个for循环里面的i,明明循环了n次,为什么也只算是一个变量?虽然第二个for循环每次结束都会将i变量的空间进行销毁,但是我们再次使用i变量的时候,系统任然会将同一个内存空间分配给它。
这里的空间复杂度是O(1)。
情况二
long long *Fibonacci ( int n )//一个变量
{
if(n==0)
return NULL;
long long *fib_array= (long long ) malloc((n+1) * sizeof ( long long ));//申请了n+1个空间
fib_arry[0]= 0 ;
fib_arry[1]= 1 ;
for(int i=2;i<=n;i++)
{
fib_arry [i] = fib_arry [i-1] + fib_arry [i-2] ;
}
}
我们可以得出一共有n+2个变量,用渐进大O表示法得空间复杂度为:O(n)。
情况三(最后一个简简单单)
这是一个递归函数
int Factorial(int n)
{
return (n < 2)? 1:Factorial(n-1)n;
}
这是递归示意图
在这里,没向下递归一次都会重新申请一个变量n,而这个n与上一级的n所占的内存空间其实是不一样的,因此,在这里变量的个数是整个递归过程中变量个数的总和。因此时间复杂度也就是O(n)。
写在后面
哥哥姐姐们,为了做出这篇知识分享现在是凌晨三点,如果有幸被你们刷到的话,还是点赞关注支持一下了叭。卑微小码农在线码字。