空间复杂度

前言

通过上一节的学习,我们知道了衡量一个算法是否高效的标准就是复杂度,我们已经学习了时间复杂度,那么本节我们就了解一下空间复杂度的相关知识,那么我们废话不多说,正式进入今天的学习

空间复杂度

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

空间复杂度算的不是程序占用了多少空间,算的是变量的个数。空间复杂度计算规则基本跟时间复杂度类似,也使用大O渐进表示法

相较于时间复杂度而言,空间复杂度可能会没有那么关注;

下面我们来举几个例子试着计算空间复杂度:

例题1

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个变量:end、exchange、i

因为3是一个常数,所以该代码的空间复杂度就是O(1)

此时我们可能会产生疑问:int* a,和int n为什么不要算入变量中去呢?

因为空间复杂度计算的是在解决某个问题的时候,算法之中额外开辟的空间

我们来解释一下额外开辟的空间这一概念:

上一节我们学习了轮转数组的解题思路,但是三段逆置这个想法很难想到,我们通常情况下会采取以下的做法:

1.我们先创建一个新的数组tmp

2.我们把后N-K个元素拷贝到数组tmp的前面,再把nums剩余元素按顺序往后拷贝

3.最后把tmp数组里面的内容拷贝回nums数组中

此时的tmp数组是因为要解决问题而额外进行开辟的,而nums数组是本身就存在的,所以此时nums不算额外开辟的数组,而tmp算额外开辟的数组

该代码的时间复杂度为O(N),空间复杂度为O(N),用这种方式来写代码就称作拿空间换时间

例题2

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

该代码是求阶乘的代码,我们来计算一下空间复杂度:

我们知道每个函数都需要建立一个栈帧,一共有N个函数所以有N个栈帧

此时代码的空间复杂度就是O(N)

常见的空间复杂度:O(1)、O(N)、O(N^2)【二维数组中】

例题3

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;
}

该代码是斐波那契数列,我们试着计算一下斐波那契数列的空间复杂度:

此时代码中有两个变量:

1.动态申请的数组fibArray

2.用于循环的变量i

我们尝试运用一下刚才所学习的知识自己分析一下

结尾

本节我们学习了空间复杂度,虽然相较于时间复杂度而言,空间复杂度显得没有那么重要

那么本届的所有内容就到此结束了,谢谢您的浏览

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

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

相关文章

python爬虫(三)之虎嗅网汽车文章爬虫

python爬虫&#xff08;三&#xff09;之虎嗅网汽车文章爬虫 闲来没事&#xff0c;闲鱼上有个好兄弟要我从虎嗅网上抓一些汽车文章的爬虫&#xff0c;于是大力出奇迹&#xff0c;我写了一个python程序&#xff0c;将这个网站上所有的汽车文章全部抓取下来了&#xff0c;存储到…

若依生成代码的步骤

1.创建表&#xff0c;要有注释 2.导入表 3.创建主菜单 4.修改表 5.生成代码 6.把代码复制到自己的程序中&#xff1a;复制表、后端、前端 7.重启后端&#xff0c;如果有问题则clean 8.回到浏览器可以看到正常显示了生成的页面

JAVA获取application.yml配置文件的属性值

application.yml配置参数 方式一&#xff1a;使用Value方式(常用) 语法 Value("${配置文件中的key:默认值}") Value("${配置文件中的key}")方法1&#xff1a;使用的类文件中定义变量&#xff0c;直接使用变量 import org.springframework.beans.factory.an…

【2024】Gradle安装配置以及基于Kotlin 进行详细使用

目录&#x1f4bb; 一、介绍二、安装Gradle1、下载安装2、配置环境变量2.1、mac2.2、windows 3、配置国内国内镜像源4、初始化Gradle项目4.1、项目结构4.2、Gradle常用命令 三、项目配置1、配置文件介绍1.1、设置文件settings.gradle1.1.1、单体项目1.1.2、父子项目 1.2、构建文…

5.2 Java全栈开发前端+后端(全栈工程师进阶之路)-服务端框架-Spring框架-相信我看这一篇足够

1.Spring框架 1.1.Spring框架简介 Spring是一个基于java的轻量级的、一站式框架。 虽然Spring是一个轻量级框架&#xff0c;但并不表示它的功能少。实际上&#xff0c;spring是一个庞然大物&#xff0c;包罗万象。 时至今日&#xff0c;Spring已经成为java世界中事实上的标准…

常用控件(一)

常用控件 一 按钮类控件QPushButtonQRadioButtonQCheckBox 按钮类控件 QPushButton 使用QPushButton表示一个按钮&#xff0c;这是我们当前最熟悉的一个控件了; QPushButton继承自QAbstractButton&#xff0c;这个类是个抽象类&#xff0c;是其他按钮类的父类; QAbstractButt…

Java毕业设计 基于SpringBoot vue新能源充电系统

