数据结构——空间复杂度

在这里插入图片描述
3.空间复杂度

空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度 。
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。
空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因
此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
实例1:

// 计算BubbleSort的空间复杂度?
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;}
}

上面的冒泡排序我们在上篇文章说时间复杂度是O(N^2),时间复杂度其实是O(1),这也和我们之前讲的大O渐进法差不多,我们看程序中创建变量都是常数项,所以就是O(1).

空间复杂度一定要记住一个规则就是空间是不积累的,但是时间是累积的。

// 计算Fibonacci的空间复杂度?
// 返回斐波那契数列的前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;
}

这是斐波那契的一个迭代,所以时间复杂度就是O(N),空间复杂度也是O(N),因为我们的malloc开辟了空间。

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

这个空间复杂度可能大家都会觉的是O(2^n),但是其实是O(N),因为函数栈帧创建会销毁,有很多空间重复利用,这就是我们为什么说空间不是积累的,但是时间是积累的。
4. 常见复杂度对比
一般算法常见的复杂度如下:
在这里插入图片描述
一般我们的算法后面几个不会用,太慢了。
下面给几个oj题,让大家做一做

题目一

思路1

我们可以用哈希的思想,就是先有一个数组,里面的内容都初始化-1,然后把数字是几就放到这个相应的数组当中,然后遍历一遍数组,如果是-1的话,那就是我们要找的值。

int missingNumber(int* nums, int numsSize){int*num=(int*)malloc(sizeof(int)*(numsSize+1));int i=0;for(i=0;i<=numsSize;i++){num[i]=-1;}for(i=0;i<numsSize;i++){num[nums[i]]=nums[i];}for(i=0;i<=numsSize;i++){if(num[i]==-1)return i;}free(num);return NULL;
}

在这里插入图片描述
就是这样的一个思路
在这里插入图片描述
一开始写的时候一直在调那个编译错误,其实就是少了一个返回值,大家可以放到VS上调试,就像这样给一个主函数。
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
int missingNumber(int* nums, int numsSize) {int* num = (int*)malloc(sizeof(int) * (numsSize + 1));int i = 0;for (i = 0; i <= numsSize; i++){num[i] = -1;}for (i = 0; i < numsSize; i++){num[nums[i]] = nums[i];}for (i = 0; i <= numsSize; i++){if (num[i] == -1)return i;}free(num);return NULL;
}
int main()
{int arr[] = { 2,3,4,0 };int sz = sizeof(arr) / sizeof(arr[0]);int ret=missingNumber(arr, sz);printf("%d", ret);return 0;
}

思路2

按位异或,这是特别快的一个思路。因为我们0和任何数异或都是本身,然后我们只要给一个0就可以了,然后因为相同的数异或是0,接下来就看我们的代码。

int missingNumber(int* nums, int numsSize){int x=0;for(int i=0;i<numsSize;i++){x^=nums[i];}for(int i=0;i<=numsSize;i++){x^=i;}return x;
}

其实还有思路,但是我就不写了。给个思路吧
思路三,先排序,在找,按顺序一个一个遍历,但是空间复杂度肯定不是O(N),因为排序还要时间。
思路四,加0到N的数相加,然后减去这个数组,得到的就是消失的数。

旋转数

void revolve(int*left,int*right)
{while(left<right){int tmp=*left;*left=*right;*right=tmp;left++;right--;}
}void rotate(int* nums, int numsSize, int k){if(numsSize==1)return ;k=k%numsSize;revolve(nums,nums+numsSize-1);revolve(nums,nums+k-1);revolve(nums+k,nums+numsSize-1);
}

在这里插入图片描述
以上就是今天分享,我们下次再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/30761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot中@Async的简单用法

springboot中Async的简单用法 文章目录 springboot中Async的简单用法开启配置Async的使用无返回值调用带返回值的调用 开启配置 在配置文件或者入口文件上新增注解: EnableAsync即可 Async的使用 对应需要异步调用的方法上添加Async注解即可 无返回值调用 controller代码 …

四项代表厂商,Kyligence 入选 Gartner 数据及人工智能相关领域多项报告

近日&#xff0c;全球权威的技术研究与咨询公司 Gartner 发布了《2023 年中国数据、分析及人工智能技术成熟度曲线》、《2023 年分析与商业智能技术成熟度曲线报告》、《2023 年数据管理技术成熟度曲线报告》&#xff0c;Kyligence 分别入选这三项报告的指标平台 Metrics Store…

[保研/考研机试] KY187 二进制数 北京邮电大学复试上机题 C++实现

描述 大家都知道&#xff0c;数据在计算机里中存储是以二进制的形式存储的。 有一天&#xff0c;小明学了C语言之后&#xff0c;他想知道一个类型为unsigned int 类型的数字&#xff0c;存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗&#xff1f;并且&#xff0c;小…

《兴森大求真》重磅来袭!先进电子电路可靠性大揭秘

兴森实验室&#xff0c;让可靠看得见 前言介绍 芯片性能不断增强、先进封装不断演进&#xff0c;导致封装基板信号互连的IO数量和密度不断增加、PCB的层数增加、孔间距减小、厚径比提升&#xff0c;可靠性的挑战正在加剧。 电路板作为各种电子元器件的载体和电路信号传输的枢…

ROS入门-常见的rostopic命令及其用法的示例

目录 常见的rostopic命令及其用法的示例 1. 列出所有可用的话题&#xff1a; 2. 获取话题详细信息&#xff1a; 3. 实时显示话题消息内容&#xff1a; 4. 发布消息到话题&#xff1a; 5. 发布随机消息到话题&#xff1a; 6. 查看话题消息类型&#xff1a; 7. 查看话题消…

