数据结构与算法(二)——数组

数组介绍

数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

在 Java 中,数组是用来存放同一种数据类型的集合,注意只能存放同一种数据类型(Object 类型数组除外)。

连续的内存空间与随机访问

数组支持随机访问,正因为它有着一组连续的内存空间。

数据结构与算法(二)——数组_2021-03-31-13-34-56.png

计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:

a[i]_address = base_address + i * data_type_size

其中 data_type_size 表示数组中每个元素的大小。我们举的这个例子里,数组中存储的是 int 类型数据,所以 data_type_size 就为 4 个字节。

这样我们根据下标访问就能够很快的定位到元素。

低效的插入和删除

插入操作:

如果在数组的末尾插入元素,那就不需要移动数据了,这时的时间复杂度为 O(1)。但如果在数组的开头插入元素,那所有的数据都需要依次往后移动一位,所以最坏时间复杂度是 O(n)。 因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复杂度为 (1+2+…n)/n=O(n)。

删除操作:

和插入类似,如果删除数组末尾的数据,则最好情况时间复杂度为 O(1);如果删除开头的数据,则最坏情况时间复杂度为 O(n);平均情况时间复杂度也为 O(n)。

数组的下标为何要从0开始

如果数组从 1 开始计数,那我们计算数组元素 a[k] 的内存地址就会变为:

a[k]_address = base_address + (k-1)*type_size

我们不难发现,从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令。

文章目录
  1. 1. 数组介绍
  2. 2. 连续的内存空间与随机访问
  3. 3. 低效的插入和删除
  4. 4. 数组的下标为何要从0开始
|