Java毕业设计 基于SpringBoot vue新能源充电系统 SpringBoot 新能源充电系统 功能介绍 首页 图片轮播 充电桩 充电桩类型 充电桩详情 充电桩预约 新能源公告 公告详情 登录注册 个人中心 余额充值 修改密码 充电桩报修 充电桩预约订单 客服 后台管理 登录 个人中心 修改密码…

eclipse插件开发(一)

eclipse插件开发在java技能树中&#xff0c;是一个比较古老的分支。网上资料也少。最近开发中需要用到此技能&#xff0c;故记录下点亮过程。笔者水平有限&#xff0c;记录供通道者浅读。 学习eclipse插件开发&#xff0c;首先需明确几个高频的概念&#xff0c;先说说何为插件及…

网工交换基础——VLAN Maping

一、定义 VLAN Maping通过修改报文携带的VLAN Tag来实现不同VLAN的相互映射。 二、应用场景 1、场景一&#xff1a;两个VLAN相同的二层用户网络通过骨干网络互联&#xff0c;为了实现用户之间的二层互通&#xff0c;以及二层协议&#xff08;例如MSTP等&#xff09;的统一部署…

pandas--数据的添加和修改

pandas--数据的添加和修改 1、替换数据2、填充空值3、修改索引名4、增加列5、插入列df.insert()6、增加行7、追加合并8、删除空值9、删除 1、替换数据 使用replace方法可以实现数据的批量替换。 df.replace(1, 10) # 将数据中的所有1替换为10 df.replace([1, 2, 3, 4], 8)…

layui select 绑定onchange事件失效

layui select 绑定onchange事件失效 问题背景解决方案 问题背景 在日常工作中&#xff0c;可能会用到页面 freemaker 以及 layui 前端框架&#xff0c;这个时候直接在 select 上面绑定 onchange 事件往往是不生效的&#xff0c;错误的方式 这种方式给 select 绑定的 onchange…

智慧景区新篇章:山海鲸可视化管理解析

随着旅游业的蓬勃发展&#xff0c;景区管理面临着越来越多的挑战。如何提升游客体验、优化资源配置、确保游客安全&#xff0c;成为景区管理者亟需解决的问题。山海鲸智慧景区管理可视化系统&#xff0c;以其先进的技术和创新的理念&#xff0c;为景区管理带来了全新的解决方案…

图像ISP——AGC参数解析

前言 AWB和AGC是两种常见的自动调整功能。AWB用于自动调整图像的白平衡&#xff0c;以确保颜色在不同光照条件下仍然看起来自然。而AGC则用于自动调整图像的增益&#xff0c;以在不同的亮度条件下保持适当的曝光。 代码例程 static AWB_AGC_TABLE_S g_stAwbAgcTable {/* bvali…

鸿蒙应用开发者高级认证指南及参考资料整理(含详细参考答案)

如何报名鸿蒙应用开发者高级认证 报名链接:点击这里进行报名。报名步骤: 点击上述链接进入报名页面。选择“立即报名”。在课程内容中找到“HarmonyOS应用开发者高级认证”,点击进入。点击“参加考试”,随后即可开始考试。考试注意事项 实名认证:考试前,请务必完成实名认…

厉害了,OPCUA协议助力航天工业探索苍穹!

今年以来&#xff0c;航天科技真是捷报频频&#xff0c;神州十八号载人飞船和嫦娥六号均发射成功&#xff01;还让宇航员成功地进入了天宫空间站&#xff0c;可喜可贺。说到航天过程&#xff0c;其中有一个环节尤为重要&#xff0c;就是布置众多望远镜。有人可能会问&#xff0…

赣红孵联合卫东街道未保站开展未成年人保护法散落在每个角落活动

为进一步提高家长的法治意识&#xff0c;依法保障未成年人的合法权益&#xff0c;全力构建安全和谐文明家庭&#xff0c;5月8日&#xff0c;赣红孵社会组织培育中心联合卫东街道未成年人保护站在在南师附小红谷滩校区实验小学开展“未成年人保护法散落在每个角落”未成年人普法…

Liunx日志轮转

目录 一.日志的重要性 二、日志系统rsyslog 常见的日志文件(系统、进程、应用程序) 日志优先级 三、logrotate日志轮转 什么是日志轮转&#xff1f; logrotate 的工作方式 logrotate 配置文件 logrotate命令 一.日志的重要性 Linux日志文件对于理解和解决系统中出现的…

vue基础配置

vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path"; //引入svg需要用到的插件 import { createSvgIconsPlugin } from vite-plugin-svg-icons //mock插件提供方法 import { viteMockServe } from vite-…

MySQL慢查询SQL优化

一、慢查询日志 描述&#xff1a;通过慢查询日志等定位那些执行效率较低的SQL语句 查看 # 慢查询是否开启 show variables like slow_query_log%; # 慢查询超时时间 show variables like long_query_time%;执行SQL 开启慢查询日志 set global slow_query_log ON;设置慢查…

笔试强训week4

day1 Q1 难度⭐⭐ 小易的升级之路_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防…