数组的删除与插入优化思路

server/2024/10/21 9:09:31/

数据结构:线性表、非线性表

线性表: 数组,链表、队列、栈等。
线性表就是数据排成像一条线一样的结构,每个线性表上的数据最多只有前和后两个方向。
非线性表: 二叉树、堆、图等。
在非线性表中,数据之间并不是简单的前后关系。

数组

数组:在内存中分配一段连续的空间,且数据类型相同。
数组为什么能够实现通过下标来访问数据的速度为O(1)?
在这段连续的内存中的下标就是一个内存格子的偏移量,所以下标总是从0开始。(当然原因也不全是这样,但不重要)
为什么要用偏移量,为什么下标从0开始,为什么不从1开始?
因为效率原因
cpu寻址, 首地址–>第一个数据类型所占大小–>第二个数据类型所占大小–>第三个数据类型所占大小
计算公式:cpu寻址应该偏移多少 = 首地址 + (第几个数据 * 单个数据大小)
若下标为1开始时:
寻a[5]时cpu计算公式:首地址 + ( (5-1) * 单个数据大小)
若下标为0开始时:
寻a[5]时cpu计算公式:首地址 + (5 * 单个数据大小)
相比之下,下标从0开始让cpu省去了一个减法运算,虽然对cpu来说,所有运算都只有加法,但要实现减法用补码的方式计算,肯定要比单纯的加法计算要慢。
在这里插入图片描述

如何优化数组的插入和删除速度?

时间消耗主要原因:
插入数据:在数组中间某个位置插入数据,所有在该数据后面的数据都要向后偏移一位。
删除数据:在数组中间某个位置删除数据,所有在该数据后面的数据都要向前偏移一位。
以上是正常情况下所发生的,如果频繁的插入和删除,按照这种模式,效率肯定会下降。最坏的情况是O(n)。

可利用的优化规律: 如果是在数组的尾部新增(删除)一个数据,就不需要偏移其他数据。
插入: 新数据插入某位置时,将原位置上的数据复制并插入到数组尾部,新数据就可覆盖某处位置了。
删除/插入: 如果出现连续删除几个数据,记录删除的元素,把删除三次合并为删除一次,只需要偏移一次数据,避免偏移3次,提升了删除效率。

容器可以完全替代数组吗?

如果我们申请了大小为 10 的数组,当第 11 个数据需要存储到数组中时,我们就需要重新分配一块更大的空间,将原来的数据复制过去,然后再将新的数据插入,这是容器的好处,动态扩容
这样确实方便,但如果你知道数组中只需要多少空间的时候,最好使用数组。
数组中指定数据大小可以省掉很多次内存申请和数据搬移操作,更加高效。
这时候要根据情况去权衡,但如果你说,我不差这点效率,那你随意。


http://www.ppmy.cn/server/7685.html

相关文章

ElasticSearchDSL

ElasticSearchDSL DSL Query的分类DSL Query基本语法全文检索查询:精确查询地理查询复合查询 elasticsearch中的相关性打分算法是什么?Function Score Query复合查询 Boolean Query排序分页 DSL Query的分类 查询所有:查询出所有数据&#x…

python网页篇

爬取网页动态数据通常涉及到JavaScript渲染的内容,这类数据并不是在原始HTML文档中直接提供的,而是通过AJAX请求、WebSocket通信或者其他客户端渲染技术生成的。以下是几种常见的处理方法: 方法1:使用带有JavaScript渲染功能的库 …

【ETOJ P1023】同鱼系 题解(数学+取余)

题目描述 给定一个大小为 n n n 的数组 a a a 和一个整数 k k k。 你可以执行以下操作任意次(0次也行): 选择一个下标 i i i 满足 1 ≤ i ≤ n − k 1 \leq i \leq n-k 1≤i≤n−k,然后交换 a i a_i ai​ 和 a i k a_{ik} aik​。…

【保姆级讲解下gateway基本配置】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

LinkedList和链表

1.ArrayList的缺陷 ArraryList由于底层是一段连续的空间,所以在ArrayList任意位置插入或者删除元素时,就 需要将后续元素往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较…

低配置的电脑上刷新WPF DataGrid 很卡,如何优化?

要优化低配置电脑上WPF DataGrid的刷新卡顿问题,可以尝试以下几种方法: 启用虚拟化技术: VirtualizingStackPanel.IsVirtualizing"True" 。 WPF DataGrid支持行虚拟化,这意味着只有当前可见的行会被加载和渲染&#xf…

OpenHarmony实战开发-Axios获取解析网络数据。

介绍 本示例介绍使用第三方库的Axios获取GBK格式的网络数据时,通过util实现GBK转换UTF-8格式。该场景多用于需要转换编码格式的应用。 效果图预览 使用说明 直接进入页面就可获取GBK格式的用户名信息并进行解码操作。 实现思路 1.使用第三方库Axios获取网络数据…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络,如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息,一般是通过…