数据结构:数组:插入操作(Insert)与删除操作(Delete)

目录

插入操作(Inserting in an Array)

在纸上模拟你会怎么做?

代码实现 

复杂度分析

删除操作(Deleting from an Array)

在纸上模拟一下怎么做?

代码实现

复杂度分析


插入操作(Inserting in an Array)

我们要讲的是:在一个数组中插入一个新元素,在任意合法的位置上,保持其他元素的顺序不乱。

给定一个数组:

A = [2, 4, 6, 8, 10]

现在你希望:在第 索引 2(也就是元素 6 之前)插入一个数字 99。

A = [2, 4, 99, 6, 8, 10]

在纸上模拟你会怎么做?

如果你用笔把这些数字排在格子里,加入一个空格,你会发现:

✅ 第一步:把从第2个位置开始的元素都向后移动一格,为99腾出位置。

[2][4][ ][6][8][10]↑插入位

你需要从右往左这样搬:

10 → [5] → [6]8 → [4] → [5]6 → [3] → [4]

✅ 第二步:然后把 99 放到空出的位置上(索引 2)

[2][4][99][6][8][10]

代码实现 

你在做的是 一个插入操作,其本质逻辑是:

📌 思路:

从最后一个元素开始,逐个后移,直到你腾出目标位置为止,然后放入新元素。

插入操作的本质:

  1. 从插入位置开始,所有后面的元素向后移动一格

  2. 把新元素插入目标位置

  3. 长度 + 1

 假设我们要在数组 A 中,插入 value 到索引 pos:

void insert(int A[], int& length, int pos, int value) {// 1. 从最后一个元素开始,向后搬运for (int i = length - 1; i >= pos; i--) {A[i + 1] = A[i];  // 向后挪一格}// 2. 把新值放进去A[pos] = value;// 3. 长度+1length++;
}

注意事项与边界处理

细节说明
插入位置是否合法?必须满足 0 ≤ pos ≤ length
数组是否已满?如果是静态数组,你必须预留空间
是否需要手动调整 length?是的,插入后 length+1
插入到尾部?就是 A[length] = value

复杂度分析

时间复杂度分析 

移动次数依赖于插入位置

