数组
数组是一种定长的存储相同数据类型的数据结构,存储的数组在一段连续的空间里。为最简单的数据结构之一。
数组的内存分配
由于数组是将其所有的数据元素存储在连续的内存空间中。在存储数组时,仅存储数组的基地址,即第一个元素的地址。数组其它元素的地址可以通过对基地址的偏移来计算。
数组的内存分配
找到首位的地址,根据每个元素的大小求偏移量。
时间复杂度
访问
数组可以直接使用索引访问,因此,访问数组元素的时间复杂度为O(1)
查找
从数组中查找一个给定的值,需要遍历数组中的每一个元素,知道找到给定值为止。假设查找的形式为线性查找(数组最基本的查找形式),则查找的时间复杂度为O(n).
也存在一些其它的查找算法,比如,二分搜索,可在O(log n)的时间复杂度内搜索,但前提是当前数组为有序数组。
插入
在数组的两个元素之间插入一个新的元素,需要将插入之后的所有位置的元素向后移动。这就意味着如果在数组的开头插入元素,需要将数组的所有元素向后移动,因此插入操作的时间复杂度为O(n)
删除
在数组的两个元素之间删除一个元素,需要将删除位置之后的所有位置的元素向前移动。这就意味着,如果删除数组的第一个元素,需要将数组的所有元素统一向前移动,因此删除操作的时间复杂度为O(n)
空间要求
数组仅占据用于存储指定数据类型的元素的空间,这就意味着,存储n个元素所要求的空间复杂度为O(n)
数组的优点
相比其它类型的数据结构,数组有以下优点:
- 数组允许随机访问数组元素,每个存储在数组中的元素可以通过直接访问其索引来使用
- 数组对存储友好。这意味着在某些情况下,由于数组的线性存储方式,代码的执行顺序会大大提高
数组的缺点
- 声明数组时,需要指定数组的长度。初始声明数组的长度过长或过短,在移动数组元素时都会有导致效率变低
- 插入和删除元素之后保持数组的连续性代价是昂贵的,因为有可能需要重新排列所有数组元素。