【基础巩固】详细总结对数组的理解

简介: 【基础巩固】详细总结对数组的理解

正文


一、数组的定义


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


在这里,线性表的意思是,数据像一条线一样组织起来的,每个线性表上的数据只有向前和向后两个方向,比如数组、链表、队列、栈等;而非线性表就比如树、堆、图之类的。


二、数组有哪些特点?


  • 需要连续的内存空间,如果要删除或者插入一个数据,就需要做数据搬移的工作;
  • 存储相同的数据类型;
  • 随机访问,数组任意位置的地址计算为a[i]_address = base_address + i * data_type_size;
  • 数组查找的时间复杂度只有在随机访问的时候才是O(1),使用二分查找时间复杂度则是O(logn);


三、数组的插入、查找、删除元素时间复杂度如何分析?


3.1、插入操作


有序数组

对于有序数组,最好和最坏情况下完成插入操作的时间复杂度分别是O(1)和O(n),那么平均下来的时间复杂度就是(1+2+3+......+n)/n=O(n)。


无序数组

对于无序的数组,为了避免大规模的数据搬移工作,我们可以把原来第k位的元素搬移到最后,把需要插入到第k个位置的值插入,如此,时间复杂度将从O(n)变为O(1);


3.2、删除操作


删除操作在最好和最坏情况下的时间复杂度为O(1)和O(n),平均时间复杂度也是O(n),那有什么办法可以优化删除操作,减少搬运数据的过程,提高效率呢?


我们完全可以将多次删除操作集中在一起进行。当一开始删除时,我们可以将待删除的元素标记为已删除,等到数组已分配空间不够用的时候,触发一次清除操作和搬运数据操作。


四、数组在使用过程中需要注意什么?


在C语言中,数组越界会使得程序陷入无限死循环;


在高级语言中,比如Java,会抛出运行时异常ArrayIndexOutOfBoundsException;


建议在程序中,使用数组中元素时,都需要做越界检查,或者捕获该异常进行处理。


五、数组和容器类ArrayList的区别是什么?它们各自的优缺点是什么?


ArrayList和数组有什么区别,它们各自的优缺点是什么,以及在什么场景下使用哪个比较合适?


首先,ArrayList的底层实现就是基于数组的,但是它封装了很多数组的实现,比如插入元素和删除元素,我们直接调用add和remove即可,不用关心数据的搬移和优化等操作。


其次,ArrayList是可以自动扩容的,每次扩容都是原来的1.5倍,而数组一旦初始化好空间了,就不能更改大小,除非自己申请一块更大的连续内存空间,再手动搬运数据。ArrayList把扩容和搬运数据的操作都封装起来了,使用起来更加便捷。然而,每次扩容都涉及申请空间和搬运数据,所以,如果一开始能确定数据大小的话,就尽量就指定大小。

List<String> sl = new ArrayList<String>(100); 

然后,ArrayList的泛型只支持封装类,不支持基本数据类型,比如Integer、Long,对于如下的操作都会有自动装箱和拆箱操作,会损耗一定的性能。

List<String> sl = new ArrayList<String>(100); 
sl.add(15);
int num = sl.get(1);

还有,如果你能提前确定好数组的大小,并且代码逻辑很简单,用不着ArrayList的方法,那么就可以直接使用数组,而不是容器。如果你想要用到二维数组,也推荐使用数组,而不是容器,因为int[][]明显比ArrayList<ArrayList<>>更加的直观。


最后,对于平常的业务逻辑开发,建议使用容器类,比较简单省心,一点点的性能损耗对于整个应用来说算不得什么;但是如果你是用来写一些公共的底层方法,需要考虑很高的性能,那么就推荐使用数组。


六、数组下标为什么是从0开始的?


