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

目录

1.定义

2.例题

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

解:

3.练习

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

解:

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

解:


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语言】函数栈帧的创建和销毁)

因此空间复杂度为

相关推荐
哥不想学算法6 小时前
【C++】字符串字面量拼接
开发语言·c++
gugucoding8 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
Brookty8 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
F20226974869 小时前
西门子 PLC 与 C# 通信
开发语言·c#
gugucoding9 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
万联WANFLOW10 小时前
多分支企业组网,IP 网段到底该怎么规划
开发语言·php
阿里嘎多学长10 小时前
2026-07-07 GitHub 热点项目精选
开发语言·程序员·github·代码托管
ChaoZiLL10 小时前
我的数据结构3——链表(link list)
数据结构·链表
cookies_s_s11 小时前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++