顺序表与链表对比
链表
优点
1.任意位置插入删除O(1)
2.按需申请内存
缺点
1.不支持下标随机访问
2.cpu高速缓存命中率比较低
---------------------------------------------------------------------------------------------------------------------------------
顺序表
缺点
1.头部或者中部的插入删除会浪费大量空间
2.空间不够需要扩容
a.扩容是有代价的(尤其是realloc异地扩容)
b.往往伴随着空间浪费
优点
1.尾插尾删效率不错
2.支持下标随机访问
3.cpu高速缓存命中率比较高
缓存利用率参考存储体系结构 以及 局部原理性
电脑上的存储设备
寄存器(集成到cpu),高速缓存,内存,硬盘······
早期cpu处理数据是从内存中拿的,但是由于cpu的发展,cpu访问数据的速度越来越快,内存的读写速度已经跟不上了,就出现了高速缓存和寄存器这样的概念
以后cpu处理数据从寄存器中拿,即寄存器中没有便会从高速缓存中拿数据,依次类推
但是寄存器通常是比较小的,因此cpu访问少量数据的话内存中的数据是往寄存器加载的,访问大量数据内存中的数据是往高速缓存中加载的
这就引出了两个概念~
缓存命中:cpu从缓存访问特定数据,若数据已经在缓存中,就叫缓存命中
缓存不命中:cpu从缓存访问特定数据,若数据不在缓存中,就叫缓存未命中,数据会加载到缓存中,再进行访问
而加载数据通常是加载一段的(一般为cpu的字长)
若要访问的数据是以数组的形式存储的,由于数组的元素存储是连续的,这时加载一段,基本就会把数组的数据都加载到缓存中,因此缓存命中率比较高
若要访问的数据是以链表的形式存储的,由于链表的节点地址是随机的,这时加载一段,后面的节点大概率不会加载到缓存中,因此缓存不命中率较高,当然还会有另外一个问题---缓存污染,因为加载一段,当前节点后面的数据往往不是我想要的,但是会加载进高速缓存,若高速缓存满了,还可能会把我要访问的数据挤出去,因此造成缓存污染