数组特性
一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。特征:
1.线性表: 数据排成像一条线一样的结构。每个线性表上的数据最多只有前驱和后继两个方向。
线性表:包括数组、链表、队列、栈等
非线性表:数据之间并不是简单的前后关系,包括: 堆、树、图
2.连续的内存空间和相同类型的数据-->重要特性:随机访问
数组内存寻址公式:a[i]_address = base_address + i * data_type_size
data_type_size:表示数组中每个元素的大小
从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移(offset)”
数组适合查找操作,你用二分查找,时间复杂度为O(logn)
数组支持随机访问,根据下标随机访问的时间复杂度为O(1)
3.低效的“插入”
顺序数组:k位置插入一个新的元素时,就必须搬移k之后的数据
非顺序数组:
避免大规模数据搬移,直接将第k位数据搬移到数组元素的最后,把新元素放入第k个位置
4.低效的“删除”
减少导致数据搬移,每次删除操作只记录数据已经被删除;
当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作
容器能否完全替代数组?
优点: 封装操作的细节 & 动态扩容(扩容涉及内存申请和数据搬移->耗时)
不足:定义不能使用基础数据类型,必须使用包装类型,涉及到装箱/拆箱,有一点点性能消耗
为什么大多数编程语言中,数组要从0开始编号,而不是从1开始呢?
1.历史原因(C语言设计从0开始计数数组下标)
2.较少一次CPU减法指令运算:分析数组内存寻址公式即可