你真的了解数组吗?

摘要:
许多高级数据结构实际上由数组组成,或由数组实现。因此,学好数组就是为学习高级数据结构打下坚实的基础。因为阵列占用的内存空间是连续的,所以它支持随机访问。这是怎么做到的?集合可以替换数组吗?在以下场景中,我们仍然建议使用数组:在表示多维数据时,数组的可读性优于集合。在一个简单的场景中,使用数组比使用集合更可读。

前言:

数组,应该是我们每个人学习编程时接触的第一个数据结构。它很简单,但是却很重要

为什么这么说呢?

很多高级的数据结构,其实都是由数组组成的,或者说是用数组来实现的。

比如跳跃表、散列表是由数组+链表组成的。

堆、完全二叉树、图(邻接矩阵存储)都可以用数组来实现。

所以说学好数组,就等于为你学习高级的数据结构打下了坚实的基础。

什么是数组?

数组是一种线性表数据结构、它用一组连续的内存空间,来存储一组数据类型相同的数据

这里我们来解释一下什么是线性、连续内存空间存储相同数据类型数据

线性指的是一维存储结构,比如:队列、数组、栈、链表。只有前后两个方向。

而非线性表指的是不仅仅具有前后两个方向的存储结构,比如:树、图、堆等。

因为数组占用的内存空间是连续的,所以它支持随机访问。我们只需要知道数据的存储位置,就可以以O(1)的时间复杂度访问到该元素。

这是如何做到的呢?

首先我们先来看一下在数组是如何存储在内存中的。数据加载到内存中,内存首先会为其分配一个内存空间。计算机通过访问内存空间,来获取元素,这个过程我们称之为寻址。

计算机想要访问数组中的下标值为i的数据,只需要通过下面的寻址公式即可。

a[i]_address = base_address + i * data_type_size(首地址+偏移量*数据大小)

如果数组是一个int型数组,那么data_type_size=4。我们可以通过下标值直接访问到元素,这种访问方式,我们称之为随机访问,它的时间复杂度是 O(1)。

没有最好的数据结构,只有最适合使用它的场景

虽然数组的访问效率很高,但是它的拆入和删除效率却很低,O(n)

这里以插入为例,如果我们想插入一个元素,则需要将插入位置后面的元素依次移动一个位置。

你真的了解数组吗?第1张

删除元素也是如此。

你真的了解数组吗?第2张

有没有什么办法可以提升插入与删除元素的效率呢?

针对于插入操作,如果不要求数组内元素有序,那么每次插入操作,我们都可以将插入位置的后一个元素移动到数组末尾,然后在原位置进行插入。

这样也可以达到O(1)的时间复杂度

你真的了解数组吗?第3张

 针对于删除操作,我们在删除数据的时候,可以先为被删除元素打上标记,等到数组中元素已满,再统一进行删除(JVM标记清除算法)。或者当有插入操作的时候,优先使用被标记元素的内存(Mysql中delete操作)。

你真的了解数组吗?第4张

集合是否能代替数组呢?

答案是否定的,没有最好的数据结构,只有最适合使用的场景。

集合可以看作是一个动态数组(可扩容),底层其实也是一个数组。

下面这些场景中,我们还是更推荐使用数组:

    1. 表示多维数据的时候,在可读性上,数组优于集合。(int arr[][]; ArrayList<ArrayList<Integer>>)
    2. 在性能要求极高的场景中,我们使用数组可以避免自动拆箱、装箱的性能损耗。
    3. 再简单的场景中,使用数组会比使用集合具有更高的可读性。

免责声明:文章转载自《你真的了解数组吗?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇块级元素和内联元素的区别(HTML)兼容elementUI低版本:文本域字数限制 吴小明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS 网络编程:JSON解析

1 JSON文档结构 1.1 简介 JSON(javaScript Object Notation)是存储和交换文本信息的语法,类似 XML。JSON 比 XML 更小、更快,更易解析,是一种轻量级的数据交换格式。所谓轻量级是指与XML文档结构相比描述相同的数据所需的字符个数要少。 简单的说JSON由两种数据类型组成:数组和词典。 1.2 语法...

js获取select下拉框的value值和text文本值

介绍一种取下拉框值以及绑定下拉框数据的方法    这里用到的jquery-ui-multiselect插件  1、前台html代码 <span class="ModuleFormFieldLabel" style="float: left; padding-top: 3px;">品类:</span> <asp:Hidde...

用JS实现回文数的精准辨别!!!

笔者最近在一边看《JS高级程序设计3》一边在FCC上找题目练习啊。那叫一个爽。这不,刚刚用生命在课堂,寝室,实验室,图书馆等各种场所将第五章“引用类型”搞定,FCC便知趣的给笔者来了个“回文数”,笔者咬牙切齿,花了两天时间,又是研究数组,又是研究字符串,又是研究作用域,还看了很长时间的正则表达式。还好,不负有心人,嘿嘿嘿,现在为大家详细分享用JS实现精准回...

NPOI操作Excel(三)--解析Excel

通过前面两篇的基础学习,我们对NPOI有了一定了了解,下面就开始进入实战,解析下面格式的Excel(下面只是列举了几个例子),并保存入库 首先我们先分析一下,要解析这样的Excel,需要把指标【橘色背景和蓝色背景】(作为指标入库)、科目【棕色背景和黄色背景】(作为X轴入库)、数据【乳白色背景和白色背景】(作为Y轴入库)的数据分开入库。 第一张图我们得到的...

c#数字图像处理(二)彩色图像灰度化,灰度图像二值化

为加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像,在灰度图像上得到验证的算法,很容易移植到彩色图像上。24位彩色图像每个像素用3个字节表示,每个字节对应着R、G、B分量的亮度(红、绿、蓝)。当R、G、B分量值不同时,表现为彩色图像;当R、G、B分量值相同时,表现为灰度图像,该值就是我们所求的一般来说,转换公式有3种。第一种转换公式为: G...

OptimalSolution(5)--数组和矩阵问题(1)简单

  一、转圈打印矩阵   题目:给定一个整型矩阵matrix,按照转圈的方式打印它。   要求:额外空间复杂度为O(1) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10   思路:矩阵分圈处理问题。用...