为什么数组的下标从 0 开始?

共 1152字,需浏览 3分钟

 ·

2021-07-31 02:46

大家好,我是sai哥~


数组,作为技术同学一定不会陌生。天天和它打交道,闭着眼都认识它。

首先,我们来复习下数组的定义

数组是一组连续内存空间存储的具有相同类型的数据,整个排列像一条线一样,是一种线性表数据结构。


1d6ab364882d4c443253ce132b4ddb34.webp


那么,问题来了,数组的下标为什么要从 0 开始?从 1 开始行不行?

19980600ec0400ac90dac2d48b97dfea.webp

端好你的小茶杯,开始进入正题

数组之所以广泛使用,是因为它支持随机访问。


什么叫随机访问?

数据在内存中都是按顺序存放的,通过下标直接触达到某一个元素存放的位置。


8bee13c881a28f25a208b17945568b54.webp


公式:Tom哥[n] = base_address + n * data_size
  • base_address,表示数组的首地址
  • n,表示偏移量
  • data_size,表示数组类型的字节数

① 读取上面数组的 【0】位置的 `微`
② 读取上面数组的 【9999】位置的 `注`

由于基于计算的内存地址读取数据,上面两种情况的耗费的时间是一样,时间复杂度为 O(1)

注意:想要使用随机访问,一定要满足两个条件:  1、连续的内存空间  2、相同类型的数据


知识补充:

随机访问对应的是顺序访问

顺序访问:链表在内存中不是按顺序存放的,而是通过指针连在一起,访问某一元素,必须从链头开始顺着指针才能找到某一个元素。


突然,一个奇怪的念头冒了出来,假如我们将数组的首个下标从 1 开始 ,会怎么样?


4c8fa6b638cdd64d0d017d993999e2ea.webp


我们读取 下标为n 的数据


公式:Tom哥[n] =  base_address + (n-1) * data_size

与上面的公式的区别,多了一次 n-1 操作

虽然也能读取数组中的值,但是多了一次减法的指令运算。


2ac32644af03c290990cebd7e0b50ca6.webp


数组是一个最基础最简单的数据结构。要知道我们的上层API内部很多都会依赖于数组,而互联网应用又讲究一个高并发,一言不合就是千万级QPS,如此高频的访问量,这个冗余的减运算 就会放大无数倍,产生巨大的性能损耗。

这样说,可能大家感受不一定明显!!!

”我在马路边捡到一分钱,把它交到警察叔叔手里边“。现在再有一分钱,你还会捡吗,估计很多人都看不上眼,但要是全国人民每人给你一分钱呢

14亿 * 1分钱 =  1400万 人民币


ac4cad8e1ff4869e3baf1e13e7b21afb.webp


是不是可以立马辞职,回家躺平了!

量变引发质变,做软件开发,我们一定要考虑将性能优化到极致,骨子里透着工匠精神。



关于Tom哥:前阿里架构师,出过专利,竞赛拿过奖,CSDN博客专家,负责过电商交易、社区生鲜、营销、金融等业务,多年团队管理经验,爱思考,喜欢结交朋友!

推荐阅读

面试题:mysql 一棵 B+ 树能存多少条数据?

代码写的烂,经常被同事怼,教你一招!

同事问我,SQL 语句明明命中了索引,为什么执行很慢?

学会这10个设计原则,离架构师又进了一步!!!

亿级系统的Redis缓存如何设计???

人人都是架构师???谈何容易!!

浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报