为什么很多编程语言的数组都是从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级别的优化是尤其的重要。