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

因此空间复杂度为

相关推荐
o***Z44813 分钟前
JavaScript在Node.js中的内存管理
开发语言·javascript·node.js
毕设源码-邱学长25 分钟前
【开题答辩全过程】以 基于Java企业人事工资管理系统为例,包含答辩的问题和答案
java·开发语言
稚辉君.MCA_P8_Java1 小时前
通义 插入排序(Insertion Sort)
数据结构·后端·算法·架构·排序算法
颜*鸣&空1 小时前
QT程序实现串口通信案例
开发语言·qt
无限进步_1 小时前
C语言动态内存的二维抽象:用malloc实现灵活的多维数组
c语言·开发语言·数据结构·git·算法·github·visual studio
Swift社区2 小时前
LeetCode 432 - 全 O(1) 的数据结构
数据结构·算法·leetcode
froginwe112 小时前
Maven 仓库概述
开发语言
芬加达2 小时前
leetcode34
java·数据结构·算法
二川bro2 小时前
Python在AI领域应用全景:2025趋势与案例
开发语言·人工智能·python