数组——最简单的数据结构类型

数组的定义

数组是一种线性表,它会被分配一块连续的内存空间来存储相同类型的元素。(参考维基百科,百度百科等的定义)
1. 线性表
简单从字面意思理解,线性表就是这个表的每个元素的分布是线性的,是在线的上面的。除了数组,后面要复习到的链表,队列,栈也可以说是线性表的其他几种表示类型,它们各有各的妙用。
2. 连续的内存空间
电脑会分配一段空间,比如从0000 0000 ~ 1111 1111,这一段都是属于某个数组的
3. 相同类型的元素
比如int a[10]里面存储的都是int类型的数据,每个相同类型的数据所占的空间是一样的,比如int类型固定占4个字节。正是因为这种特性,数组才可以通过下标直接访问其中的某个元素,比如我们要访问第 i i i个元素,那么实际上在电脑中会出现这样的情况:
在这里插入图片描述
这样我们就能通过下标 i i i直接访问到我们想要的元素了

增删改查

数组作为一种数据类型肯定得应付增删改查这四个基础功能了,我们来分别看看它们的时间复杂度。

增(插入)和删

先通过两个例子来理解:
在不需要扩容的情况下,

  1. 插入/删除最后一位: B ( n ) ∈ O ( 1 ) B(n) \in O(1) B(n)O(1),这还好
  2. 插入/删除第一位: W ( n ) ∈ O ( n ) W(n) \in O(n) W(n)O(n),因为需要将所有元素都往后/前挪一个单位
  3. 假设在数组中任意位置插入元素的概率相同,那么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+1n1+...+n+11+n+10O(n)

数组的插入和删除其实没有那么容易,因为根据数组的定义,我们无法在一片连续的空间中插入新的空间或将原有空间删除,于是只能退而求其次,将所有元素辛苦移位。

改和查

改和查要分情况讨论:

  1. 如果是通过值来找下标,那排好序的情况下用二分查找时间复杂度是 O ( l o g n ) O(logn) O(logn),乱序情况下的平均时间复杂度是 O ( n ) O(n) O(n)
  2. 如果是通过下标直接访问,那时间复杂度就是 O ( 1 ) O(1) O(1)

我们要严谨一些hhhhh

猜你喜欢

转载自blog.csdn.net/skywuuu/article/details/114651832