数组和链表,是数据结构和算法领域的基石。
数组相比链表的优势在于,数组是连续存储空间,可以最大化利用CPU Cache。
而链表的相邻节点,其地址可能相差很远,就会导致CPU可能需要去内存寻址而不是在三级缓存中。
那么在某些数据结构的设计时,就可以考虑即使用上数组的连续空间特性,又使用上链表快速新增和删除的特性。
考虑如下一个场景,统计最近10秒,每秒的发送量。
比如,
在第12秒时统计最近10秒的发送量,那么就是把第3秒到第12秒的发送量相加。
在第13秒时统计最近10秒的发送量,那么就是把第4秒到第13秒的发送量相加。
如果完全使用数组,那么在新增一秒的数据时,因为数组的大小是固定的,就不可避免地要进行元素移动。
如果完全使用链表,上面已经提到了,如果节点地址相差太远,无法利用CPU Cache。
如果将二者的特性结合起来,比如程序启动时,就一次性创建10个链表节点,那么这10个节点在内存中是连续的,然后再将这10个节点连接起来组成一个双链表,那么新增、删除、访问节点就都非常高效。
每次新增一个元素时,其实就相当于先将链表尾部的节点从链表中删除,再将该节点放在链接头部做头节点。
至于计算总和时,不需要每次都遍历一边相加,可以先减最后一个节点的发送量,再将其从链接删除,新的发送量放到新的头节点后,再加到总和里。