跳到主要内容

02| 数组

一、定义

数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
数组长度一旦声明,不可改变不可追加,根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。

一.数组定义中的关键词

1、线性表

线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。
 
非线性表就指的是二叉树,堆,图等,为什么叫非线性,是因为在非线性表结构中,数据之间不只是简单的前后关系。

2、连续的内存空间和相同类型的数据

正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。

2.1连续内存空间

当创建一个数组时,计算机会在内存开辟一个空间,并给该数组一个地址值,数组内的元素查询方式如下:

a[k]_address = base_address + k * type_size

2.2低效的“插入”和“删除”
(1).插入

假设数组的长度为 n,将一个数据插入到数组中的第 k 个位置。为了把第 k 个位置腾出来,给新来的数据,我们需要将第 k~n 这部分的元素都顺序地往后挪一位。
如果在数组的末尾插入元素,那就不需要移动数据了,这时的时间复杂度为 O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次往后移动一位,所以最坏时间复杂度是 O(n)。在每个位置插入元素的概率是一样的,所以平均情况时间复杂度为 (1+2+…n)/n=O(n)。

如果该数组元素没有顺序(元素的下标有顺序,值没有顺序),只是当作一个集合使用。
如果在给A、B、C、D、E中的下表为3的地方插入一个数据X。
有两种算法
1、 将X插入ABCDE中,得到ABXCDE,将CDE向后移动了一个位置;