灵魂一问:数组的查找为什么比链表快?

365bet网投娱乐 2025-10-31 01:06:44 admin 阅读 9860
灵魂一问:数组的查找为什么比链表快?

一般面试大概率会问到数组与链表的比较,那大家一定都知道数组的查找效率优于链表,那么为什么会这样呢,我们今天来仔细分析下原因。

一、什么是数组?

我想大家应该都知道答案:数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

有两个关键词:

线性表

顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。其实除了数组,链表、队列、栈等也是线性表结构。

内存连续,数据类型相同

因为这两个特性,数组才有了一个强大的特性:随机访问

这也是面试中常用的回答,数组直接根据下标地址定位到元素,链表要遍历元素找到指定的元素!

二、说到数据的访问,那你知道数组是如何实现根据下标随机访问数组元素的吗?

我们知道,计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:

a[i]_address = base_address + i * data_type_size

当我们要找a[2]的时候,直接根据公式就可以定位到地址(1000 + 2*4)这也是内存连续带来的好处。而链表则要先拿到第一个元素,在通过next指向的地址找到第二个元素,依次操作。。。

三、还有一种解释!

CPU缓存会把一片连续的内存空间读入,因为数组结构是连续的内存地址,所以数组全部或者部分元素被连续存在CPU缓存里面,平均读取每个元素的时间只要3个CPU时钟周期。 而链表的节点是分散在堆空间里面的,这时候CPU缓存帮不上忙,只能是去读取内存,平均读取时间需要100个CPU时钟周期。这样算下来,数组访问的速度比链表快33倍!(这个数据我也没试过,不清楚哈)

https://blog.csdn.net/islandww/article/details/72511737

ps:(图片来源:《数据结构与算法之美》)

相关文章

桡骨茎突骨折多久能干重活
写给大学新生:读大学究竟读什么?
求职不焦虑一文看懂所有销售