数据结构 ——— 算法的空间复杂度

devtools/2024/9/24 15:50:47/

目录

前言

空间复杂度的概念

利用例题讲解空间复杂度

例题1:

例题2:

例题3:

结论


前言

在前几章学习了算法的时间复杂度并且练习了时间复杂度的相关代码

数据结构 ——— 算法的时间复杂度-CSDN博客

接下来要学习的是时间的空间复杂度,空间复杂度简单来说就是代码在运行过程中临时占用了多少存储空间大小的量度


空间复杂度的概念

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

且空间复杂度不是计算运行的程序占用了多少字节(byte)的空间,因为计算空间的意义不大,所以空间复杂度算的是变量的个数,空间复杂度计算规则基本跟时间复杂度类似,也是使用大O的渐进表示法

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


利用例题讲解空间复杂度

例题1:

代码演示:

void BubbleSort(int* a, int n)
{assert(a);// 循环1for (size_t end = n; end > 0; end--){int flag = 0;// 循环2(循环1的内部循环)for (size_t i = 1; i < end; i++){if (a[i - 1] > a[i]){// 交换Swap(&a[i - 1], &a[i]);flag = 1;}}if (flag == 0)break;}
}

问:计算 BubbleSort 函数的空间复杂度?

代码解析:

整型数组 a 占用了 n 个空间,但是整型数组 a 所占用的空间是提前开辟好的,并不是在 BubbleSort 函数中临时开辟的空间,且 BubbleSort 函数中只临时创建了 flag 变量,也就是临时创建了常数次,由此得出 BubbleSort 函数的空间复杂度函数式:

空间复杂度函数式:F(N) = 1

大O渐进表示法:O(1)


例题2:

代码演示:

long long* Fibonacci(size_t n)
{if (n == 0)return NULL;long long* fibArray = (long long*)malloc(sizeof(long long) * (n + 1));fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n; i++){fibArray[i] = fibArray[i - 1] + fibArray[i - 2];}return fibArray;
}

问:计算 Fibonacci 函数的空间复杂度?

代码解析:

代码的意思是:创建一个 fibArray 数组,数组的长度为 n+1,把斐波那契的前 n 项依次存放在 fibArray数组中,最后返回 fibArray

在 Fibonacci 函数中临时开辟了 n+1 个空间,所以得出空间复杂度函数式:

空间复杂度函数式:F(N) = N+1

再根据空间复杂度函数式和大O渐进表示法的规则得出:如果最高阶项存在且不是1,则去除与这个项目相乘的常数(除去 F(N) 中的1 ),得出大O的渐进表示法:

大O渐进表示法:O(N)


例题3:

代码演示:

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

问:计算 Fac 函数的空间复杂度?

代码解析:

代码的意思很明显,就是用递归实现 N 的阶乘

这里就涉及到创建栈帧的问题了,第一次进入 Fac(N) 函数,创建一次栈帧,第二次进入 Fac(N-1) 函数,再次创建栈帧,直到 N 为 0 时截至,且每次创建栈帧时只执行了 if 语句,并没有额外开辟空间,所以只计算创建了多少次栈帧,得出空间复杂度函数式和大O的渐进表示法:

空间复杂度函数式:F(N) = N

大O渐进表示法:O(N)


结论

时间是一去不复返的,空间是可以重复利用的


http://www.ppmy.cn/devtools/116570.html

相关文章

C++速通LeetCode中等第12题-矩阵置零(空间O(1)含注释)

class Solution { public:void setZeroes(vector<vector<int>>& matrix) {int m matrix.size();int n matrix[0].size();int flag_col0 false, flag_row0 false;//先记录第一行和第一列是否有零for (int i 0; i < m; i) {if (!matrix[i][0]) {flag_col…

等保测评:企业如何建立安全的开发环境

等保测评与安全开发环境的建立 等保测评是中国信息安全等级保护制度的重要组成部分&#xff0c;它要求企业对信息系统进行安全等级划分&#xff0c;并进行全面的安全评估和测试。企业在建立安全的开发环境时&#xff0c;应遵循等保测评的要求&#xff0c;确保开发过程中的信息…

一款能够管控企业计算机的安全系统 | 企业终端安全管控 | 天锐DLP数据安全

天 锐 DLP可帮助企业规范对电脑计算机的使用管理&#xff0c;对USB存储设备、终端外节设备、桌面壁纸进行统一管控&#xff0c;支持限制控制面板、计算机管理、系统下的相关功能选项的使用。 【地址&#xff1a;点击了解天锐股份数据安全产品】 1.计算机设置 天锐DLP可对计算…

WPF 控件数据源绑定

WPF 控件数据源绑定 前提&#xff1a;我的数据源都放在 DataProcessView 类中&#xff0c;然后在 MainWindow 中声明该类的对象 DataProcess&#xff0c;如果是指定了 DataContext &#xff0c;就将该对象赋值给 DataContext &#xff08;如下&#xff09;&#xff0c;否则不赋…

Fyne ( go跨平台GUI )中文文档-绘图和动画(三)

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

2017年国赛高教杯数学建模C题颜色与物质浓度辨识解题全过程文档及程序

2017年国赛高教杯数学建模 C题 颜色与物质浓度辨识 比色法是目前常用的一种检测物质浓度的方法&#xff0c;即把待测物质制备成溶液后滴在特定的白色试纸表面&#xff0c;等其充分反应以后获得一张有颜色的试纸&#xff0c;再把该颜色试纸与一个标准比色卡进行对比&#xff0c…

vue.js 展示树状结构数据,动态生成 HTML 内容

展示树状结构数据&#xff1a; 从 jsonData 读取树状结构的 JSON 数据&#xff0c;将其解析并生成 HTML 列表来展示。树状结构数据根据 id 和 label 属性组织&#xff0c;节点可以包含子节点 children。 展示评级信息&#xff1a; 从预定义的表单字段 form 中读取 arRateFlag 和…

Excel导入时,一个简单的匹配中文外键的方法

Excel导入时&#xff0c;外健往往只能用中文导入&#xff0c;在代码中&#xff0c;尝试用中文去匹配外建的id然后绑到要导入的数据中&#xff0c;这样一个&#xff0c;外健中文就必须和表里面的一模一样&#xff0c;但在实际中&#xff0c;导入的名称与表里存的名称总有少量字不…