1. 概述
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
- 线性
- 线性表就是数据排成像一条线一样的结构
- 每个线性表上的数据最多只有前和后两个方向
- 连续的内存空间和相同类型的数据
2. 高效的随机访问
计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:
1 | a[i]_address = base_address + i * data_type_size |
其中 data_type_size 表示数组中每个元素的大小。我们举的这个例子里,数组中存储的是 int 类型数据,所以 data_type_size 就为 4 个字节。这个公式非常简单,我就不多做解释了。
数组支持随机访问,根据下标随机访问的时间复杂度为 O(1)。
3. 低效的“插入”和“删除”
假设数组的长度为 n,现在,如果我们需要将一个数据插入到数组中的第 k 个位置。为了把第 k 个位置腾出来,给新来的数据,我们需要将第 k~n 这部分的元素都顺序地往后挪一位。删除操作跟插入数据类似,如果我们要删除第 k 个位置的数据,为了内存的连续性,也需要搬移数据,不然中间就会出现空洞,内存就不连续了。
4. 数组编码练习
例:实现STL库中vector。
1 |
|
以上代码参考:https://github.com/yqtaowhu/DataStructureAndAlgorithm/tree/master/DataStructure/vector
5. 参考
- 以上内容为《数据结构与算法之美》学习笔记
- STL的vector实现