数据结构之数组

2023-11-19

目录

 前言

线性表与连续内存 

 数组是如何支持随机访问

 数组的插入与删除 

 数组越界  

总结:

参考文章:


 前言

     数组是我们平时开发中经常遇到的一种数据结构,提起数组,我们能想到最大的特点就是,要提前定义好,需要提前申请好内存空间。

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


线性表与连续内存 

      对于线性表的指的是我们数据的储存方式,就好像一条线一样,前一条数据和后一条数据是有关联性的,就好像被串联起来一样。比如我们常见的数组、链表、队列、栈都是线性表结构。

     对于连续的内存空间和相同类型的数据:由于内存空间是连续的,在随机访问有很好的性能,但是也是要求连续的内存空间,当删除数据的时候,需要做大量的数据搬移,影响性能。


 数组是如何支持随机访问

       数组是如何支持随机访问的:前面提到了数组申请到的内存空间是连续的,并且是相同类型的数据。

     假设我们申请的初始位置的地址为100,每个类型数据占用的内存大小为4 ,那么通过我们便可以很快计算出:a[i]的地址为100+4*i。获取到i的地址后,我们就可以通过地址快速的查找到数据的值,

     所以数组在通过下标访问的时候,时间复杂度是O(1),查询效率是非常高的。


数组的插入与删除 

   随之而来的,便是数组在插入数据和删除数据比较差的性能。

      假设数组的长度为 n,现在,如果我们需要将一个数据插入到数组中的第 k 个位置。为了把第 k 个位置腾出来,给新来的数据,我们需要将第 kn 这部分的元素都顺序地往后挪一位。

     跟插入数据类似,如果我们要删除第 k 个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞,内存就不连续了。

     在删除数据操作的时候,我们有一个小技巧:我们并不是每次的删除操作都去真正的搬移数据,只是记录数据已经被删除,当数组没有更多存储数据的时候,我们再触发一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。

     很多时候我们并不是要去死记硬背某个数据结构或者算法,而是要学习它背后的思想和处理技巧,这些东西才是最有价值的。如果你细心留意,不管是在软件开发还是架构设计中,总能找到某些算法和数据结构的影子。


 数组越界   

     数组的使用中,还有一个不太方便的点,很多时候,可能程序的运行,数组下标的增长并不是朝着我们想象的方向去,但是我们的内存空间是提前申请。我们需要时刻警惕数组下标越界的问题。

      我们在平时开发中,并不会直接的使用数组这种底层的数据结构,我们更多的使用高级语言封装的容器,比如:Java 语言就帮我们封装了ArrayList,并提供了更多的封装。比如不不需要过多的担心数组越界的问题。ArrayList会帮我们自动扩容:原理就是新建一个1.5倍容量的数组,并进行数据迁移,迁移完成后,删除原来的数组。不过我们最好在创建的时候事先指定数据的大小,虽然可以支持自动扩容,但是扩容操作比较耗时。

     作为高级语言编程者,有如下使用经验

  •    Java ArrayList 无法存储基本类型,比如 intlong,需要封装为 IntegerLong 类,而           AutoboxingUnboxing 则有一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,   就可以选用数组。
  •     如果数据大小事先已知,并且对数据的操作非常简单,用不到 ArrayList 提供的大部分方法,也可以直接使用数组。
  •    还有一个是我个人的喜好,当要表示多维数组时,用数组往往会更加直观。比如 Object[][] array;而用容器的话则需要这样定义:ArrayList<ArrayList<object>

总结:

     数组是最基础、最简单的数据结构了。数组用一块连续的内存空间,来存储相同类型的一组数据,

     最大的特点就是支持随机访问,但插入、删除操作也因此变得比较低效,平均情况时间复杂度为 O(n)。在平时的业务开发中,

     我们可以直接使用编程语言提供的容器类,但是,如果是特别底层的开发,直接使用数组可能会更合适。


参考文章:

本章内容来源于对王争大佬的数据结构与算法之类的专栏。

05 | 数组:为什么很多编程语言中数组都从0开始编号?-极客时间

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构之数组 的相关文章

