数据结构——空间复杂度

在这里插入图片描述
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.rhkb.cn/news/84242.html

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

相关文章

kafka partition的数据文件(offffset,MessageSize,data)

partition中的每条Message包含了以下三个属性&#xff1a; offset&#xff0c;MessageSize&#xff0c;data&#xff0c;其中offset表示Message在这个partition中的偏移量&#xff0c;offset不是该Message在partition数据文件中的实际存储位置&#xff0c;而是逻辑上一个值&…

【刻削生千变,丹青图“万相”】阿里云AI绘画创作模型 “通义万相”测评

刻削生千变&#xff0c;丹青图“万相 4月7日&#xff0c;阿里大模型“通义千问”开始邀请用户测试体验。现阶段该模型主要定向邀请企业用户进行体验测试&#xff0c;用户可通过官网申请&#xff08;tongyi.aliyun.com&#xff09;&#xff0c;符合条件的用户可参与体验。 随…

RabbitMQ(一) - 基本结构、SpringBoot整合RabbitMQ、工作队列、发布订阅、直接、主题交换机模式

RabbitMQ结构 Publisher &#xff1a; 生产者 Queue: 存储消息的容器队列&#xff1b; Consumer:消费者 Connection&#xff1a;消费者与消息服务的TCP连接 Channel:信道&#xff0c;是TCP里面的虚拟连接。例如&#xff1a;电缆相当于TCP&#xff0c;信道是一条独立光纤束&…

在vue中Antv G2 折线图如何添加点击事件获取折线上点的值

在项目中有个需求是点击折线图的点&#xff0c;获取当前点的信息&#xff0c;其它图形都可以参考相关的API获取到&#xff0c;但area做的折线图怎么都获取不到点击的信息&#xff0c;只能获取全部的信息&#xff0c;最终解决如下&#xff1a; 实现思路 用户的鼠标在折线图上移…

基于低代码和数字孪生技术的电力运维平台设计

电力能源服务商在为用能企业提供线上服务的时候&#xff0c;不可避免要面对用能企业的各种个性化需求。如果这些需求和想法都要靠平台厂家研发人员来实现&#xff0c;那在周期、成本、效果上都将是无法满足服务运营需要的&#xff0c;这也是目前很多线上能源云平台应用效果不理…

单例模式-java实现

介绍 单例模式的意图&#xff1a;保证某个类在系统中有且仅有一个实例。 我们可以看到下面的类图&#xff1a;一般的单例的实现&#xff0c;是属性中保持着一个自己的私有静态实例引用&#xff0c;还有一个私有的构造方法&#xff0c;然后再开放一个静态的获取实例的方法给外界…

快速修复应用程序中的问题的利器—— Android热修复

热修复技术在Android开发中扮演着重要的角色&#xff0c;它可以帮助开发者在不需要重新发布应用程序的情况下修复已经上线的应用程序中的bug或者添加新的功能。 一、热修复是什么&#xff1f; 热修复&#xff08;HotFix&#xff09;是一种在运行时修复应用程序中的问题的技术…

树结构转换

思路&#xff1a; 先把数组转化成一个对象&#xff08;map&#xff09;&#xff0c;对象的key值是对象的id 遍历对象&#xff1b;map[map[k].pid].children.push(map[k]),【k代表索引】&#xff0c;pid等于0代表是根节点 // 数结构转换let arr [{id: 1,pid: 0,name: "b…

【OpenVINOSharp】 基于C#和OpenVINO2023.0部署Yolov8全系列模型

基于C#和OpenVINO2023.0部署Yolov8全系列模型 1 项目简介1.1 OpenVINOTM 2 OpenVinoSharp2.1 OpenVINOTM 2023.0安装配置2.2 C 动态链接库2.3 C#构建Core推理类2.4 NuGet安装OpenVinoSharp 3 获取和转换Yolov8模型3.1 安装ultralytics3.2 导出yolov8模型3.3 安装OpenVINOTM Pyt…

python——案例15:判断奇数还是偶数

案例15&#xff1a;判断奇数还是偶数numint(input(输入数值&#xff1a;))if(num%2)0: #通过if语句判断print("{0}是偶数".format(num))else: #通过else语句判断print("{0}是奇数".format(num))

