利用顺序存储链表节点提高性能

数组和链表,是数据结构和算法领域的基石。

数组相比链表的优势在于,数组是连续存储空间,可以最大化利用CPU Cache。

而链表的相邻节点,其地址可能相差很远,就会导致CPU可能需要去内存寻址而不是在三级缓存中。

那么在某些数据结构的设计时,就可以考虑即使用上数组的连续空间特性,又使用上链表快速新增和删除的特性。

考虑如下一个场景,统计最近10秒,每秒的发送量。

比如,

在第12秒时统计最近10秒的发送量,那么就是把第3秒到第12秒的发送量相加。
在第13秒时统计最近10秒的发送量,那么就是把第4秒到第13秒的发送量相加。
在这里插入图片描述

如果完全使用数组,那么在新增一秒的数据时,因为数组的大小是固定的,就不可避免地要进行元素移动。
如果完全使用链表,上面已经提到了,如果节点地址相差太远,无法利用CPU Cache。

如果将二者的特性结合起来,比如程序启动时,就一次性创建10个链表节点,那么这10个节点在内存中是连续的,然后再将这10个节点连接起来组成一个双链表,那么新增、删除、访问节点就都非常高效。

每次新增一个元素时,其实就相当于先将链表尾部的节点从链表中删除,再将该节点放在链接头部做头节点。

在这里插入图片描述

至于计算总和时,不需要每次都遍历一边相加,可以先减最后一个节点的发送量,再将其从链接删除,新的发送量放到新的头节点后,再加到总和里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值