随机推荐

  • 3. ClickHouse数据类型和表结构

    3 1 数据类型 整数类型 整数类型有Int8 Int16 Int32 Int64 分别表示8位 16位 32位和64位有符号整数 适用场景 存储整数值 如年龄 数量等 浮点类型 浮点类型有Float32和Float64 分别表示32位和6
  • Jenkins自动化部署项目

    Jenkins史上最详细的使用教程 jenkins官网 jenkins简单部署Vue项目 jenkins部署springboot项目 jenkins详细部署说明 后续小编会写上自己的使用心得 jenkins官网 https www jenk
  • 计算机用于更新无法卸载补丁,出现windows 系统补丁无法卸载该怎么解决?简单几步即可解决...

    电脑已经成为我们日常生活中的必备品 长期使用电脑肯定会碰到win10系统kb4034674无法卸载提示 没有成功卸载全部更新的问题 很多用户之前从未遇到win10系统kb4034674无法卸载提示 没有成功卸载全部更新这样的问题 其实win
  • 【前端基础知识复习】

    js基础知识复习 原型链 继承 原型链继承 经典继承 借用构造函数 组合继承 1和2结合 常用 原型式继承 ES5 Object create 寄生式继承 寄生组合继承 最理想 作用域与作用域链 闭包 立即执行函数 typeof和insta
  • 服务器内核有未知文件,【原创文章】CENTOS kernel panic无法对未知的块安装根文件系统的解决办法...

    今天突然发现维护的linux系统无法访问了 网站打不开 SSH无法登陆 后台面板也没有响应 打开机房的管理后台 reboot服务器 过了一会还是没有反应 有点纳闷 这是商业网站 不敢怠慢 马上开工找问题 打开机房准备的KVM KVM是基于j
  • 一、super slomo介绍

    本专题文章对super slomo进行一系列操作 降低训练时间 预测时间 导出训练模型 C 调用模型进行预测等 本章对其进行一个简单介绍 来自互联网 2018年CVPR的论文 Super SloMo High Quality Estimat
  • 阿里平头哥CPU技术生态负责人陈炜:平头哥的发展之路

    整理 巫柔颖 RISC V是近年兴起的一种CPU新架构 因其开放 灵活的特性而逐渐成为半导体行业的热门选择 当前 已有近2500家机构加入RISC V基金会 包括阿里 华为 Google 英特尔 IBM等公司 在阿里宣布平头哥开源玄铁RIS
  • windows sql server 如何卸载干净?

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 windows sql server 怎么卸载干净 前言 一 windows sql server是什么 二 如何卸载干净 1 关闭sql server服务 2 到控制面板
  • hive 表创建及字段信息管理

    1 分区表创建及数据导入 1 1 创建分区表 以日期pt分区 字段用 t分隔 输入格式为txt 存储格式为orc use db name drop table if exists tablename CREATE TABLE IF NOT
  • Windows10 adb安装与环境变量配置

    adb安装与环境变量配置 目录 adb安装与环境变量配置 安装adb工具都需要什么 Android SDK 的下载 如何配置变量环境 adb启动不了是什么原因 安装adb工具都需要什么 1 需要下载Android SDK 配置环境变量即可
  • 797. 所有可能的路径

    class Solution public vector
  • 用STM32F407ZET6的HAL库写一个串口接收,发送代码,支持ringbuff

    你可以参考这个示例代码 https www st com content ccc resource technical document application note group0 b5 d4 04 c1 b4 4f 4d e5 DM0
  • 准确率与召回率

    1 准确率与召回率 Precision Recall 准确率和召回率是广泛用于信息检索和统计学分类领域的两个度量值 用来评价结果的质量 其中精度是检索出相关文档数与检索出的文档总数的比率 衡量的是检索系统的查准率 召回率是指检索出的相关文档
  • 求字符串长度的三种方法(C语言)

    如何求字符串的长度 首先要明白字符串存储的原理 字符串存储时 是以 0 结尾 这个就可以作为判断字符串结尾的一个条件 接下来 只要有字符串的首元素地址 就可以解决求字符串长度的问题啦 第一种 普通版 int my strlen char s
  • Revit 2019: Essential Training for MEP (Metric) Revit 2019:MEP基本培训 Lynda课程中文字幕

    Revit 2019 Essential Training for MEP Metric Revit 2019 MEP基本培训 Lynda课程中文字幕 Revit 2019 Essential Training for MEP Metric
  • 转载:Swap与Memory内存简单介绍

    背景介绍 对于Linux来说 其在服务器市场的使用已经占据了绝对的霸主地位 不可动摇 Linux的各种设计思想和使用也被传承 当然不乏各种黑Linux 而且黑的漂亮 Linux的很多独特的设计 对性能也产生了巨大的提升 也为其他应用软件和系
  • 如何加载MySql数据库驱动?

    一 直接把下载好的驱动jar包放在了C 下 二 修改CLASSPATH 右键 我的电脑 gt 环境变量里 遇到的问题 1老是遇到如下图红线框中的问题 修改了有5678次才修改
  • C语言整理

    C语言整理 谭大爷的书 精简版 l 程序设计和C语言 1 main表示主函数 int表示类型 stdio是一个文件名 h是头文件 include指令把信息调用 2 函数的组成 函数首部和函数体 声明部分与执行部分 3 编辑 编译 链接 执行
  • 医院管理系统服务器,解决方案-医院业务运维管理系统- 新华三集团-H3C

    BSM概述 H3C BSM 业务服务管理 解决方案 是新一代以业务为视角 以CMDB为核心 对业务和相关IT基础设施进行监控 管理和分析的解决方案 从业务入手 全面管理应用 网络 计算 存储 虚拟化等IT资源 建立统一的IT资源信息库 实现
  • 数据结构之数组

    目录 前言 线性表与连续内存 数组是如何支持随机访问 数组的插入与删除 数组越界 总结 参考文章 前言 数组是我们平时开发中经常遇到的一种数据结构 提起数组 我们能想到最大的特点就是 要提前定义好 需要提前申请好内存空间 数组是一种线性表数