数组
数组
- 定义:
数组是一种线性表数据结构;它用一组连续的内存空间,来存储具有相同具有仙童类型的数据。 - 特性:
优势:随机访问速度快,因为可以通过寻址公式来访问元素。(寻址公式:a[i]_address = base_address + i * data_type_size;下面5详解)。
劣势:插入与删除效率比较低;因为插入删除的位置如果不是最后一个位置,都会涉及移动数据;平局时间复杂度都是O(n)。 - 越界问题:
数组越界在C语言钟是一种未觉行为,并没有规定数组访问越界时编译器应该如何处理。因为,访问数组的本质就是访问一段连续内存,只要数组通过偏移计算得到的内存地址时可用的,那么程序就可能不会报任何错误。
这种情况下就会出现,一种莫名其妙的逻辑错误。
不过Java本身会做越界检查(真香),抛出:java.lang.ArrayIndexOutOfBoundsException - 容器:
- ArrayList最大的优势是可以将很多数组操作的细节封装起来,比如数组插入或删除时需要搬移数据的操作,另外还有一个优势就是支持动态扩容。
- 在业务开发中,直接使用容器就可以了,省时省力,大家都是这么做,毕竟顺好一丢丢性能,完全不影响到系统整体的性能;但是如果你是做一些非常底层的开发,比如开发网络框架,性能的优化需要做到极致,这个时候数组就会优于容器。
- 为什么从0开始编号?
-
寻址公式:a[i]_address = base_address + i * data_type_size
i:索引的下标 a[i]_address:第i个数据的内存地址 base_address:数组内存的首地址 data_type_size:存储的数组大小(比如int占4个字节) -
如果从1开始编号的话,公式就变成:a[i]_address = base_address + (i-1) * data_type_size,对CPU来说,每次随机访问数组都多了一次减法指令,为了减少一次减法操作,所以数组就算在了从0开始编号索引下标。
一些基础问题:
实现一个支持动态扩容的数组
实现一个大小固定的有序数组,支持动态增删改操作
leetcode种一些数组相关的算法题:
题号 | 难度 | 链接 | 个人解答 |
---|---|---|---|
88 | 简单 | 合并两个有序数组 | |