数组: 一种非常基础且重要的数据结构
前言
数组是一种非常基础且重要的数据结构,很多复杂的数据结构都是基于数组实现的。深入理解数据的存储原理和特点,有利于我们在实际开发工作中,充分发挥数据的优势。
数据是什么
数组的定义:数组(Array)是一种线性表数据结构。它用一组连续的内存空间,存储一组具有相同类型的数据。
在上面的定义中加黑的描述,我们可以发现数组的几个特点,分别是:线性表、连续的内存空间、相同类型的数据。如下图所示:
数组因具有连续的内存空间的特点,让数据拥有非常高效率的“随机访问”,但也是因为要保持这个连续的内存空间,导致数组在删除或插入操作的时非常低效。因为数组为了保持连续性,必然会涉及大量数据的搬移,这个是非常消耗时间数组的。
思考:这里你可能会有疑问:什么是连续的内存空间?
首先,我们来说说内存,内存是由一个个连续的内存单元组成的,每一个内存单元都有自己的地址。在这些内存单元中,有些被其他数据占用了,有些是空闲的。
然而数据中的每个元素,都存储在小小的内存单元中,并且元素之间紧密排列,既不能打乱元素的存储顺序,也不能跳过某个存储单元进行存储。
数组的随机访问
数组的随机访问是有个寻址公式的,上问中我们提到过数组是用一组连续的内存空间存储数据元素的,然而每个内存单元都有自己的地址(在计算机里面就是通过这个地址访问数据的),又加上每个内存单元的大小都是一样的,这样就很容易得到一个公式了,如下所示:
a[i]_address=base_ad: dress+i*data_type_size
我们来简单解释一下上述公式,其中data_type_size表示数组中每个元素的大小、base_address表示内存块的首地址、i 表示数组下标。
数组的基本操作
在开始之前我们先创建一个数组类,来模拟数组操作时候的相关操作。代码如下:
public class MyArray { private int[] array; // 数组大小 &一种nbsp; private int size; public MyArray(int capacity) { this.size = 0; this.array&非常nbsp;= new int[capacity]; } } 1. 读取元素
我们知道数组在内存中是连续存储的,所以根据上文的寻址公式可以知道,我们可以根据数组下标 i 快速定位到对应的元素。
简单举例,代码如下:
int[] array={1,2,3,4,5,6}; System.out.println(array[1]); // 输出的是2 因为数组的下标是从0开始的。 2. 更基础新元素
我们可以根据数组下标快速查找到对应元素。那么同样道理,我们可以根据数组下标 i 快速更新元素,这中间涉及两个过程,首先就是找到数组下标 i 对应的数据元素A,然后将新的数据元素B赋值给A即完成更新。
简单举例,代码如下:
int[] array={1,2,3,4,5,6}; System.out.println(array[1]); // 输出的是2 //更新数组下标为 1 的数组元素 array[1]=22; System.out.println(array[1]); //&n且重bsp;输出的是22 3. 插入元素
相比读取、更新操作,插入元素稍微复杂一些,分为以下两种情况:
尾部插入:首先,我们看看尾部插入,这种情况很简单,在数组的最后新增一个新的元素,此时对于原数组来说没有任何影响,时间复杂度为0(1)。如下图所示:
中间插入:如果在数组的中间位置插入元素的话,此时会对插入元素位置之后的元素产生影响,也就是这些数据需要向后依次挪动一个位置。如下图所示:
中间插入的代码如下:
/** * 插入元素 * @param index 待插入的位置 要的 * @param element 待插入的元素 */ public void insert(int index,int element){ if(indexsize){ throw new IndexOutOfBoundsException("超过数组容量 ! 插入失败!"); 数据 } // 从左到右,将元素向右移动一位 for (int i=size-1 ; i>index ; i--){ array[i+1]=array[i]; } &nbs结构p;// 此时index这个位置已经腾空了,可以放进入element array[index]=element; //数组中元素个数+1 size++; }
3.1 数组扩容
因为数组的长度在创建的时候已经确定了,当插入元素的时候如果数组已经满了,是没办法插入成功的。这个时候就要考虑数组扩容的问题了,那么该如何实现扩容呢?
其实我们可以这样,比如此时的数组是A, A已经满了,我们再创建一个数组B且数组长度是A的2倍,数组然后我们将数组A的元素全部放到数组B中,这样就完成了数组扩容了。
数组扩容的代码如下:
/** * 数组扩容为原数组的二倍 */ public void resize(){ int[] newArray=new int[array.length*2]; System.arraycopy(array,0,newArray,0,array.length); array=newArray; 4. 删除元素
删除元素和插入元素类: 似,如果我们删除第k个位置的数据,为了内存的连续性,同样会涉及数据的挪动。如下图所示:
删除元素的代码如下:
/** * 根据数组下标删除元素 * * @param index 数组下标 * @return */ public int delete(int index) { if (index < 一种;0 || index > size) { throw new IndexOutOfBoundsException("已经超过数组容量 ! 插入失败!"); } int deleteElement = array[index]; &nbs非常p; // 从左到右,将元素向左移动一位 for (int i = index; i < size - 1; i++) { array[i] = array[i + 1]; }&nbs基础p; size--; return deleteElement; } 总结
数组是使用一块连续的内存空间,存储相同类型的一组数据,其最大的优点是数组支持随机访问,是因为数组可以通过数组下标(寻址公式)快速访问对应元素,时间复杂度为O(1)。
数组在删除元素和插入元素这两个操作比较低效,是因为数组为了保持数据的连续性,会涉及到数据的挪动,平均时间复杂度为O(N)。
(责任编辑:珠宝配饰)
-
如何在Python3中判断字符串长度,首先给定一个字符串,然后判断该字符串的长度。这里可以使用使用内置方法 len()和循环计算两种方法来判断。 实例一:使用内置方法 len() 执行以上代码输出结果...[详细]
-
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 实例 执行以上代码输出结果为: 减少循环次数的参考...[详细]
-
云梦级11月7日云梦级消息,据第一财经报道,荷兰安世半导体官网当地时间11月5日更新动态显示,安世对美国当局暂停实施所谓的“穿透规则”一年表示欢迎;也欢迎中国方面推动恢复安世中国工厂及其代工厂的出口,...[详细]
-
腾讯云行业大模型获评TechWeb 2023鹤立奖 “最受欢迎互联网服务奖”
1月15日消息,腾讯云荣获“TechWeb 2023鹤立奖”最受欢迎互联网服务奖。本届“鹤立奖”评选由TechWeb内容部主办,旨在通过用户和行业人士的投票评选出年度最能影响人们生活、最优秀的公司,产...[详细]
-
OpenAI 首席执行官萨姆・奥特曼(Sam Altman)于近日宣布,公司已承诺在基础设施方面投入约1.4万亿美元,这一金额相当于约30吉瓦的数据中心容量。此声明旨在阐明 OpenAI 近期在芯片、...[详细]
-
AI面试官初创公司Alex获1700万美元A轮融资:每天完成数千场面试,投资者看好招聘自动化趋势
求职者即将面临更多初轮筛选面试,但这并不意味着职位数量增加,而是因为招聘人员正在将例行筛选任务外包给AI系统。 初创公司Alex正在为企业提供AI招聘官服务,帮助进行视频面试和电话筛选。联合创始人Aa...[详细]
-
5月18日晚,阿里巴巴集团公布了截至2023年3月31日的2023财年第四季度(自然年2023年第一季度)及全年财报。 2023财年,阿里营收8686.87亿元,同比增长2%;净利润为655.73亿元...[详细]
-
中山大学联合美团打造X-SAM模型,单次操作可分割多个对象,20项测试全面领先
中山大学、鹏城实验室与美团三方联合研发的X-SAM图像分割模型近期正式发布,这款多模态大模型在图像分割领域实现了重要突破,将传统的"分割万物"能力升级为"任意分割",显著提升了模型的适应性和应用范围。...[详细]
-
英特尔最近两年可以说深陷制程工艺的陷阱中,以至于在处理器市场面对AMD只能节节败退,丢掉了许多的市场份额,显然英特尔也意识到了制程工艺的重要性,除了加快10nm的部署外,还押注了更先进的4nm制程,并...[详细]
-
mc子龙是谁唱的?你问得应该是刀山火海,一首说唱歌曲,mc子龙唱的!你问得应该是刀山火海,一首说唱歌曲,mc子龙唱的!mc赵子龙什么意思?mc赵子龙是喊麦里的一种叫法。mc赵子龙是喊麦里的一种叫法。m...[详细]
- https://www.flickr.com/photos/tags/谷歌maps群发程序|软件【tg:seogoogle987】OHl
- https://www.mesec.cz/vyhledavani/?qs=谷歌maps群发程序|软件【tg:seogoogle987】,SHW
- https://www.pixiv.net/tags/谷歌maps群发程序|软件【tg:seogoogle987】,8L4
- https://www.flickr.com/photos/tags/谷歌maps群发程序|软件【tg:seogoogle987】VDl
- https://www.reallywildbirdfood.co.uk/store/search?q=谷歌maps群发程序|软件【tg:seogoogle987】,P7v
- https://www.jusoen.com/addreng.asp?p1=谷歌maps群发程序|软件【tg:seogoogle987】YWL
- https://www.kaliastyle.com/catalogsearch/result/?q=GOOGLE谷歌maps群发程序|软件【tg:seogoogle987】,s2u
- https://www.youm7.com/Home/Search?allwords=谷歌maps群发程序|软件【tg:seogoogle987】,Bez
- https://www.nyif.com/catalogsearch/result/index/?f=sarbanesoxleyU&index=me_cms_pe&lit=20&mode=list&p=1&q=谷歌maps群发程序|软件【tg:seogoogle987】,qFd
- https://zhidao.baidu.com/index/?action=QUERY&word=谷歌maps群发程序|软件【tg:seogoogle987】,ARM

标签: DeepSeek 苹果 微信支付 梁文锋
蚂蚁数科发布新隐私保护AI算法,推理速度提升超100倍
西媒:未来士兵将成机器人的“牧羊人”
Prime Intellect 推出开放平台“环境中心”,对抗AI强化学习领域的封闭趋势
云计算开发:Python练习实例-两个变量值互换
