本文共864字|阅读2分钟
在大部分编程语言中,数组都是从0开始编号的,但你是否下意识想过,为什么数组要从0开始编号,而不是1开始呢? 从1开始不是更符合人类的思维习惯吗?下面以这个问题来学习数组。
如何实现随机访问?
什么是数组?估计你心中已经有了答案。不过,这里还是总结一下。数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 这里定义里有几个关键词,理解了这几个关键词,就能彻底掌握数组的概念了。
线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。除了数组,链表、队列、栈等也是线性表结构。
而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为在非线性表中,数据之间并不是简单的前后关系。
数组时间复杂度
数组(Array
)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 注意点:
1、 数组是一种线性表;
2、 连续的内存空间和相同类型的数据。 由于第二个性质,数组支持 “随机访问”,根据下标随机访问时间复杂度为 O(1)
,但是在数组中删除、插入数据时需要做数据搬移工作。
低效的“插入”和“删除”操作
1、 插入操作
假如数组的长度为 n
,我们需要将一个数据插入到数据的第 k
个位置,则需要将 [k , n]
位元素都顺序地往后挪动一位。
- 最好的情况:时间复杂度为
O(1)
,此时在数组末尾插入元素。 - 最坏的情况:时间复杂度为
O(n)
,此时在数组开头插入元素。 - 平均的情况:时间复杂度为
O(n)
,因为在每个位置插入元素的概率相同,故(1+2+3+......+n)/ n = O(n)
。
2、 删除操作
和插入操作一样,为了保证内存的连续性,删除操作也需要搬移数据。
- 最好的情况:时间复杂度为O(1),此时删除数组末尾的元素。
- 最坏的情况:时间复杂度为O(n),此时删除数组开头的元素。
- 平均的情况:时间复杂度为O(n),因为删除每个位置的元素的概率相同,故(1+2+3+……+n)/ n = O(n)。
3、 警惕数组访问越界
在 C 语言中,只要不是访问受限的内存,所有的内存空间都是可以自由访问的。如果疏忽会造成严重的后果。当然,Java语言会自动检测。
部分图片来源于网络,版权归原作者,侵删。