一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
数组介绍
数组是计算机科学基本数据结构之一。简单解释数组表示一个含有数据的列表,以索引数字标识每个数据在数组中的位置。
- 一般情况下
索引从0开始计算。 - 数据结构一般具备四种基本操作:读取、查找、插入、删除。
步数计算法则来分析数组查询速度,也称之为时间复杂度。 | 索引0 |索引1 |索引2 |索引3 |索引4 | | --- | --- |--- |--- |--- | |轿车 | 公交车|自行车|摩托车| 电瓶车|
读取
数组采用连续存储地址,在读取速度上是快的。可直接通过索引所指的值。
查找
数组查找,通过检查数组是否存在某个值并给出相应索引的过程。因此需要从数组索引为0开始寻找。
插入
数组插入新数据,主要决定于插入到哪个位置。在数组开头或中间插入是最简单的不做考虑,而其他情况下就必须对数组做移动来实现新数据的插入。例如如下希望在索引2插入大卡车就需要对数组后面的数据进行位移操作,在原有数组位置都往后移动一格以腾出索引2空位补上新数据。而这个插入操作是比较花费“步数的”,最坏情况下包含N个数据数组在头部插入需要花费N+1步数。
| 索引0 | 索引1 | 索引2 | 索引3 | 索引4 | 索引5 |
|---|---|---|---|---|---|
| 轿车 | 公交车 | 自行车 | 摩托车 | 电瓶车 |
删除
数据删除数据就是插入的反向操作。例如在原有数组数据上删除原索引1的数据公交车,索引1变成空位。索引1后的数据都需要往前移动一位补齐空缺,数组长度会变少一位。删除操作最大的步数是N。
| 索引0 | 索引1 | 索引2 | 索引3 |
|---|---|---|---|
| 轿车 | 自行车 | 摩托车 | 电瓶车 |
有序数组
有序数组是特殊的数组形式,要求其数据保持有序。在插入新数据时,数据必须插入到适当位置才行,按照有序数组要求的顺序排列。
插入
| 索引0 | 索引1 | 索引2 | 索引3 | 索引4 |
|---|---|---|---|---|
| 3 | 10 | 20 | 100 | 202 |
对有序数组插入新数据7会插入到索引1中以根据有序数组特性。
| 索引0 | 索引1 | 索引2 | 索引3 | 索引4 | 索引5 |
|---|---|---|---|---|---|
| 3 | 7 | 10 | 20 | 100 | 202 |
在插入数据过程中有序数组必须从索引0开始依次检查直到找到合适位置才插入新数据。因此插入性能上有序数组会花费较大“步数”,但在查找方面上有序数组是比较有优势的。
查找
在介绍数组时说到的查找形式是有序查找方式:从索引0开始依次检查直到找到对应数据。而因为有序数组特殊性(它是有序排列的)当查询到比需要查找的值大时就说明需要被查找的值不存在就能停止继续查找了。在一定情况下有序数组的线性查找就比较快,但有序数组比普通数组还有另一个优势那就是二分查找会比线性查找效率更高。
二分查找
二分查找就是将一个连串数据进行对半分。例如在有序数组0-99索引之间查找某一个数值,可以找中间索引49来看看中间数值和需要查找的某个数值的比较。比如索引49数值是50,需要查找的某个数值是60那么就排除了0-49索引下不可能找到数值50,后续查找只需要在50-99索引中查询,这一过程已经很大程度上减少了步数。
二分和线性比较
但并不是说二分绝对比线性高效。在长度较小的有序数组中二分法可能比不上线性查找。但从多种数组情况结合来看二分法步数增长是较为缓慢的,而线性查找就是和数组数据数量相关。
| 数组长度 | 二分 | 线性 |
|---|---|---|
| 100 | 最多100步 | 7步 |
| 3 | 最多3步 | 2步 |
| 7 | 最多7步 | 3步 |
| 15 | 最多15步 | 4步 |
参考
*《数据结构与算法》