龙空技术网

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

Ankerwang 332

前言:

目前姐妹们对“数组的下标从什么地址开始好处是什么”大致比较关心,看官们都想要知道一些“数组的下标从什么地址开始好处是什么”的相关资讯。那么小编同时在网络上网罗了一些有关“数组的下标从什么地址开始好处是什么””的相关资讯,希望大家能喜欢,你们一起来了解一下吧!

数组的下标为何是从0开始?不是从1开始更符合人的习惯吗?

带着这个问题,我们来一起讨论下数组这种线性表数据结构。

数组是如何实现随机访问的?

什么是数组?数组是一种线性的数据结构,用一组连续的内存空间,来存储具有相同数据类型的一组数据。

什么是线性表?数据结构是线性排列的,一个数据只有前后两个方向。例如:还有队列,栈,链表。

什么是非线性表?数据结构是非线性排列的,数据之间不是简单的前后关系。例如:二叉树,多叉树,图。

连续的存储空间,正是因为有了这个特性,才使得数组能够随机访问。通过下标的查询时间复杂度是O(1)。但是插入和删除操作,为了保证内存的连续性,通常会整体进行平移操作。

数组的插入和删除操作一定是低效的吗?

正常操作(移动),插入的时间复杂度为多少?现有一个数组,大小为n(大小可自动扩缩),假如我们要在下标为y的位置插入一个元素,我们需要将y~n下标的元素往后移动一位。如果是在数组末尾插入元素,那就不用移动,时间复杂度为O(1),平均下来,数组插入的时间复杂度为O(n)。

再来看删除操作,假如要删除下标为y的元素,为了保证内存空间的连续性。我们同样要对y之后的元素进行移动。同样,删除操作和插入操作相同,最坏情况下的时间复杂度是O(n),最好情况下的时间复杂度为O(1),平均时间复杂度为O(n)。

解答开篇的问题。

现在我们来思考开篇的问题:为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始呢?

例如:数组int a[6],a为数组的首地址,a[0]其实就是地址空间往后偏移0位,还是a,一次类推a[y],表示向后偏移k个4字节的位置(int类型占用4字节)。

给出推到公式:a[y]_address = base_address + y * type_size。

如果下标是从1开始,此时的推到公式为:a[y]_address = base_address + (y-1) * type_size。

y-1 对cpu来说,就会多一次指令的计算。因此选择下标为0开始一个数组的下标。

标签: #数组的下标从什么地址开始好处是什么 #数组中元素的下标是从1开始的 #数组下标怎么表示 #数组下标可以是