方便寻址。比如上面说到寻址公式为a[i]_address = base_address + i * data_type_size,倘若下标从1开始,那么寻址公式就要改为a[i]_address = base_address + (i-1) * data_type_size,这样,每次数组随机访问寻址就会多一次减法操作,数组是系统中使用最为频繁的数据结构,这一点点的性能提升对整个系统来说就是很可观的。

历史原因。C语言最先是这么设计的,然后其它高级语言都是基于C语言而来,所以也就继承了这一特点。但是也有例外,比如Matlab和Python。


相关文章
|
9月前
|
消息中间件 分布式计算 Kafka
别再纠结了:Lambda 还是 Kappa?流批统一这件事,真没你想得那么玄乎
别再纠结了:Lambda 还是 Kappa?流批统一这件事,真没你想得那么玄乎
528 5
|
10月前
|
监控 算法 5G
室内外融合定位技术从核心架构、技术原理到部署实施流程等详解(二)
本文详解室内外融合定位系统核心技术,涵盖北斗RTK厘米级定位、UWB高精度测距、场景自适应切换与多源数据融合四大模块。通过终端-网络-平台三层架构,实现室外高精度、室内无缝衔接的连续定位,支持化工、矿山等高危场景下的精准管控与安防联动,解决“进车间失联”难题。如果您想进一步了解室内外融合定位技术的案例,欢迎搜索维构lbs智能定位~
|
12月前
|
机器学习/深度学习 人工智能 搜索推荐
拔俗戒毒所青少年AI心理疏导系统:用技术叩开“心门”的科学路径
针对青少年戒毒心理疏导难题,我们研发AI心理陪伴系统,融合语音、微表情与生理信号多模态识别技术,精准捕捉情绪;通过大模型生成个性化干预策略,动态评估疏导效果,实现“数据驱动”的人机协同疏导新模式,助力迷途少年回归正轨。
623 0
|
存储 监控 安全
RFID电动车车牌让出行更安全
RFID电动车车牌通过内置芯片实现车辆身份唯一识别,结合物联网技术,提升防盗、交通秩序、事故处理等多方面的出行安全,助力城市电动车智能化管理,守护市民安全出行。
|
9月前
|
存储 人工智能 缓存
8核32G服务器怎么样?2026年阿里云 8 核 32G 云服务器价格、配置与性能解析
阿里云 8 核 32G 云服务器凭借 1:4 的 CPU 与内存均衡配比,成为兼顾性能与实用性的热门选择,既能支撑中大型企业核心业务(如高并发官网、中型数据库),也能满足开发者高性能测试需求(如批量数据运算、轻量 AI 推理)。下面从价格、核心配置、实测性能三方面详细解析,帮你判断是否适配业务需求。
|
边缘计算 运维 算法
MyEMS 开源能源管理系统:革新能源管控模式的技术实践与生态构建
在全球能源转型与“双碳”目标推动下助力重点用能单位实现高效能源管控。其模块化架构支持多协议接入、AI深度分析、数字孪生可视化,广泛适配各类场景,构建“技术开源+生态共建”的新型能源管理体系。
493 0
|
安全 搜索推荐 Android开发
Android系统SELinux安全机制详解
如此看来,SELinux对于大家来说,就像那位不眠不休,严阵以待的港口管理员,守护我们安卓系统的平安,维护这片海港的和谐生态。SELinux就这样,默默无闻,却卫士如山,给予Android系统一份厚重的安全保障。
615 18
|
人工智能 弹性计算 运维
通勤路上修故障?钉钉机器人+OOS AI助手实现7×24小时运维自由
通过钉钉机器人配置阿里云OOS AI助手,您可以直接在钉钉群内发送文字指令,实现免登录、跨设备、秒级响应的阿里云运维操作。
|
存储 SQL Java
王日宇:基于 StarRocks 和 Paimon 打造湖仓分析新范式
本文根据 StarRocks Summit 2023 演讲实录整理而成,主要分享了基于 StarRocks 和 Paimon 打造湖仓分析方案及背后的技术原来和未来规划。
2771 1