100万个成员的数组取第一个和最后一个有性能差距吗?

LSTM模型股价波动率预测(含Python代码) 源代码文件可在gzh’finance褪黑素'回复【24012203】获取。 阅读详情

数组几乎可以是所有软件工程师最常用到的数据结构,正是因为如此,很多开发者对其不够重视.

而面试中经常有这样一类问题: 「100万个成员的数组取第一个和最后一个有性能差距吗?为什么?」

除此之外,我们在平时的业务开发中会经常出现数组一把梭的情况,大多数情况下我们都会用数组的形式进行操作,而有读源码习惯的开发者可能会发现,在一些底层库中,我们可能平时用数组的地方,底层库却选择了另外的数据结构,这又是为什么?

希望大家带着以上的问题我们进行讨论.

什么是数组

数组是计算机科学中最基本的数据结构了,绝大多数编程语言都内置了这种数据结构,也是开发者最常见的数据结构.

数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储.

当然,在一些动态语言中例如Python的列表或者JavaScript的数组都可能是非连续性的内存,也可以存储不同类型的元素.

比如我们有如下一个数组:

arr = [1, 2, 3, 4, 5]

其在内存中的表现应该是这样的:

我们可以看到,这个数组在内存中是以连续线性的形式储存的,这个连续线性的储存形式既有其优势又有其劣势,只有我们搞清楚优劣才能在以后的开发中更好地使用数组.

数组的特性

一个数据结构通常都有「插入、查找、删除、读取」这四种基本的操作,我们会逐一分析这些操作带来的性能差异.

首先我们要辨析一个概念--性能.

这里的性能并不是绝对意义上速度的快慢,因为不同的设备其硬件基础就会产生巨大的速度差异,这里的性能是我们在算法分析中的「复杂度」概念.

插入性能

我们已经知道数组是一段连续储存的内存,当我们要将新元素插入到数组k的位置时呢?这个时候需要将k索引处之后的所有元素往后挪一位,并将k索引的位置插入新元素.

我们看到这个时候需要进行操作的工作量就大多了,通常情况下,插入操作的时间复杂度是O(n).

删除性能

删除操作其实与插入很类似,同样我要删除数组之内的k索引位置的元素,我们就需要将其删除后,为了保持内存的连续性,需要将k之后的元素通通向前移动一位,这个情况的时间复杂度也是O(n).

 

查找性能

比如我们要查找一个数组中是否存在一个为2的元素,那么计算机需要如何操作呢?

如果是人的话,在少量数据的情况下我们自然可以一眼找到是否有2的元素,而计算机不是,计算机需要从索引0开始往下匹配,直到匹配到2的元素为止.

这个查找的过程其实就是我们常见的线性查找,这个时候需要匹配的平均步数与数组的长度n有关,这个时间复杂度同样是O(n).

读取性能

我们已经强调过数组的特点是拥有相同的数据类型和一块连续的线性内存,那么正是基于以上的特点,数组的读取性能非常的卓越,时间复杂度为O(1),相比于链表、二叉树等数据结构,它的优势非常明显.

那么数组是如何做到这么低的时间复杂度呢?

假设我们的数组内存起始地址为start,而元素类型的长度为size,数组索引为i,那么我们很容易得到这个数组内存地址的寻址公式:

arr[i]_address = start + size * i

比如我们要读取arr[3]的值,那么只需要把3代入寻址公式,计算机就可以一步查询到对应的元素,因此数组读取的时间复杂度只有O(1).

性能优化

我们已经知道除了「读取」这一个操作以外,其他操作的时间复杂度都在O(n),那么有没有有效的方法进行性能优化呢?

查找性能优化

当数组的元素是无序状态下,我们只能用相对不太快的线性查找进行查找,当元素是有序状态(递增或者递减),我们可以用另一种更高效的方法--二分查找.

假设我们有一个有int类型组成的数组,以递增的方式储存:

