空间复杂度不计算算法占用多少字节,他算的是大概的定义变量的个数。
如果程序a定义了n个字节,程序b定义了n2个字节,这里我们称程序b的空间复杂度大于程序a。
有人会问:如果程序a定义的是double型,程序b定义的是int型呢?不公平啊!
其实计算机认为不同数据类型变量之间差别不大。就算是结构体也大不到哪里去。(嵌入式开发除外,嵌入式开发内存寸金寸土)
例1:请问冒泡排序的空间复杂度是多少?
void bubble_sort(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] > arr[1])
{
Swap(&a[i-1],&a[i]);
exchange = 1;
}
}
if (exchange == 0)
break;
}
冒泡排序定义的变量有*a、n、end、echange、i共五个。
冒泡排序的空间复杂度是O(1)。O(1)不是一个而是常数个。
从冒泡排序我们可以看出别看有的函数定义了挺多的变量但其实只要还在常数量级就是O(1)。
那有不在常数量级的吗?有看下面
例2:递归阶乘的空间复杂度
long long Factorial(size_t N)
{
return N < 2 ? N : Factorical(N - 1)*N;
}
阶乘的空间复杂度是O(n)。
仔细观察这个递归函数他要调用n次,单次创建的变量是常数量级,常数×n,所以空间复杂度是O(n)。