数组的定义
数组是一种线性表,它会被分配一块连续的内存空间来存储相同类型的元素。(参考维基百科,百度百科等的定义)
1. 线性表
简单从字面意思理解,线性表就是这个表的每个元素的分布是线性的,是在线的上面的。除了数组,后面要复习到的链表,队列,栈也可以说是线性表的其他几种表示类型,它们各有各的妙用。
2. 连续的内存空间
电脑会分配一段空间,比如从0000 0000 ~ 1111 1111,这一段都是属于某个数组的
3. 相同类型的元素
比如int a[10]
里面存储的都是int类型的数据,每个相同类型的数据所占的空间是一样的,比如int类型固定占4个字节。正是因为这种特性,数组才可以通过下标直接访问其中的某个元素,比如我们要访问第 i i i个元素,那么实际上在电脑中会出现这样的情况:
这样我们就能通过下标 i i i直接访问到我们想要的元素了
增删改查
数组作为一种数据类型肯定得应付增删改查这四个基础功能了,我们来分别看看它们的时间复杂度。
增(插入)和删
先通过两个例子来理解:
在不需要扩容的情况下,
- 插入/删除最后一位: B ( n ) ∈ O ( 1 ) B(n) \in O(1) B(n)∈O(1),这还好
- 插入/删除第一位: W ( n ) ∈ O ( n ) W(n) \in O(n) W(n)∈O(n),因为需要将所有元素都往后/前挪一个单位
- 假设在数组中任意位置插入元素的概率相同,那么n个元素的数组有n+1个位置可以插入,可列式 A ( n ) = n n + 1 + n − 1 n + 1 + . . . + 1 n + 1 + 0 n + 1 ∈ O ( n ) A(n)=\frac{n}{n+1}+\frac{n-1}{n+1}+...+\frac{1}{n+1}+\frac{0}{n+1} \in O(n) A(n)=n+1n+n+1n−1+...+n+11+n+10∈O(n)
数组的插入和删除其实没有那么容易,因为根据数组的定义,我们无法在一片连续的空间中插入新的空间或将原有空间删除,于是只能退而求其次,将所有元素辛苦移位。
改和查
改和查要分情况讨论:
- 如果是通过值来找下标,那排好序的情况下用二分查找时间复杂度是 O ( l o g n ) O(logn) O(logn),乱序情况下的平均时间复杂度是 O ( n ) O(n) O(n)
- 如果是通过下标直接访问,那时间复杂度就是 O ( 1 ) O(1) O(1)
我们要严谨一些hhhhh