arr = [1, 2, 3, 4, 5, 6, 7]

如果我们要查找值为6元素,按照线性查找的方式需要根据数组索引从0依次比对,直到碰到索引5的元素.

而二分查找的效率则更高,由于我们知道此数组的元素是有序递增排列的:

  1. 我们可以取一个索引为3的元素为中间值p
  2. 将p与目标值6进行对比,发现p的值4<6,那么此时由于是递增数组,目标值一定在索引3之后的元素中
  3. 此时,再在索引3之后到尾部的元素中取出新的中间值p与目标值比对,再重复下去,直到找到目标值

我们可以发现这样的操作每一次对比都能排除当前元素数量一半的元素,整体下来的时间复杂度只有O(log n),这表示此方法的效率极高.

这种高效的方法在数据量越大的情况下,越能体现出来,比如目前有一个10亿成员的数组是有序递增,如果按照线性查找,最差的情况下需要10亿此查找操作才能找到结果,而二分查找仅仅需要7次.

插入性能优化

比如有以下数组,我们要将一个新成员orange插入索引1的位置,通常情况下需要后三位成员后移,orange占据索引1的位置.

但是如果我们的需求并不一定需要索引的有序性呢?也就是说,我们可以把数组当成一个集合概念,我们可以在索引1的位置插入orange并在数组的尾部开辟一个新内存将原本在1位置的banana存入新内存中,这样虽然索引的乱了,但是整个操作仅仅需要O(1)的时间复杂度.

arr = ['apple', 'banana', 'grape', 'watermelon']

删除性能优化

删除操作需要将产出位置后的元素集体向前移动,这非常消耗性能,尤其是在频繁的删除、插入操作中更是如此。

我们可以先记录下相关的操作,但是并不立即进行删除,当到一定的节点时我们再一次性依据记录对数组进行操作,这样数组成员的反复频繁移动变成了一次性操作,可以很大程度上提高性能.

这个思想应用非常广泛:

  1. 前端框架的虚拟DOM就是将对DOM的大量操作先储存在差异队列中,然后再一次性更新,避免了DOM的回流和重绘.
  2. V8和JVM中的标记清除算法也是基于此思想,标记清除算法分为两个阶段,标记阶段对访问到的对象都打上一个标识,在清除阶段发现某个对象没有标记则进行回收.

小结

回到题目中的问题,我们现在已经可以很清楚地知道「100万个成员的数组取第一个和最后一个是否有性能差距」,答案显然是没有,因为数组是一块线性连续的内存,我们可以通过寻址公式一步取出对应的成员,这跟成员的位置没有关系.

最后我们经常在面试或者LeetCode中碰到这样一类问题,即数组中的子元素问题.

比如: 给定一个整数数组,计算长度为 'k' 的连续子数组的最大总和。

什么方法可以尽可能地降低时间复杂度?说出你的思路即可.

达梦数据库连接报错6001网络通信异常 本文主要记录客户端连接达梦数据库报错6001网络通信异常问题分析过程、问题原因以及问题解决方法。 阅读详情

相关推荐

Yolov26 在 Rk3588 上的 Rknn Onnx 部署实践(模型转换)

本文详细介绍了将YOLOv26 ONNX模型转换为RKNN模型的过程,适用于RK3588平台。主要内容包括:1)量化数据集的创建,通过随机抽取最多400张JPG图片生成校准数据集;2)ONNX转RKNN的完整脚本,支持多种量化方式和平台适配;3)模型转换的参考调用方式;4)模型结构对比展示。文章还提供了注意事项,强调量化数据集图片尺寸、mean/std值需与实际推理一致,并给出精度优化建议。该转换流程为YOLOv26模型在RK3588上的高效部署提供了完整解决方案。

qq_64366203的博客 1125

数组: 100万个成员的数组取第一个和最后一个有性能差距吗?

