【数据结构】空间复杂度
目录
一、引入空间复杂度的原因
二、空间复杂度的分析
❥ 2.1 程序运行时内存大小 ~ 程序本身大小
❥ 2.2 程序运行时内存大小 ~ 算法运行时内存大小
❥ 2.3 算法运行时内存大小
❥ 2.4 不考虑算法全部运行空间的原因
三、空间复杂度
❥ 3.1空间复杂度的定义
❥ 3.2 空间复杂度不能准确算出空间大小的原因
❥ 3.3 最关注差空间复杂度的原因
四、空间复杂度的计算
五、常见空间复杂度举例
❥ 5.1 常数阶
❥ 5.2 线性阶
❥ 5.3 平方阶
六、递归与非递归空间复杂度
❥ 6.1 常规函数空间复杂度不重点算栈空间大小的原因
❥ 6.2 递归函数空间复杂度需要算栈空间大小的原因
七、权衡时间与空间效率
一、引入空间复杂度的原因
- 我们知道,一个算法的好坏主要从算法的执行时间和所需要占用的存储空间这两个方面来进行衡量。
- 当一个算法在执行过程中存储数据所需要占用的内存空间的大小,就是空间复杂度。它和时间复杂度一样,是衡量算法性能的重要指标之一。
- 在开发程序之前,分析算法的空间复杂度有助于开发者提前预估程序运行时所需的内存空间,从而合理地规划硬件资源。
二、空间复杂度的分析
❥ 2.1 程序运行时内存大小 ~ 程序本身大小
首先我们先弄清楚什么是程序本身内存的大小,什么是程序运行时内存的大小?有什么关系?
- 程序本身内存的大小:指的是程序文件存储在磁盘等存储设备上所占用的存储空间大小。它主要取决于程序的源代码经过编译、链接等操作后生成的可执行文件所包含的内容,包括代码段、数据段等。
- 程序运行时内存的大小:指的是程序在计算机内存中运行时所占用的存储空间的量。它涉及到程序运行过程中各个方面对内存的使用,包括代码区、数据区(如全局变量、静态变量、常量)、栈区(存储函数调用信息和局部变量)和堆区(用于动态内存分配)等所占用的内存总和。
程序运行时的内存大小是包含程序本身的大小的。
- 通俗来讲,程序本身的大小好比一颗种子,而程序运行的大小就像生长后的植株。
- 程序本身就像一颗种子,其大小是固定的,蕴含着生长的潜力和信息。
- 当种子种下并开始生长后,就如同程序开始运行。当种子长成大树后,会有粗壮的树干和茂密的枝叶,需要占据很大的空间。这就像程序运行时,会在系统中展开庞大的运行架构,占用大量的内存、CPU 等资源,其运行时占据的 “空间” 和要比程序本身所占用的大得多,也有可能会随着业务的发展和数据量的增加不断扩展。
❥ 2.2 程序运行时内存大小 ~ 算法运行时内存大小
程序运行时内存大小和算法运行时内存大小有什么关系?
程序是一个更为宽泛的概念,它由多个部分组成,算法只是程序实现特定功能的核心逻辑。程序运行时,其内存占用除了算法运行所需的内存外,还包括其他诸多方面。算法运行的内存主要用于存储算法执行过程中使用的数据结构、中间变量、递归调用栈等。而程序运行内存还包含程序代码本身占用的空间(代码段)、全局和静态变量占用的空间(数据段)、程序与外部交互的输入输出缓冲区、加载的库文件所占用的内存等。
在一些非常简单的程序中,如果程序的主要功能就是执行一个单一的算法,且没有其他复杂的功能模块、全局变量、输入输出操作等,那么算法运行的内存大小可能与程序运行内存大小非常接近。例如,一个简单的控制台程序,其唯一的功能就是实现一个简单的递归算法计算斐波那契数列,此时程序运行内存主要就是算法运行所需的内存。
但在大多数实际应用中,程序运行时内存的大小通常会大于算法运行时内存的大小。
❥ 2.3 算法运行时内存大小
算法运行时内存大小主要分为以下几个部分:
输入数据空间:存储算法的输入数据
输出数据空间:存储算法的输出数据
暂存数据空间:用于存储算法在运行过程中的变量、对象、函数上下文等数据
暂存数据空间又可以分为:
- 暂存数据:保存算法运行过程中的各种常量、变量、对象等
- 栈帧空间:保存调用函数的上下文数据
- 指令空间:保存编译后的程序指令,但在统计空间复杂度时通常忽略不计
空间复杂度通常统计的是暂存数据和栈帧空间。
❥ 2.4 不考虑算法全部运行空间的原因
- 输入数据空间:
输入数据所占用的空间通常不纳入空间复杂度的考量范围。因为输入数据是算法处理的对象,它的规模是由问题本身决定的,并非算法为完成任务而额外使用的空间。
例:对一个包含n个元素的数组进行排序,数组本身占用的存储空间与算法的空间使用效率并无直接关联,所以不包含在空间复杂度的计算中。
- 程序代码空间:
程序代码本身所占用的存储空间也不影响算法的空间复杂度。代码大小是固定的,不随输入规模的变化而变化,它与算法在处理不同规模输入时的内存需求增长特性没有直接联系。无论输入规模如何,程序代码的空间占用都是恒定的,因此不将其纳入空间复杂度的计算。
- 输出数据空间:
通常而言,输出数据一般不计入空间复杂度。像常规算法的单一返回值,或是排序、查找算法的输出结果,其占用空间固定或由输入决定,不反映额外开销,可不考虑。
但当输出规模与输入紧密相关、或优化目标是输出空间时,则可能计入。
因为空间复杂度更专注于算法本身的逻辑实现对存储空间的需求,即专注于为了完成算法任务,除输入数据本身所占空间之外,算法额外需要的辅助空间大小。所以空间复杂度不考虑算法全部运行空间。
三、空间复杂度
❥ 3.1空间复杂度的定义
空间复杂度(Space Complexity)也是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度。
注意:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
❥ 3.2 空间复杂度不能准确算出空间大小的原因
- 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,是一种渐近分析,使用大O表示法描述算法在问题规模趋于无穷大时,额外存储空间随问题规模增长的趋势,而不是精确的内存使用量。
- 此外,程序运行时所占用的内存还受到很多与算法本身无关的因素影响,不同的计算机硬件环境(如内存架构、字长等)和软件环境(如操作系统的内存管理机制、编译器的优化程度等)会导致同一算法在不同环境下的实际内存占用有所不同。这会影响程序的实际内存使用,但空间复杂度分析通常不会考虑这些具体环境因素。
❥ 3.3 最关注差空间复杂度的原因
与时间复杂度不同的是,一般情况下,我们只关注最差空间复杂度,因为内存空间是有限的,我们要确保在所有输入数据下都有足够的内存空间。
四、空间复杂度的计算
空间复杂度直接计算变量个数即可,不需要程序占用了多少字节的空间。
计算变量个数的原因:
因为空间复杂度计算规则基本跟时间复杂度类似,也是使用大O渐进表示法来表示空间复杂度。
我们知道,大O渐进表示法表示的是估算值,而不是真实值,主要目的是为了算出空间复杂度属于哪个量级。
举例:
- 一个int型变量,占用空间大小是4bit,4的大小是属于常数阶的,那么它的空间复杂度为O(1)
- n个int型变量的数组,占用的空间大小是4nbit,4n的大小是属于线性阶的,那么它的空间复杂度为O(N)
所以说,为了方便计算空间复杂度的大小,我们可以直接计算变量个数。
五、常见空间复杂度举例
❥ 5.1 常数阶
常数阶的空间复杂度为:O(1)
- 当空间复杂度为O(1)的情况下,也称算法为原地工作或者就地工作。
- 原地工作(就地工作):指的是算法的执行过程中不使用额外的存储空间,或者使用的额外空间相对输入数据量是常数。即所使用的额外空间量不随问题规模(即输入数据的大小)的变化而变化。
例题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;}
}
这段冒泡排序的代码中,分别有end,i,exchange这3个新的变量出现,也就是为这3个变量开辟了空间,因为3是常数,所以冒泡排序的空间复杂度为:O(1)
例题2:
void fun()
{return 0;
}void tmp(int n)
{int i = 0;for (i = 0; i < n; i++){fun();}}
注意:在循环中初始化变量或调用函数而占用的内存,在进入下一循环后就会被释放,因此不会累积占用空间,空间复杂度仍为 𝑂(1)
❥ 5.2 线性阶
线性阶的空间复杂度为:O(N)
例题:
// 计算阶乘递归Factorial的空间复杂度
long long Fac(int N)
{if (N == 0)return 1;return Fac(N - 1) * N;
}
Fac递归函数Fac用于计算阶乘。
函数递归调用的深度为N,开辟了N个栈帧,每个栈帧使用了常数个空间。所以空间复杂度为O(N)
❥ 5.3 平方阶
平方阶的空间复杂度为:O(N^2)
例题:
long long Fac(int N)
{if (N == 0)return 1;int arr[N];return Fac(N - 1) * N;
}
在每个递归函数中都初始化了一个数组,总长度为1+2+...+(N-1)+ N = N(N+1) / 2
因为空间复杂度算的是所处的量级,所以是O(N^2)
六、递归与非递归空间复杂度
❥ 6.1 常规函数空间复杂度不重点算栈空间大小的原因
在编译阶段,编译器会根据函数的定义,分析函数中的参数、局部变量以及可能保存的寄存器信息等,从而确定函数调用时一个栈帧所需要的空间大小和布局。
例:
int add(int a, int b)
{int result;result = a + b;return result;
}
编译器知道需要为两个int类型的参数a,b,一个int类型的局部变量result,以及返回地址等分配空间。
这是对单个栈帧而言的,是一个固定的模式,不随输入规模或函数执行过程发生显著变化。在大O表示法这种渐进分析中,这部分固定大小的空间被视为常数项。
空间复杂度主要关注的是随着问题规模的增长,算法所需空间的增长趋势。对于常规函数,显式申请的额外空间,如动态分配的数组或对象等,才是随着问题规模可能呈线性、对数等不同趋势增长的部分,是影响空间复杂度的关键因素。
❥ 6.2 递归函数空间复杂度需要算栈空间大小的原因
栈在编译期间确定的是单个栈帧的空间布局,但在递归函数运行时会不断产生新的栈帧。
- 在编译时,无法确定递归函数会被调用多少次,只有在程序运行时,随着递归函数的不断调用和返回,才会实际地在栈上创建和释放栈帧,从而动态地占用和释放栈空间。
- 栈帧数量与递归深度直接相关,而递归深度往往与问题规模有关。
例:在5.2的递归计算阶乘函数,递归深度与输入的n成正比,每一层递归都要占用一定栈空间存储当前层的参数、局部变量等,所以栈空间占用会随着递归深度增加而显著增加。
总言之,递归栈空间中单个栈帧的结构和大小在编译时期是可以确定的,但递归过程中栈空间的实际创建和使用是在运行时动态进行的,并不是完全在编译时期就确定好的。空间复杂度关注的是运行时内存的大小。
七、权衡时间与空间效率
- 实际情况下,算法的时间效率和空间效率同时达到最优非常困难。
- 通常情况下,我们不太关注算法的空间效率,更注重时间效率。
- 但是,像互联网、嵌入式等行业对空间效率也是较为注重的。
- 所以,选择优化时间复杂度或者空间复杂度取决于我们的侧重方面。
相关文章:
【数据结构】空间复杂度
目录 一、引入空间复杂度的原因 二、空间复杂度的分析 ❥ 2.1 程序运行时内存大小 ~ 程序本身大小 ❥ 2.2 程序运行时内存大小 ~ 算法运行时内存大小 ❥ 2.3 算法运行时内存大小 ❥ 2.4 不考虑算法全部运行空间的原因 三、空间复杂度 ❥ 3.1空间复杂度的定义 ❥ 3.2 空…...
系统学英语 — 句法 — 复合句
目录 文章目录 目录复合句型主语从句宾语从句表语从句定语从句状语从句同位语从句 复合句型 复合句型,即:从句。在英语中,除了谓语之外的所有句子成分都可以使用从句来充当。 主语从句 充当主语的句子,通常位于谓语之前&#x…...
SQL server 数据库使用整理
标题:SQL server 数据库使用整理 1.字符串表名多次查询 2.读取SQL中Json字段中的值:JSON_VALUE(最新版本支持,属性名大小写敏感) 1.字符串表名多次查询 SELECT ROW_NUMBER() OVER (ORDER BY value ASC) rowid,value…...
*胡闹厨房*
前期准备 详细教程 一、创建项目 1、选择Universal 3D,创建项目 2、删除预制文件Readme:点击Remove Readme Assets,弹出框上点击Proceed 3、Edit-Project Setting-Quality,只保留High Fidelity 4、打开 Assets-Settings ,保留URP-HighFidelity-Renderer 和 URP-High…...
.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤
本文将详细介绍如何将一个 .NET 8 项目通过 Docker 部署到 Linux 系统中。以下步骤包括从项目的创建、Dockerfile 的编写、镜像构建、到最后在 Linux 上的容器运行。 1. 环境准备 在开始之前,请确保你已经具备以下环境: Linux 系统(如 Ubu…...
状态码对照表
别瞎自定义状态码了 1xx:信息性状态码 状态码名称使用场景100Continue客户端应继续请求,等待后续响应。101Switching Protocols服务器根据客户端的请求切换协议。102Processing服务器正在处理请求,但尚未完成。103Early Hints提供给客户端的…...
【愚公系列】《循序渐进Vue.js 3.x前端开发实践》027-组件的高级配置和嵌套
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
Autosar-Os是怎么运行的?(多核系统运行)
写在前面: 入行一段时间了,基于个人理解整理一些东西,如有错误,欢迎各位大佬评论区指正!!! 目录 1.Autosar多核操作系统 1.1多核启动过程 1.2多核运行过程 1.2.1核间任务同步 1.2.2Counte…...
WPF3-在xaml中引用其他程序集的名称空间
1. 如何在XAML里引用类库中的名称空间和类2. 小结 1. 如何在XAML里引用类库中的名称空间和类 首先需要记住一点:把类库引用到项目中是引用其中名称空间的物理基础,无论是C#还是XAML都是这样。 一旦将一个类库引用进程序,就可以引用其中的名…...
无人机红外热成像:应急消防的“透视眼”
无人机红外热成像:应急消防的“透视眼” 亲爱的小伙伴们,每年一到夏天,应急消防的战士们就像上紧了发条的闹钟,时刻准备应对各种灾害。炎热天气让火灾隐患“蹭蹭”往上涨,南北各地还有防洪救灾、台风、泥石流等灾害轮…...
飞牛NAS安装过程中的docker源问题
采用CloudFlare进行飞牛NAS的远程访问 【安全免费】无需公网IP、端口号,NAS外网访问新方法_网络存储_什么值得买 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF {"registry-mirrors": ["https://docker.1panel.dev&quo…...
python基础语法(4) ----- 学习笔记分享
目录 Python 使用库 以及 实战的一些案例 1. 标准库 1.1 认识标准库 1.2 使用import导入模块 1.3 代码示例:日期及结算 1.4 代码示例:字符串操作 1.5 代码示例 : 文件查找工具 2. 第三方库 2.1 认识第三方库 2.2 使用pip 2.3 代码示例:生成二维码 (1) 使用搜索引擎,…...
Linux 内核学习 3b - 和copilot 讨论pci设备的物理地址在内核空间和用户空间映射到虚拟地址的区别
前提知识: 可以把内核当作一个需要特殊权限运行的程序,那么不同的程序,相同的设备物理地址就会映射到不同的虚拟地址 (见Linux 内核学习 3 - 虚拟内存和物理内存)。 You said 同一个pcie 设备物理地址在linux 内核和用…...
算法【有依赖的背包】
有依赖的背包是指多个物品变成一个复合物品(互斥),每件复合物品不要和怎么要多种可能性展开。时间复杂度O(物品个数 * 背包容量),额外空间复杂度O(背包容量)。 下面通过题目加深理解。 题目一 测试链接:[NOIP2006 提…...
【Linux】 冯诺依曼体系与计算机系统架构全解
Linux相关知识点可以通过点击以下链接进行学习一起加油!初识指令指令进阶权限管理yum包管理与vim编辑器GCC/G编译器make与Makefile自动化构建GDB调试器与Git版本控制工具Linux下进度条 冯诺依曼体系是现代计算机设计的基石,其统一存储和顺序执行理念推动…...
【深度学习】 UNet详解
UNet 是一种经典的卷积神经网络(Convolutional Neural Network, CNN)架构,专为生物医学图像分割任务设计。该模型于 2015 年由 Olaf Ronneberger 等人在论文《U-Net: Convolutional Networks for Biomedical Image Segmentation》中首次提出&…...
“深入浅出”系列之算法篇:(2)openCV、openMV、openGL
OpenCV是一个的跨平台计算机视觉库,可以运行在Linux囚、Windows 和Mac OS操作系统上。它轻量级而且高效,由一系列 C函数和少量C类构成,同时也提供了Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenMV是一个开源,低成本&am…...
低代码系统-产品架构案例介绍、得帆云(八)
产品名称 得帆云DeCode低代码平台-私有化 得帆云DeMDM主数据管理平台 得帆云DeCode低代码平台-公有云 得帆云DePortal企业门户 得帆云DeFusion融合集成平台 得帆云DeHoop数据中台 名词 概念 云原生 指自己搭建的运维平台,区别于阿里云、腾讯云 Dehoop 指…...
web3py+flask+ganache的智能合约教育平台
最近在学习web3的接口文档,使用web3pyflaskganache写了一个简易的智能合约教育平台,语言用的是python,ganche直接使用的本地区块链网络,用web3py进行交互。 代码逻辑不难,可以私信或者到我的闲鱼号夏沫mds获取我的代码…...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验六----流域综合处理(超超超详细!!!)
流域综合处理 流域综合治理是根据流域自然和社会经济状况及区域国民经济发展的要求,以流域水流失治理为中心,以提高生态经济效益和社会经济持续发展为目标,以基本农田优化结构和高效利用及植被建设为重点,建立具有水土保持兼高效生态经济功能的半山区流域综合治理模式。数字高程…...
基于 WPF 平台使用纯 C# 实现动态处理 json 字符串
一、引言 在当今的软件开发领域,数据的交换与存储变得愈发频繁,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁、易读、便于解析和生成的特点,被广泛应用于各种应用程序中。在 W…...
DRF开发避坑指南01
在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…...
WordPress免费证书插件
为了在您的网站上启用HTTPS,您可以使用本插件快速获取Let’s Encrypt免费证书。 主要功能: 支持快速申请Let’s Encrypt免费证书支持通配符证书申请,每个证书最多可以绑定100个域名支持自动续期证书支持重颁发证书,证书过期或失…...
MongoDB平替数据库对比
背景 项目一直是与实时在线监测相关,特点数据量大,读写操作大,所以选用的是MongoDB。但按趋势来讲,需要有一款国产数据库可替代,实现信创要求。选型对比如下 1. IoTDB 这款是由清华大学主导的开源时序数据库&#x…...
ANSYS学习笔记(十)网格质量的诊断和提高
网格质量的好坏不能单纯只看meshing给出的网格质量结果,要根据实际的计算物理场景来判断,需要求解的地方物理量大梯度的位置网格越密越好。 网格质量:在有限网格数量限制下,离散误差小的网格是好网格,是高质量网格。网…...
能量提升法三:赞美
前情回顾: 《能量提升法二:感恩》 片段:“感恩,就像是在跟世界说:谢谢你,我收到了,我很喜欢,请多来点” 把它归还人海,就当作每一个人,都有可能是曾经帮助…...
C++中函数返回值当引用
文章目录 一、概述二、返回值当引用的基本语法三、返回局部变量的引用四、返回引用的常见用途五、返回右值引用六、总结 一、概述 在 C 中,函数返回值当引用(即返回引用)是一个常见的编程技巧。它可以让你返回一个函数内部的局部变量或对象的…...
27. C语言 强制类型转换详解
本章目录: 前言强制类型转换(Type Casting)强制类型转换的语法示例1:将整数转换为浮点数输出结果: 代码解析: 整数提升(Integer Promotion)示例2:整数提升输出结果: 代码…...
Linux 命令之技巧(Tips for Linux Commands)
Linux 命令之技巧 简介 Linux 是一种免费使用和自由传播的类Unix操作系统,其内核由林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户…...
freeswitch在centos上编译过程
操作系统:centos9-last usr/local/freeswitch/bin/freeswitch -version FreeSWITCH version: 1.10.13-devgit~20250125T131725Z~3f1e4bf90a~64bit (git 3f1e4bf 2025-01-25 13:17:25Z 64bit)vi /etc/ssh/sshd_config ip a nmtui reboot ip a curl -o /etc/pki/rpm-…...
快速入门Flink
Flink是新一代实时计算平台,采用原生的流处理系统,保证了低延迟性,在API和容错上也是做的相当完善,本文将从架构、组件栈、安装、入门程序等进行基础知识的分析,帮助大家快速对Flink有一个了解。 一.简介 1.是什么 Ap…...
c++ list
1.构造函数 构造函数 // list<T> lst; // list(beg, end); // 区间构造 // list(n, elem); // 元素构造 // list(const list &lst); // 拷贝构造#include <iostream> #include <fstream> #include <string> #include <list> using name…...
Vue 3 + TypeScript 实现父子组件协同工作案例解析
引言 在现代的前端开发中,Vue.js 作为一款流行的渐进式 JavaScript 框架,为我们构建交互式用户界面提供了强大的支持。Vue 3 的推出带来了许多新特性,尤其是组合式 API 的引入,让代码的组织和复用更加灵活。同时,TypeS…...
深度剖析C++17中的std::optional:处理可能缺失值的利器
文章目录 一、基本概念与设计理念二、构建与初始化(一)默认构造(二)值初始化(三)使用std::make_optional(四)使用std::nullopt 三、访问值(一)value()&#x…...
【ArcGIS微课1000例】0141:提取多波段影像中的单个波段
文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…...
一分钟搭建promehteus+grafana+alertmanager监控平台
为什么要自己搭建一个监控平台 平时进行后端开发,特别是微服务的后端可开发,一定少不了对接监控平台,但是平时进行一些小功能的测试又没有必要每次都手动安装那么多软件进行一个小功能的测试,这里我使用docker-compose搭建了一个…...
Transfoemr的解码器(Decoder)与分词技术
在自然语言处理(NLP)领域,解码器(Decoder)和分词技术是两个至关重要的概念。解码器是序列生成任务的核心组件,而分词则是将文本数据转换为可处理形式的基础步骤。 一、解码器(Decoder&…...
LeetCode100之在排序数组中查找元素的第一个和最后一个位置(34)--Java
1.问题描述 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题 示例1 输入…...
数字人+展厅应用方案:开启全新沉浸式游览体验
随着人们生活质量的不断提升,对于美好体验的追求日益增长。在展厅展馆领域,传统的展示方式已难以满足大众日益多样化的需求。而通过将数字人与展厅进行深度结合,可以打造数字化、智能化新型展厅,不仅能提升展示效果,还…...
echo ‘export PATH=/usr/local/bin:$PATH‘ >> ~/.bashrc这个和直接添加到/etc/profile有什么区别
echo export PATH/usr/local/bin:$PATH >> ~/.bashrc 和直接添加到 /etc/profile 都是用于修改 PATH 环境变量,但它们适用的范围和效果有所不同: 1. 修改 ~/.bashrc 文件 作用范围:~/.bashrc 是针对当前用户的配置文件,它…...
kafka消费者详细介绍(超级详细)
文章目录 一、Kafka 消费者与消费者组1.1 Kafka 消费者(Consumer)概述1.1.1 消费者工作流程1.1.2 消费者的关键配置 1.2 Kafka 消费者组(Consumer Group)概述1.2.1 消费者组的工作原理1.2.2 消费者组的优点1.2.3 消费者组的再均衡…...
《剪映5.9官方安装包》免费自动生成字幕
(避免失效建议存自己网盘后下载)剪映5.9官方Win.Mac 链接:https://pan.xunlei.com/s/VOHc-Fg2XRlD50MueEaOOeW1A1?pwdawtt# 官方唯一的免费版,Win和Mac都有,此版本官方已下架,觉得有用可转存收藏…...
CAS是什么?ABA会带来什么影响?怎么解决ABA问题?
前言 在高并发开发中,CAS(比较并交换)是一种常用的无锁操作,因其高效性而被广泛应用。然而,实际工作中常会遇到ABA问题,导致数据更新异常或逻辑错误。理解CAS的原理及ABA问题的解决方法,有助于…...
智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力
摘要:随着全球化和数字化进程的加速,消费者需求日益呈现出碎片化和个性化的趋势,这对物流运输行业提出了前所未有的挑战。传统的物流调度体系与调度方式已难以满足当前复杂多变的物流需求,因此,物流企业必须积极引入大…...
方豆子(递归)
方豆子 思路:很典的一道递归题,但当时没想到怎么递归/(ㄒoㄒ)/~~。赛后看了大佬的讲解知道要将这个图形看成由四个小正方形组成的大正方形,递归参数可以设置成(r1,c1,r2,c2,good)表示正方形的左上角坐标和右下角坐标以及当前这个正…...
Go语言入门指南(二): 数据类型
文章创作不易,麻烦大家点赞关注转发一键三连。 在上一篇文章,我们已经完成了开发环境的搭建,成功创建了第一个“Hello, World”程序,并且对变量的声明和初始化有了初步的认识。在这篇文章中,我们将主要介绍Go语言的数据…...
Django ORM解决Oracle表多主键的问题
现状 以Django 3.2为例 Django ORM 设计为默认使用单一主键(通常是自增的 id 字段),这一选择主要基于以下核心原因: 简化ORM设计与操作 统一访问方式外键关联简化 避免歧义冲突 主键语义明确防止隐式依赖 性能与数据库兼容 索引…...
学习数据结构(2)空间复杂度+顺序表
1.空间复杂度 (1)概念 空间复杂度也是一个数学表达式,表示一个算法在运行过程中根据算法的需要额外临时开辟的空间。 空间复杂度不是指程序占用了多少bytes的空间,因为常规情况每个对象大小差异不会很大,所以空间复杂…...
实验一---典型环节及其阶跃响应---自动控制原理实验课
一 实验目的 1.掌握典型环节阶跃响应分析的基本原理和一般方法。 2. 掌握MATLAB编程分析阶跃响应方法。 二 实验仪器 1. 计算机 2. MATLAB软件 三 实验内容及步骤 利用MATLAB中Simulink模块构建下述典型一阶系统的模拟电路并测量其在阶跃响应。 1.比例环节的模拟电路 提…...
从零推导线性回归:最小二乘法与梯度下降的数学原理
欢迎来到我的主页:【Echo-Nie】 本篇文章收录于专栏【机器学习】 本文所有内容相关代码都可在以下仓库中找到: Github-MachineLearning 1 线性回归 1.1 什么是线性回归 线性回归是一种用来预测和分析数据之间关系的工具。它的核心思想是找到一条直…...