插入位置 pos向后移动的元素个数最坏的移动数
最前面(pos = 0n 个元素需要后移✅ 最坏情况 O(n)
中间(pos = n/2n/2 个元素后移平均情况 O(n)
最末尾(pos = n0 个元素移动✅ 最好情况 O(1)
情况移动次数复杂度
最好情况(末尾插入)0 次移动O(1)
最坏情况(头部插入)n 次移动O(n)
平均情况≈ n/2 次移动O(n)

 ✅ 因此,插入操作的总体时间复杂度为:O(n)

空间复杂度分析

  • 如果你在原数组中操作(已有多余空间),空间复杂度是 O(1)(只需要一个临时变量)

  • 如果你在 动态扩容数组 中插入(如 std::vector),插入时如果超容量,可能要分配新内存,空间复杂度变为 O(n)(拷贝新数组)


删除操作(Deleting from an Array)

在一个数组中删除某个位置上的元素,并保持其他元素的顺序不变。

A = [2, 4, 6, 8, 10]

你希望从中删除索引为 2 的元素 6,目标是:

A = [2, 4, 8, 10]

在纸上模拟一下怎么做?

你可以把数组想象成一排格子,每个格子装着一个数:

[2][4][6][8][10]↑ 要删掉的元素

你不能真正“删掉”一个格子 —— 因为数组的长度是固定的

你只能“覆盖”它。

你可以从删除位置的下一个元素开始,把它们往前搬一格,覆盖前面的内容:

从后往前搬目标
A[3] = 8 → A[2]覆盖 6
A[4] = 10 → A[3]覆盖 8
[2][4][8][10][10]

(最后一个 10 是重复的,可以忽略,或者设置为0、垃圾值)

代码实现

删除操作的本质:

删除数组中某个位置的元素,需要从后往前逐个移动元素来“填空”,最后更新长度。 

删除过程:

  1. pos+1 开始,把所有元素向前搬一格

  2. 覆盖掉被删除的元素

  3. 更新数组长度

void deleteAt(int A[], int& length, int pos) {// 1. 从 pos+1 开始,向前搬一格for (int i = pos + 1; i < length; i++) {A[i - 1] = A[i];}// 2. 长度减 1length--;
}

边界与注意事项

检查项说明
删除位置是否有效?0 ≤ pos < length
是否需要更新数组长度?是的,必须减 1
是否要清空最后一个位置?通常不用,逻辑上长度变短即可

复杂度分析

时间复杂度

要移动多少个元素?需要花多少时间?

情况一:删除第一个元素(pos = 0

你需要移动全部 n−1 个元素(A[1] → A[0], A[2] → A[1], ..., A[n−1] → A[n−2])

所以:移动次数 = n - 1 → 最坏情况

时间复杂度:O(n) 

情况二:删除中间位置(pos = n/2

你需要移动一半的元素(从 pos+1 到 n−1)

 移动次数 ≈ n/2

时间复杂度仍是 O(n)(常数系数不影响阶) 

情况三:删除最后一个元素(pos = n - 1

你不需要移动任何元素,直接逻辑删除即可

移动次数 = 0

最好情况:O(1)

平均时间复杂度

如果删除位置是随机的,每个位置被删除的概率相同,那平均要移动:

结论:平均移动次数是 (n - 1)/2

🕒 平均时间复杂度也是 O(n)

空间复杂度

  • 你没有开辟任何新空间

  • 所有操作都是在原数组上完成

空间复杂度:O(1)(常数)

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

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

相关文章

Qt之修改纯色图片的颜色

这里以修改QMenu图标颜色为例,效果如下: MyMenu.h #ifndef MYMENU_H #define MYMENU_H#include <QMenu>class MyMenu : public QMenu { public:explicit MyMenu(QWidget *parent = nullptr);protected:void mouseMoveEvent(QMouseEvent *event) override; };#endif /…

uni-app实现单选,多选也能搜索,勾选,选择,回显

前往插件市场安装插件下拉搜索选择框 - DCloud 插件市场&#xff0c;该插件示例代码有vue2和vue3代码 是支持微信小程序和app的 示例代码&#xff1a; <template><view><!-- 基础用法 --><cuihai-select-search:options"options"v-model&quo…

【机器学习深度学习】 微调的十种形式全解析

目录 一、为什么要微调&#xff1f; 二、微调的 10 种主流方式 ✅ 1. 全参数微调&#xff08;Full Fine-tuning&#xff09; ✅ 2. 冻结部分层微调&#xff08;Partial Fine-tuning&#xff09; ✅ 3. 参数高效微调&#xff08;PEFT&#xff09; &#x1f538; 3.1 LoRA&…

信刻光盘安全隔离与文件单向导入/导出系统

北京英特信网络科技有限公司成立于2005年&#xff0c;是专业的数据光盘摆渡、刻录分发及光盘存储备份领域的科技企业&#xff0c;专注为军队、军工、司法、保密等行业提供数据光盘安全摆渡、跨网交换、档案归档检测等专业解决方案。 公司立足信创产业&#xff0c;产品国产安全可…

Python-标准库-os

1 需求 2 接口 3 示例 4 参考资料 在 Python 中&#xff0c;os&#xff08;Operating System&#xff09;模块是一个非常重要的内置标准库&#xff0c;提供了许多与操作系统进行交互的函数和方法&#xff0c;允许开发者在 Python 程序中执行常见的操作系统任务&#xff0c;像文…

OpenCV CUDA模块设备层-----在 GPU 上执行类似于 std::copy 的操作函数warpCopy()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模块&#xff08;cudev&#xff09; 中的一个设备端内联模板函数&#xff0c;用于在 GPU 上执行类似于 std::copy 的操作&#xff…

Vue Router 中$route.path与 params 的关系

1. params 参数的本质&#xff1a;路径的动态片段在 Vue Router 中&#xff0c;params 参数是通过路由配置的动态路径片段定义的&#xff0c;例如&#xff1a;// 路由配置{ path: /user/:id, component: User }当访问/user/123时&#xff0c;/user/123是完整的路径&#xff0c;…

React 极简响应式滑块验证组件实现,随机滑块位置

&#x1f3af; 滑块验证组件 (Slider Captcha) 一个现代化、响应式的滑块验证组件&#xff0c;专为 React 应用设计&#xff0c;提供流畅的用户体验和强大的安全验证功能。 ✨ 功能特性 &#x1f3ae; 核心功能 智能滑块拖拽 – 支持鼠标和触摸屏操作&#xff0c;响应灵敏随…

STM32第十六天蓝牙模块

一&#xff1a;蓝牙模块HC-05 1&#xff1a;硬件引脚配置&#xff1a; | 标号 | PIN | 说明 | |------|-------|---------------------------------------| | 1 | START | 状态引出引脚&#xff08;未连接/连接输出信号时&#xff09; |…

时序数据库IoTDB用户自定义函数(UDF)使用指南

1. 编写UDF时序数据库IoTDB为用户提供了编写UDF的JAVA API&#xff0c;用户可以自主实现UDTF&#xff08;用户自定义转换函数&#xff09;类&#xff0c;IoTDB将通过类加载机制装载用户编写的类。Maven依赖如果使用Maven&#xff0c;可以从Maven库中搜索以下依赖&#xff0c;并…

Linux国产与国外进度对垒

Linux国产与国外进度对垒 引言国产Linux的发展现状国外Linux的发展现状技术对比国产Linux的挑战与机遇国外Linux的优势与局限结论 引言 简述Linux在全球操作系统市场中的地位国产Linux的发展背景与意义国外主流Linux发行版的现状 国产Linux的发展现状 主要国产Linux发行版介…

Jenkins-Email Extension 插件插件

Editable Email Notification Editable Email Notification 是 Jenkins 的 Email Extension 插件的核心功能&#xff0c;用于自定义邮件通知&#xff0c;包括邮件主题、内容、收件人、发件人等 属性 1.Project From 项目发件人&#xff0c;设置邮件的发件人地址 **注意&…

windows系统下将Docker Desktop安装到除了C盘的其它盘中

windows系统下安装docker会自动安装到C盘&#xff0c;可以采用下面的方法将其安装到其它盘中1、先下载Docker Desktop安装程序Docker Desktop Installer.exe&#xff0c;比如你下载到了C:\Users\YourUsername\Downloads 文件夹中。 2、打开 PowerShell 进入C:\Users\YourUser…

视频工具箱 1.1.1 |小而美的视频处理工具,支持多种常用功能

VideoTools是一款基于FFmpeg的小而美的视频处理工具&#xff0c;专为需要快速高效地进行视频编辑的用户设计。这款工具无需安装&#xff0c;体积仅约200KB&#xff0c;提供了视频压缩、格式转换、转GIF、修改分辨率、加速播放以及音频提取等多种常用功能。其用户界面简洁直观&a…

无人机集群搜索技术全面解析

无人机集群搜索是指通过多架无人机协同工作&#xff0c;实现对目标区域的高效覆盖与快速探测。这项技术通过模拟自然界生物群体的集体行为&#xff0c;利用分布式控制和自主决策算法&#xff0c;使无人机集群能够自组织地完成复杂搜索任务。下面从核心技术、应用场景、算法实现…

【Elasticsearch】深度分页及其替代方案

深度分页及其替代方案 1.深度分页2.为什么不推荐深度分页2.1 性能问题&#xff08;核心原因&#xff09;2.2 资源消耗对比2.3 实际限制 3.深度分页的替代方案3.1 方案一&#xff1a;Search After&#xff08;推荐&#xff09;3.1.1 为什么 Search After 性能更高3.1.2 技术原理…

论文阅读笔记——VGGT: Visual Geometry Grounded Transformer

VGGT 论文 输入是 N 个 RGB 图像 I i ∈ R 3 H W I_i\in\mathbb{R}^{3HW} Ii​∈R3HW 的序列 ( I i ) i 1 N (I_i)^N_{i1} (Ii​)i1N​&#xff0c;观察相同 3D 场景。 VGGT 的 Transformer 是一个映射函数&#xff0c;将此序列映射为一组对应的 3D 标注&#xff0c; f ( …

【嵌入式电机控制#11】PID控制入门:对比例算法应用的深度理解

接下来内容需要数学功底&#xff0c;并且有现成结论的内容不做推导&#xff0c;重在讲解工程实践中的方法论&#xff0c;建议控制类专业或学习过相关理论的人阅读 一、开闭环系统 &#xff08;1&#xff09;开环控制系统&#xff1a;被控对象输出对控制器的输出没有影响 &…

多视图几何:本质矩阵与基础矩阵

文章目录 1. 前置知识1.1. 向量叉乘1.2. 混合积1.3. 引理证明 2. 本质矩阵3. 基础矩阵4. 应用例子 1. 前置知识 1.1. 向量叉乘 假设 a ( a x a y a z ) \mathbf{a} \begin{pmatrix} a_x \\ a_y \\ a_z \end{pmatrix} a ​ax​ay​az​​ ​ 以及 b ( b x b y b z ) \mat…

Hive集群之间迁移的Linux Shell脚本

新旧 Hive 集群之前数据迁移单表脚本 migrate_hive_single_table.sh #!/bin/bash#配置参数 OLD_NAMENODE"hdfs://<old-namenode>:<old-port>" EXPORT_PATH"/tmp/hive-export/dm" NEW_DB"dm_events" TABLE_NAME"dm_usereventfi…