数组: 100万个成员的数组取第一个和最后一个有性能差距吗? 本文首发于微信公众号「程序员面试官」 数组几乎可以是所有软件工程师最常用到的数据结构,正是因为如此,很多开发者对其不够重视. 而面试中经常有这样一类问题: 「100万个成员的数组取第一个和最后一个有性能差距吗?为什么?」 除此之外,我们在平时的业务开发中会经常出现数组一把梭的情况,大多数情况下我们都会用数组的形式进行操作,而有读源码习惯...

XunZhaoHaiLan的博客 911

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 746

JavaSE学习(Day01)【变量、常量、包机制、方法的重载、数组】

Day01 文章目录Day01Java的第一个程序变量变量的基础类型整数类型:浮点型:字符型:boolean类型:类型转换强制转换自动转换注意:变量作用域变量的命名规则常量定义示例常量命名规则Java的包机制建包导包方法静态方法非静态方法方法的重载递归数组声明数组变量的两种方法创建数组:用new操作符获取数组长度数组的初始化 Java的第一个程序 public class HelloWorld {...

weixin_42889562的博客 374

OpenClaw Browser Relay Extension 鉴权失败与 invalid handshake 问题的终极解决方案

在使用 OpenClaw 浏览器插件 (Browser Relay Extension) 时,许多用户可能会遇到两个主要问题:一是配置端口错误导致的连接失败,二是鉴权失败 (Gateway token rejected)。本文将详细解析这两个问题并提供解决方案。

gerryke的blog 5556

实战测评:4大搜索API(You.com/Tavily/Exa/Perplexity)谁更适合你的AI项目?附Python调用代码

本文实战测评了You.com、Tavily、Exa和Perplexity四大搜索API在AI项目中的集成应用,详细对比了它们的技术特性和Python调用方法。针对LLM实时数据需求,You.com的优化设计表现突出,支持32k大上下文窗口和快速响应。文章提供了完整的代码示例和场景化选型建议,帮助开发者高效集成搜索API到AI项目中。

weixin_42569329的博客 478

JavaScript 中 你需要知道的有关于数组的详细知识点

JavaScript 中你需要知道的有关于数组的详细知识点 1、ES6 新增数组方法 Array.from()、Array.of()、copyWithin()、find()、findIndex()、fill()、entries()、keys()、values()、includes()。 2、ES5 新增数组方法 forEach()、map()、filter()、some()、every()、indexOf()、lastIndexOf()、reduce()、reduceRight()。 3、数组的这些方法,哪

guoqkmiss的博客 493

打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1 minimal

编译打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1

qq_42013533的博客 2616

C语言数组

C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。内容:数组的作用,数组的声明,数组的初始化,访问数组元素,字符型数组,一维数组名,数组作为函数的参数,数组作为函数的返回值,二维数组,二维数组名。

novice_qing的博客 1261

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6409

基于Simulink的新能源汽车热管理系统设计与仿真详细介绍

新能源汽车(如纯电动汽车和混合动力汽车)的热管理系统是确保电池、电机和电控系统高效运行的关键。通过合理设计热管理系统,可以提高车辆的续航里程、延长电池寿命并提升整体性能。以下是如何在 MATLAB 和 Simulink 中设计并仿真一个新能源汽车热管理系统的详细步骤。通过上述步骤,我们成功设计并实现了基于 Simulink 的新能源汽车热管理系统。该系统能够根据目标温度和实际反馈,通过 PID 控制器或模糊控制器调整冷却液流量、风扇转速等参数,实现对电池、电机和车内的精确温度控制。

xiaoheshang_123的博客 383

int数组最多多少个元素_*LeetCode每日一题--215. 数组中的第K个最大元素(Java)

DailyChallenge215. 数组中的第K个最大元素Medium20200629Description在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。1说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。Solution基于快速排序的选择方法我们可以用快速排序来解决这个问题,先对原数组排序,再返回倒...

weixin_39581571的博客 292

【异常】‘build.plugins.plugin.version‘ for org.apache.maven.plugins:maven-resources-plugin is missing

maven-compiler-plugin 插件版本信息没有指定导致了错误提示如下字面意思就是没有指定版本信息。

奶爸的编程之路,也就一周冷个三天 4599

面试官:100万个成员的数组取第一个和最后一个有性能差距吗?

数组几乎可以是所有软件工程师最常用到的数据结构,正是因为如此,很多开发者对其不够重视. 而面试中经常有这样一类问题: 「100万个成员的数组取第一个和最后一个有性能差距吗?为什么?」 除此之外,我们在平时的业务开发中会经常出现数组一把梭的情况,大多数情况下我们都会用数组的形式进行操作,而有读源码习惯的开发者可能会发现,在一些底层库中,我们可能平时用数组的地方,底层库却选择了另外的数据结构,这又...

求关注 764

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

面试官: 100万个成员的数组取第一个和最后一个有性能差距吗?

什么是数组数组是计算机科学中最基本的数据结构了,绝大多数编程语言都内置了这种数据结构,也是开发者最常见的数据结构.数组(英语:Array),是由相同类型的元素(element)的集合所组成的数据结构,分配一块连续的内存来存储.当然,在一些动态语言中例如Python的列表或者JavaScript的数组都可能是非连续性的内存,也可以存储不同类型的元素.比如我们有如下一个数组:ar...

465

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java 数组最后一个_面试官: 100万个成员的数组取第一个和最后一个有性能差距吗?...

本文首发于微信公众号「程序员面试官」数组几乎可以是所有软件工程师最常用到的数据结构,正是因为如此,很多开发者对其不够重视.而面试中经常有这样一类问题: 「100万个成员的数组取第一个和最后一个有性能差距吗?为什么?」除此之外,我们在平时的业务开发中会经常出现数组一把梭的情况,大多数情况下我们都会用数组的形式进行操作,而有读源码习惯的开发者可能会发现,在一些底层库中,我们可能平时用数组的地方,底层库...

weixin_29219539的博客 238

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

.net中根据索引取集合中的值_面试官:100万个成员的数组取第一个和最后一个有性能差距吗?...

专注于Java领域优质技术,欢迎关注作者:寻找海蓝96数组几乎可以是所有软件工程师最常用到的数据结构,正是因为如此,很多开发者对其不够重视.而面试中经常有这样一类问题: 「100万个成员的数组取第一个和最后一个有性能差距吗?为什么?」除此之外,我们在平时的业务开发中会经常出现数组一把梭的情况,大多数情况下我们都会用数组的形式进行操作,而有读源码习惯的开发者可能会发现,在一些底层库中,我们可能平时用...

weixin_27960253的博客 155

获取数组最后一个元素_数组基础知识:100万成员的数组取第一和最后一个有性能差距吗?...

数组几乎可以是所有软件工程师最常用到的数据结构,正是因为如此,很多开发者对其不够重视.而面试中经常有这样一类问题: 「100万个成员的数组取第一个和最后一个有性能差距吗?为什么?」除此之外,我们在平时的业务开发中会经常出现数组一把梭的情况,大多数情况下我们都会用数组的形式进行操作,而有读源码习惯的开发者可能会发现,在一些底层库中,我们可能平时用数组的地方,底层库却选择了另外的数据结构,这又是为什么...

weixin_39569753的博客 182

dict keys 取最后一个_面试官: 100万成员的数组取第一和最后一个有性能差距吗?...

寻找海蓝读完需要7分钟速读仅需3分钟数组几乎可以是所有软件工程师最常用到的数据结构,正是因为如此,很多开发者对其不够重视.而面试中经常有这样一类问题: 「100万个成员的数组取第一个和最后一个有性能差距吗?为什么?」除此之外,我们在平时的业务开发中会经常出现数组一把梭的情况,大多数情况下我们都会用数组的形式进行操作,而有读源码习惯的开发者可能会发现,在一些底层库中,我们可能平时用数组的地...

weixin_39669982的博客 149

py 数组最后一个_数组基础知识:100万成员的数组取第一和最后一个有性能差距吗?...

数组几乎可以是所有软件工程师最常用到的数据结构,正是因为如此,很多开发者对其不够重视.而面试中经常有这样一类问题: 「100万个成员的数组取第一个和最后一个有性能差距吗?为什么?」除此之外,我们在平时的业务开发中会经常出现数组一把梭的情况,大多数情况下我们都会用数组的形式进行操作,而有读源码习惯的开发者可能会发现,在一些底层库中,我们可能平时用数组的地方,底层库却选择了另外的数据结构,这又是为什么...

weixin_30744725的博客 132

数组去重性能优化:为什么Set和Object哈希表的效率最高

数组去重过程中,本质可以简化为遍历原数组,然后通过去重算法判断是否重复,重复就去除,不重复就添加,所以综合复杂度一定是O(n)*x,x是去重算法的时间复杂度。Set和Object哈希表去重的时间复杂度正好是O(1),如果还要进一步优化,就需要再在去重算法上下功夫了。

RenGJ010617的博客 7642

c++数组和 vector访问执行性能比较

最近在刷leetcode时,发现对一组数据频繁操作,数组的效率比 vector快很多,让习惯用vector的我着实有点懵,于是做了一下实验 windows上执行 首先,我在win10上用vs2015,将数组和vector分别对数组进行10万次操作,结果很明显。 下面是运行代码: #include<iostream> #include<windows.h> #include< vector > #include< algorithm > #include.

h799710的博客 1万+

C#内联数组到底能快多少?:实测Span<T>、stackalloc与传统数组的性能差距

实测C#内联数组在高性能场景下的表现,对比Span<T>、stackalloc与传统数组的性能差距。涵盖栈上分配、减少GC压力等优势,助力C#内联数组性能提升编程实践。数据说话,值得收藏

ByteGlow的博客 933

Python和C++的性能差距通常在一个数量级以上

Python作为解释型语言,其执行过程通过解释器逐行翻译为机器码,运行时动态类型检查和垃圾回收等机制带来额外开销。C++作为编译型语言,代码直接编译为优化后的机器指令,类型系统在编译期确定,避免了运行时类型检查。集成高性能库如NumPy、TensorFlow等,这些库底层用C/C++实现,通过Python接口调用可大幅减少性能损失。内存管理方面,Python采用自动垃圾回收机制,而C++允许手动控制内存分配与释放。使用Cython可将Python代码编译为C扩展,获得接近原生C++的性能。

xfmtznfl2165pv的博客 300

别再让MATLAB偷偷变慢!实测三种数组赋值写法,性能差距竟有上千倍

在MATLAB的世界里,性能优化往往隐藏在日常编码习惯的细微之处。那些看似无害的数组赋值操作,可能正在悄无声息地拖慢你的程序。本文将带你深入三种常见赋值写法的性能差异,揭示那些教科书上很少提及但实际影响巨大的效率陷阱。让我们从一个简单的正弦函数计算开始,对比三种不同赋值方式的性能表现。当处理多维数组时,不当的赋值操作会导致更严重的性能问题。预分配的优势在大型数组操作中尤为明显,1e7次循环节省时间超过99.9%。让我们看一个实际的图像处理案例,比较不同实现方式的性能差异。

dengyiyu5280的博客 421

面试题汇总

100万个成员的数组取第一个和最后一个有性能差距吗? 参考链接:https://www.jqhtml.com/57474.html 虚拟DOM 参考链接:https://blog.youkuaiyun.com/suhuaiqiang_janlay/article/details/80256561 ...

木槿之夏 250
上一篇: Java高并发手册,值得收藏学习哦,良心分享
下一篇: Apache Beam 架构原理及应用实践
JavaShark
博客等级 码龄4年 184粉丝 438原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值