flask-migrate使用

1.介绍 # 表,字段发生变化&#xff0c;都会有记录&#xff0c;自动同步到数据库中--》django支持这种操作 # 原生的sqlalchemy&#xff0c;不支持修改表的 # flask-migrate可以实现类似于django的 python manage.py makemigrations #记录 python manage.py migrate …

Docker之jenkins部署harbor在harbor中完成部署

Docker之jenkins部署harbor在harbor中完成部署 1、harbor作用 Harbor允许用户用命令行工具对容器镜像及其他Artifact进行推送和拉取&#xff0c;并提供了图形管理界面帮助用户查阅和删除这些Artifact。在Harbor 2.0版本中&#xff0c;除容器镜像外&#xff0c;Harbor对符合OCI…

爬虫程序中使用爬虫ip的优势

作为一名爬虫技术员&#xff0c;我发现在爬虫程序中使用代理IP可以提升爬取效率和匿名性。今天&#xff0c;我就来详细讲解一下代理IP在爬虫程序中的工作原理及应用。 首先&#xff0c;我们来了解一下代理IP在爬虫程序中的工作原理。当我们使用爬虫程序进行数据采集时&#xf…

计算机的构造和原理

本资料转载于B站up主芯片超人-花 仅用于学习和讨论&#xff0c;如有侵权请联系 计算机工作原理之3D动画揭秘&#xff1a;计算机内部如何工作_哔哩哔哩_bilibili 1.CPU的部分 1.1 CPU放大看 1.2 一个芯片中&#xff0c;有80亿至100亿晶体管 1.3 放大磁道 1.4 共享3级缓存 1.5 …

二、MySql库的操作

文章目录 一、库的操作&#xff08;一&#xff09;创建数据库&#xff08;二&#xff09;创建数据库案例&#xff08;三&#xff09;字符集和校验规则1、 查看系统默认字符集以及校验规则2、查看数据库支持的字符集3、查看数据库支持的字符集校验规则4、校验规则对数据库的影响…

python中的装饰器的真正含义和用法

闭包&#xff1a; 闭包是python中的一个很实用的写法&#xff0c;可以使得用户在函数中调用该函数外的函数的变量&#xff0c;使得该变量常驻于内存中。 闭包函数&#xff1a; 输入是函数&#xff0c;输出也是一个函数。 装饰器的写法是python闭包的语法糖。 面试中经常面…

常用抓包工具

Fiddler Fiddler 是一个很好用的抓包工具&#xff0c;可以用于抓取http/https的数据包&#xff0c;常用于Windows系统的抓包&#xff0c;它有个优势就是免费 Charles Charles是由JAVA开发的&#xff0c;可以运行在window Linux MacOS&#xff0c;但它是收费的&#xff0c;和…

你值得拥有——流星雨下的告白(Python实现)

目录 1 前言 2 霍金说移民外太空 3 浪漫的流星雨展示 4 Python代码 1 前言 我们先给个小故事&#xff0c;提一下大家兴趣&#xff1b;然后我给出论据&#xff0c;得出结论。最后再浪漫的流星雨表白代码奉上&#xff0c;还有我自创的一首诗。开始啦&#xff1a; 2 霍金说…

用Python编写的小游戏:探索游戏世界的乐趣

探索开始 引言&#xff1a;第一部分&#xff1a;猜数字游戏代码案例1&#xff1a; 第二部分&#xff1a;石头剪刀布游戏代码案例2&#xff1a; 第三部分&#xff1a;迷宫游戏代码案例3&#xff1a; 总结&#xff1a; 引言&#xff1a; Python是一种简单易学的编程语言&#xf…

成集云 | 报销单同步到金蝶云星空 | 解决方案

方案介绍 金蝶云星空是金蝶集团针对企业数字化转型需求推出的一款云端产品。它是一套集成了多个业务模块的全面企业管理解决方案&#xff0c;旨在帮助企业实现全面管控和高效运营。 旗下涵盖了多个功能模块&#xff0c;包括财务、人力资源、供应链、生产制造、销售与市场、客…