由一个问题开始
问题: 有没有想过, 为什么数组的下标索引是在0开始, 而不是符合习惯思维的1呢?
几乎我们接触的每一门编程语言都有数组这种数据结构, 写代码的时候, 语法这样要求我们:必须给定数组元素的数据类型, 必须给定数组长度, 访问数组元素的时候下标必须在0开始(大部分编程语言), 下标索引不可以越界. 为什么要给我这种反人类的约束! 小马哥不喜欢受约束, 但是研究了数组中隐藏的数据结构原理之后, 会发现, 这一切约束都是值得和美妙的.
首先, 数组是什么? 其次, 计算机是如何找到数组中元素的? 数组是一种线性表结构, 使用一块连续的内存, 存储一组相同类型的数据. 带来两个问题.
- 问题1: 为什么需要连续的内存?
- 问题2: 为什么这组数据要具备相同的类型
这些统统是为了快速的访问数据而考虑的, CPU通过一个公式计算地址, 访问数组的元素, 公式如下:
- array[ i ] = base_address + i * data_type_size
相同的数据类型, 比如都是int类型, 那么每一个元素都是占用4个字节;
连续的内存,将所有元素放在一起, 才会让cpu通过公式推理计算得到每一个元素的存储位置.
这两个问题的答案让数组能以O(1)的时间复杂度被访问, 所以带来如下两个数组的性能特点:
特点1: 访问性能高效, 时间复杂度为O(1)
特点2: 插入删除相对低效, 时间复杂度为O(n)