欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 81.【C语言】数据结构之空间复杂度

81.【C语言】数据结构之空间复杂度

2025/9/19 9:34:39 来源:https://blog.csdn.net/2401_85828611/article/details/142880935  浏览:    关键词:81.【C语言】数据结构之空间复杂度

目录

1.定义

2.例题

计算下列代码中BubbleSort函数的空间复杂度

解:

3.练习

1.求下列代码的空间复杂度

解:

2.求下列代码的空间复杂度

解:


1.定义

对一个算法在运行过程中临时占用存储空间大小的量度,不是程序占用了多少bytes的空间,通常用多少个变量来衡量,也使用大O渐进表示法

(有关大O渐进表示法见80.【C语言】数据结构之时间复杂度)

原因:函数运行时所需要的栈空间(存储参数,局部变量,一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定(一定要理解额外的含义)

2.例题

计算下列代码中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;}
}

解:

一共额外申请了3个变量:exchange,end,i(这里的数组a和变量n不是额外申请的,存储参数,局部变量,一些寄存器信息等在编译期间已经确定好了)

常数个,空间复杂度为O(1)

3.练习

1.求下列代码的空间复杂度

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个变量,忽略掉常数后,时间复杂度为O(N)

2.求下列代码的空间复杂度

long long Fac(size_t N)
{if(N == 0)return 1;return Fac(N-1)*N;
}

解:

可以理解为编译器为每一个函数创建一个栈帧,内含常数个空间(空间复杂度为O(1)),从Fac(N)开始至Fac(1),一共创建了N+1个(并没有销毁),即(N+1)*O(1)=O(N)

(有关栈帧的内容见36.【C语言】函数栈帧的创建和销毁)

因此空间复杂度为O(N)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词