为什么有些编程语言的数组要从零开始算

这个问题,Dijkstra大神在1982年就写过论文了,题为 Why numbering should start at zero

总共也就3页手写,我就摘重点的大致翻译一下:

为了表示一个自然数序列2, 3, …, 12,排除掉中间的那三个点(...),总共有四种方式可供我们选择:

a) 2 <= i < 13
b) 1 < i <= 12
c) 2 <= i <= 12
d) 1 < i < 13

有没有什么原因使得我们应该选其中的某一种而不是其他的呢?是的,的确有。观察到 a) 和 b) 的优势是不等式的上下界之差恰好是序列的长度。基于此,作为一个中间结论:在 a) 和 b) 两种表达中中,两个序列是邻接的就意味着一个的上界等于另外一个的下界。但这些考量并没有让我们从 a) 和 b) 之中做出选择,所以我们从头开始。

存在一个最小的自然数。排除掉下界——就像 b) 和 d) 中那样——就会使得一个从最小的自然数开始的序列的下界变成非自然数。这样的表达方式很难看,所以对于下界应该更倾向于<=,就像 a) 和 c) 那样。现在,考虑一下从最小的自然数开始的序列:假如包含上界,当序列缩小成空序列时,就会使得 c) 不那么像自然数集。这样的表达方式也很难看,所以对于上界应该更倾向于<,就像 a) 和 d) 那样。综上所述, 我们应该倾向于使用 a) 的表达方式。

当处理长度为N的序列时,我们期望通过下标来区分它的元素。下一个恼人的问题就是,我们该给它的第一个元素赋予什么下标值?使用 a) 的表达方式,当下标从1开始时,下标范围为 1 <= i < N+1;当下标从0开始时则是 0 <= i < N,更好看。所以,让我们将序号从0开始:一个元素的序号(下标)等于序列中在它前面的元素个数。这个故事的寓意是我们更应该——过了这么多个世纪!——把0当作一个自然数。

来自知乎:为什么有些编程语言的数组要从零开始算?

为什么有些编程语言的数组要从零开始算

时间: 2024-10-05 23:55:31

为什么有些编程语言的数组要从零开始算的相关文章

基于数组二分查找算法的实现

基于数组二分查找算法的实现 二分查找 查找 算法 赵振江 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功

《数据结构与算法之美》 &lt;03&gt;数组:为什么很多编程语言中数组都从0开始编号?

提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊. 是的,在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构.尽管数组看起来非常基础.简单,但是我估计很多人都并没有理解这个基础数据结构的精髓. 在大部分编程语言中,数组都是从 0 开始编号的,但你是否下意识地想过,为什么数组要从 0 开始编号,而不是从 1 开始呢? 从 1 开始不是更符合人类的思维习惯吗? 你可以带着这个问题来学习接下来的内容. 如何实现随机访问? 什么是数

05| 数组:为什么很多编程语言中数组都从 0 开始编号?

提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊. 是的,在每一种编程语言中,基本都会有数组这种数据类型.不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构.尽管数组看起来非常基础.简单,但是我估计很多人都并没有理解这个基础数据结构的精髓. 在大部分编程语言中,数组都是从0开始编号的,但你是否下意识地想过,为什么数组要从0开始编号,而不是从1开始呢? 从1开始不是更符合人类的思维习惯吗? 你可以带着这个问题来学习接下来的内容. 如何实现随机访问? 什么是数组?我估计你心中

5、数组:为什么很多编程语言中数组都从0开始编号?

从数组的内存模型上来看,"下标"最确切的定义应该是"偏移(offset)".那么a[0]就是偏移为0 的位置,即首地址,a[k]就表示偏移k个type_size的位置,所以计算a[k]的内存地址: a[k]_address = base_adress+k*typ_size 但是,如果从1开始计数,那么a[k]=base_adress+(k-1)*typ_size.不难发现,从1开始,对CPU而言,多了一次减法指令,那么效率的优化就尽可能做到极致. 原文地址:http

Chapter 5 数组:为什么很多编程语言种数组都是从0开始编号?

如何实现随机访问? 线性表:数组,队列,链表,栈 非线性表:树,图 总结:数组用一块连续的内存空间,来存储相同类型的一组数据,最大的特点就是支持随机访问,但插入,删除操作也因此变得比较低效,平均情况时间复杂度未O(n).在平时的业务开发种,我们可以直接使用变成语言提供的容器类,但是,如果是特别底层的开发,直接使用数组会更合适. 原文地址:https://www.cnblogs.com/zhaohu/p/9974996.html

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

1.什么是数组? 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据. 概念解析:       线性表:线性表就是数据排成像一条线一样的结构.每个线性表上的数据最多只有前和后两个方向.其实除了数组,链表.队列.栈等也是线性表结构. 连续的内存空间和相同类型的数据:所以数组根据下标具有随机访问特性,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除.插入一个数据,为了保证连续性,就需要做大量的数据搬移工作. 2.数组是如何实现根据下标随机访问数

为什么“含头不含尾”是科学的

什么是美? 在理工科领域,简单就是美.计算机软件领域也是一样.简单意味着易理解,不容易出Bug. 从0开始的数组下标 在计算机编程中数组的下标往往是从0开始,而老百姓熟悉的是从1开始的数字.按道理从1开始更自然更容易接受,也就意味着简单,可为什么多数的编程语言的数组是从零开始的呢?这个可不仅仅是习惯和语言设计者的个人的喜好的问题. 一句话,从0开始能够在许多方面带来运算的简单化.比如一维数组和二维数组的换算.如果我们规定下标,都从1开始,那么一维数组的下标就会是从1到9对应的二维数组的坐标就是(

辛星解读之php中的重点函数第一节之数组函数

这里我已经写好它的pdf版本了,比本博客更加适合阅读.首先说一下它在百度网盘的下载地址把:百度网盘下载 ,如果左边连接跪了,可以在浏览器中输入:http://pan.baidu.com/s/1qW5AYzM 来下载.然后说一下它在csdn的下载地址,是免积分的奥,下载地址:csdn资源下载处 ,如果连接不起作用,可以在浏览器输入:http://download.csdn.net/detail/xinguimeng/7697309  来手动下载. 好,我们知道php中函数还是很多的,正是这些函数为

Java中数组操作 java.util.Arrays 类常用方法的使用

任何一门编程语言,数组都是最重要和常用的数据结构之一,但不同的语言对数组的构造与处理是不尽相同的. Java中提供了java.util.Arrays 类能方便地操作数组,并且它提供的所有方法都是静态的.下面介绍一下Arrays类最常用的几个方法. 1.  数组排序 Arrays工具类提供了一个sort方法,只需要一行代码即可完成排序功能. 2.  数组转换为字符串 Arrays提供了一个toString方法,可以直接把一个数组转换为字符串,这样可以方便观察数组里的元素. //来源:公众号[时光与