【数据结构与算法从0到1】三、顺序表与链表的优势对比

上一节:【数据结构与算法从0到1 - C实现】二、链表的解析与实现

下一节:【数据结构与算法从0到1 - C实现】四、栈的解析与实现


目录

1 顺序表

1.1 优点

1.2 缺点

2 链表

2.1 优点

2.2 缺点

3 关于CPU高速缓存命中率


顺序表和链表都可以用于在内存中存储一系列的数据,但在使用时,我们需要考虑其各自的优劣性来进行选择。

1 顺序表

1.1 优点

  • 支持随机访问(使用下标访问)。需要随机访问结构支持的算法可以很好的适用。
  • CPU高速缓存命中率更高。

1.2 缺点

  • 头部及中间插入删除数据时间效率低。O(N)
  • 连续的物理空间,空间不够了就需要增容。
    • 增容有一定程度的消耗。
    • 为了避免频繁增容,我们一般按照倍数去增,用不完可能存在一定的空间浪费

2 链表

双向带头循环链表

2.1 优点

  • 任意位置插入删除效率高。O(1)
  • 按需申请释放空间。

2.2 缺点

  • 不支持随机访问(用下标访问)。意味着:一些排序、二分查找等在在这种结构上不适用。
  • 链表存储一个值,同时要存储链接指针,也有一定的消耗。(很小,可以忽略)
  • CPU高速缓存命中率更低。

3 关于CPU高速缓存命中率

这个点涉及到计算机运行的底层问题,这里简单解释一下。

计算机想要进行运算,就必须先将数据加载到缓存中。而为了提高载入数据的效率,一般一次读取内存中的一段连续的数据。读取的这部分内存的数据中有我们想要缓存的数据,就称之为命中。

这里就将整个顺序表和链表缓存的过程进行对比。

刚开始,缓存中应该是没有我们想要加载的数据的,所以无论是顺序表还是链表,第一个数据是没有命中的。因此下一次加载就以第一个数据的地址作为读取内存中一段连续空间的起始位置。

我们知道,顺序表中的数据在内存中的物理地址是连续的,因此,在这一段连续内存空间中,顺序表的至少前一段的每个数据都是命中的(之所以说是至少,是考虑到连续空间的大小与顺序表的大小匹配问题)。因此我上面说顺序表的CPU高速缓存命中率更高。

而链表中的数据是逻辑连续而非物理连续的,即每个数据的内存地址不一定(几乎绝大多数不是)是相连的。所以第一个没有命中,就以第一个的地址为起始,加载一段连续的内存空间,会发现第二个也有极大的可能没在这段连续空间中,即第二个也没命中,就会以第二个数据的地址为起始,重新加载一段连续的内存空间,依次进行,会发现链表数据的命中的几率很小,也就是我上文说的CPU高速缓存命中率更低。而且链表在加载到缓存的过程中,会将我们不需要的内存中的数据读取到缓存中,造成缓存污染:缓存中充斥着大量我们本不需要的数据,而缓存的空间大小有限,在缓存满了之后,就可能将之前加载的数据清理出缓存。


 所属个人专栏:数据结构与算法

上一节:【数据结构与算法从0到1 - C实现】二、链表的解析与实现

下一节:【数据结构与算法从0到1 - C实现】四、栈的解析与实现

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值