UDP简介

UDP 1. UDP格式2. UDP特点3. 差错检验 1. UDP格式 16位UDP长度&#xff0c;表示整个数据报&#xff08;UDP首部UDP数据&#xff09;的最大长度&#xff1b; 如果校验和出错&#xff0c;就会直接丢弃; 2. UDP特点 无连接: 知道对端的IP和端口号就直接进行传输&#xff0c;不需…

idea使用protobuf

本文参考&#xff1a;https://blog.csdn.net/m0_37695902/article/details/129438549 再次感谢分享 什么是 protobuf &#xff1f; Protocal Buffers(简称protobuf)是谷歌的一项技术&#xff0c;用于结构化的数据序列化、反序列化。 由于protobuf是跨语言的&#xff0c;所以用…

xxx酒业有限责任公司突发环境事件应急预案WORD

导读&#xff1a;原文《xxx酒业有限责任公司突发环境事件应急预案word》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目 录 1 总则 1.1 编制目的 1.2 编制…

【vue3】基础知识点-pinia

学习vue3&#xff0c;都会从基础知识点学起。了解setup函数&#xff0c;ref&#xff0c;recative&#xff0c;watch、computed、pinia等如何使用 今天说vue3组合式api&#xff0c;pinia 戳这里&#xff0c;跳转pinia中文文档 官网的基础示例中提供了三种写法 1、选择式api&a…

python进阶

目录 Json数据格式 前言 JSON格式 python数据和Json数据的相互转化 网络编程 套接字 socket服务端编程步骤 socket客户端编程步骤 python操作mysql数据库 查询并接收数据 数据插入 Json数据格式 前言 JSON是一种轻量级的数据交换格式&#xff0c;可以按照JSON指定…

【福建事业单位-资料分析】04 倍数、特殊增长率

【福建事业单位-资料分析】04 倍数、特殊增长率 一、倍数1.1现期倍数1.2 基期倍数总结 二、特殊增长率2.1 间隔增长率间隔倍数和间隔基期&#xff08;都要先求得间隔增长率r&#xff09; 2.2 年均增长率年均增长率的比较年均增长率计算-居中代入 2.3 混合增长率总结 三、总结 一…

E. Power of Points - 思维

分析&#xff1a; 题意本质就是找点在数组中任意一个位置时和所有的端点之间的距离和&#xff0c;但是直接暴力会超时&#xff0c;可以对数组排个序&#xff0c;设当前遍历的是xi&#xff0c;那么此时求的到各端点的距离就是j从1 ~ i - 1的所有端点与xi的距离之和&#xff0c;也…

配置nginx服务端口时-在同一个页面中打开多个地址端口-查看服务情况

1&#xff1a;把代码保存到xxx.html文件中 2&#xff1a;因为一个个端口打开查看&#xff0c;实在太麻烦了 3&#xff1a;在一个页面中查看多页的响应才能提高测试效率 <html><head><title>本地连接列表</title> </head><body><cente…

【C语言学习】函数的定义和调用

一、函数定义 要有返回类型、函数名和函数体 二、调用函数 函数名&#xff08;函数值&#xff09;&#xff1b; &#xff08;&#xff09;起到表示函数调用的重要作用&#xff0c;即使没有参数也需要&#xff08;&#xff09; 若有参数&#xff0c;则需要给出正确的数量和顺序…

vscode ssh远程的config/配置文件无法保存解决

问题 之前已经有了一个config&#xff0c;我想更改连接的地址和用户名&#xff0c;但是无法保存&#xff0c;显示需要管理员权限&#xff0c;但以管理员启动vscode或者以管理员权限保存都不行 未能保存“config”: Command failed: “D:\vscode\Microsoft VS Code\bin\code.c…

『PostgreSQL』在 PostgreSQL中创建只读权限和读写权限的账号

&#x1f4e3;读完这篇文章里你能收获到 理解在 PostgreSQL 数据库中创建账号的重要性以及如何进行账号管理掌握在 PostgreSQL 中创建具有只读权限和读写权限的账号的步骤和方法学会使用 SQL 命令来创建账号、为账号分配适当的权限以及控制账号对数据库的访问级别了解如何确保…

C++友元函数和友元类的使用

1.友元介绍 在C中&#xff0c;友元&#xff08;friend&#xff09;是一种机制&#xff0c;允许某个类或函数访问其他类的私有成员。通过友元&#xff0c;可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用&#xff0c;例如在类之间共享数据或…

​朋友圈评论截图生成,制作朋友圈网页​

朋友圈头像&#xff0c;上传自己的朋友圈头像&#xff1b;不填默认随机 网名&#xff0c;填写微信昵称&#xff1b; 内容&#xff0c;需要发布的微信正文内容&#xff1b; 截图类型&#xff0c;支持纯文字、图片&#xff08;单张、九宫格&#xff09;、分享网页/公众号文章共…

初阶C语言-操作符详解(下)

&#x1f31e; “等春风得意&#xff0c;等时间嘉许&#xff01;” 接下来&#xff0c;我们把操作符没学完的继续学完&#xff01; 操作符详解 6.2sizeof和数组 7.关系操作符8.逻辑操作符9.条件操作符10.逗号表达式11.下标引用、函数调用和结构成员12.表达式求值12.1隐式类型转…

[FPAG开发]使用Vivado创建第一个程序

1 打开Vivado软件&#xff0c;新建项目 选择一个纯英文路径 选择合适的型号 产品型号ZYNQ-7010xc7z010clg400-1ZYNQ-7020xc7z010clg400-2 如果型号选错&#xff0c;可以单击这里重新选择 2 创建工程源文件 可以看到文件创建成功 双击文件打开&#xff0c;插入代码 modul…