再谈数组

再谈数组

Posted by bulingfeng on May 2, 2024

为什么很多编程语言的数组都是从0开始的?

在讨论数组的之前,有没有考虑过以下几个问题?

  • 为什么数组通过下标访问元素,时间的复杂度可以做到0(1),而链表根据下标访问却做不到0(1)的复杂度。
  • 为什么大多数的编程语言的数组下标都是从0开始的而不是从1开始的。

在解答上面的两个问题之前呢,先来看下数组的定义吧。

数组的定义

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

根据数组的定义,我们就可以解决为什么数组通过下标随机访问的时间复杂度是0(1); 这是因为数组在内存中存储是连续的,并且数组的声明的时候类型总是确定的,所以我们可以根据这两点来快速知道数组数据的存储。举例来说:

int[] array=new int[]{1,2,3,4};

这个数组是int类型的,则该数组中存储的数组单个元素占用的字节数为4个字节。又由于数组在内存中存储是连续的,所以我们可以快速计算出来第0个元素的数据范围为[0,3),第1个元素是[4,7),然后依次类推;

那么为何数组的下标是从0开始的呢?

a[k]_address = base_address + k * type_size

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

其中k代表的是第几个元素,如果下标是从0开始的,那么a[0]_address_base=0+0*4

如果是下标是从1开始的a[1]_address_base=1+(1-1)*4

base_address代表是基准数字下标,比如从0开始的时候base_address=0,如果是从1开始的时候那么base_address=1

从 1 开始编号,每次随机访问数组元素都多了一次减法运算,对于 CPU 来说,就是多了一次减法指令,这对于cpu级别的优化是尤其的重要。