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

因此空间复杂度为

相关推荐
wangjinjin18025 分钟前
Python Excel 文件处理:openpyxl 与 pandas 库完全指南
开发语言·python
愚润求学25 分钟前
【C++】类型转换
开发语言·c++
XRZaaa30 分钟前
常见排序算法详解与C语言实现
c语言·算法·排序算法
@我漫长的孤独流浪33 分钟前
数据结构测试模拟题(4)
数据结构·c++·算法
斯奕sky_small-BAD38 分钟前
C++ if语句完全指南:从基础到工程实践
java·开发语言·php
Humbunklung1 小时前
Rust Floem UI 框架使用简介
开发语言·ui·rust
jie188945758661 小时前
C++ 中的 const 知识点详解,c++和c语言区别
java·c语言·c++
网安INF1 小时前
RSA加密算法:非对称密码学的基石
java·开发语言·密码学
明月*清风1 小时前
c++ —— 内存管理
开发语言·c++
蔡蓝1 小时前
设计模式-观察着模式
java·开发语言·设计模式