目录
1.定义
对一个算法在运行过程中临时占用存储空间大小的量度,不是程序占用了多少bytes的空间,通常用多少个变量来衡量,也使用大O渐进表示法
(有关大O渐进表示法见80.【C语言】数据结构之时间复杂度)
原因:函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定(一定要理解额外的含义)
2.例题
计算下列代码中BubbleSort函数的空间复杂度
cpp
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个变量:exchange,end,i(这里的数组a和变量n不是额外申请的,存储参数,局部变量,一些寄存器信息等在编译期间已经确定好了)
常数个,空间复杂度为
3.练习
1.求下列代码的空间复杂度
cpp
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,realloc,calloc函数)
发现(long long *)malloc((n+1)* sizeof(long long)) //这里的n+1是因为从0~n
额外创建了n+1个变量,忽略掉常数后,时间复杂度为
2.求下列代码的空间复杂度
cpp
long long Fac(size_t N)
{
if(N == 0)
return 1;
return Fac(N-1)*N;
}
解:
可以理解为编译器为每一个函数创建一个栈帧,内含常数个空间(空间复杂度为),从Fac(N)开始至Fac(1),一共创建了N+1个(并没有销毁),即
(有关栈帧的内容见36.【C语言】函数栈帧的创建和销毁)
因此空间复杂度为