算法的空间复杂度

一、空间复杂度定义

空间复杂度是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度

二、空间复杂度的表示方法

++大O渐进表示法++

空间复杂度不是计算程序占用了多少字节的空间,因为这种计算没有意义。空间复杂度计算的是程序中变量的个数。

++注意:函数运行时多需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时申请的额外空间来确定++

简而言之就是,算法函数的传入的参数不算在空间复杂度的计算中

三、实例代码

实例1

冒泡排序算法中的变量有 i、flag、j、tmp,总共4个,是常数个

空间复杂度:O(1)

cpp 复制代码
//冒泡排序(升序)
void bubble_sort(int* arr, int size)
{
	int i = 0;
	int flag = 0;
	for (i = 0; i < size - 1; i++)
	{
		int j = 0;
		for (j = 0, flag = 0; j < size - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				flag = 1;
				int tmp = 0;
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		if (flag == 0)
		{
			break;
		}
	}
}
实例2

该算法中额外申请了(n+1)个空间

空间复杂度:O(N)

cpp 复制代码
//返回斐波那契数列的前n项
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;
}
实例3(递归的空间复杂度)

尽管函数中并没有明显的定义变量,但是每次函数递归时,会创建函数栈帧,调用多少次函数就创建多少层函数栈帧。

空间复杂度:O(N)

cpp 复制代码
long long Fac(long long n)
{
    if (n == 1)
        return 1;
    else
        return n * Fac(n - 1);
}
实例4(双目递归的空间复杂度)

该函数递归在递归的时候,先调用Fib(N),再调用Fib(N-1),再调用Fib(N-2),......,再调用Fib(2)

左子树调用完了,函数栈帧销毁,再调用右子树,所以该算法最多只创建N-1层函数栈帧

空间复杂度:O(N)

cpp 复制代码
int fibonacci1(int n)
{
	if (n > 2)
		return fibonacci1(n - 1) + fibonacci1(n - 2);
	return 1;
}
相关推荐
不会就选b1 小时前
数据结构之排序
数据结构
我不会起名字3224 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
云泽8084 小时前
STM32 USART 详解(八):C I/O 串口重定向原理与实现
c语言·stm32·嵌入式硬件
ThornArmor4 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
T1mzhou4 小时前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
白色的北极熊6 小时前
c语言 scanf 输入流有空格,逗号 说明
c语言
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出货船中的“独特载货量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
彧azz7 小时前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
青山木8 小时前
Hot 100 --- 最长递增子序列
java·数据结构·算法·leetcode·动态规划
土司大王9 小时前
LeetCode hot100——33.搜索旋转排序数组:Java 二分模板与 O(log n) 实现
数据结构·算法·leetcode