目录
- 空间复杂度是算法在运行过程中额外临时占用存储空间大小的量度 。
- 空间复杂度算的是变量的个数。
- 空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法。
实例
- 计算BubbleSort的空间复杂度
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;
}
}
空间复杂度:O(1)
额外临时占用存储空间:int exchange,size_t end,size_t i(3个)
使用了常数个额外空间
- 计算Fibonacci的空间复杂度
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;
}
空间复杂度:O(N)
额外临时占用存储空间:(long long*)malloc((n + 1) * sizeof(long long))开辟了n+1个空间,long long* fibArray,int i(n+3个)
动态开辟了N个空间
- 计算阶乘递归Factorial的空间复杂度
long long Factorial(size_t N)
{
return N < 2 ? N : Factorial(N - 1) * N;
}
空间复杂度:O(N)
递归调用了N次,开辟了N个栈帧,每个栈帧使用了常数个空间
- 计算斐波那契递归Fibonacci的空间复杂度
long long Fibonacci(size_t N)
{
return N < 3 ? 1 : Fibonacci(N-1)+Fibonacci(N-2);
}
空间复杂度:O(N)
时间是累计的,空间是可以重复利用的
最多会创建n个空间,之后的空间会循环利用(蓝、橙、绿线)
验证空间可以重复利用
例1:
#include<stdio.h>
void Func1()
{
int a = 0;
printf("&a = %p\n", &a);
}
void Func2()
{
int b = 0;
printf("&b = %p\n", &b);
}
int main()
{
Func1();
Func2();
return 0;
}
运行结果为:
&a = 005FFB5C
&b = 005FFB5C
Func1()函数调用完销毁,将使用的空间还给系统,接着调用Func2()函数时可以再次使用此空间
通俗讲:
a订了酒店房间,第二天退房,b去这个酒店订房间,此时这个房间为空房间,b可以接着住这个房间。
例2:
#include<stdio.h>
void Func1()
{
int a = 0;
printf("&a = %p\n", &a);
}
void Func2()
{
int x = 3;
int b = 0;
printf("&x = %p\n", &x);
printf("&b = %p\n", &b);
}
int main()
{
Func1();
Func2();
return 0;
}
运行结果为:
&a = 004FF72C
&x = 004FF72C
&b = 004FF720
此处知识点属于函数栈帧的创建和销毁:想更深入的了解,可以进一步移步到