数据结构 —— 顺序表和链表(带头双向循环链表)的优缺点、以及CPU高速缓存命中率

一、顺序表和链表的区别

注:缓存利用率参考存储体系结构以及局部原理性。 

 1. 顺序表的优点和缺点:  

优点:可以下标随机访问、CPU高速缓存命中率高。

缺点:头部或者中间位置插入或者删除数据效率低、扩容有一定程度性能消耗、 可能存在一定程度空间浪费。

2. 链表(带头双向循环链表)的优点和缺点:

优点:任意位置插入或者删除数据都是 O(1),并且按需申请释放。

缺点:不支持下标随机访问。

注:

CPU高速缓存命中率高:

如上图的存储器层次结构,主存(内存)的下面是磁盘与二级储存(网盘等),内存与磁盘的区别就是带电存储与不带电存储,内存之上是三级缓存与寄存器。

举例来说:

如果要打印 顺序表,那么访问顺序表数据的命令是 CPU 去执行的;CPU 先去 三级缓存 中去看有没有,没有的话会在 内存 中去拿;因为顺序表连续存储的,当 CPU 三级缓存 中找第一个没有的时候,会去 内存 中去拿取到 缓存 里,CPU 拿的时候不会只把第一个拿取到 缓存 里,而是把第一个后面的也拿取到 缓存 里(局部性原则),一般是拿取 几十个字节,具体看 CPU;因为后面的也拿取到了 缓存 里,所以 CPU 访问后面的地址就会都在 缓存 里面,所以缓存命中率高,这是物理空间连续的好处。

如果打印 链表 ,那么访问链表的命令也是 CPU 去执行的;CPU 先去 缓存 中找没有的话,再去内存中拿取到 缓存 中,但因为链表不是连续存储 的,所以他可能不会把后面的数据(后面的数据指的是链表的数据)拿取到 缓存 中,基本上很小可能拿取到。甚至可能带来 缓存污染 的问题,意思就是说:去 内存 中拿取第一个的时候,拿取了后面的,但是后面的数据不是链表中的数据,而 缓存 的存储很小,把不需要的拿取到缓存中会把缓存中已经有的挤掉了。

扩容有一定程度性能消耗:

因为扩容存在原地扩异地扩:如果原数据后面要扩容的空间够,那么扩容就接在原数据后面扩容(原地扩);但如果原数据后面扩容空间不够,那么扩容会找一块新的地址空间扩容,然后把原数据拷贝下来(异地扩)。如果频繁这样操作会存在性能的消耗。

可能存在一定程度空间浪费:

因为扩容一般是扩 2 倍,但假如现在空间已经 200 个数据满了,我还要继续插入 1 个数据,扩容那么就会扩到 400 ,但我只插入 1 个数据,浪费 199 个空间;但如果每次扩几个的话,可需要插入的数据多,那么就会出现频繁扩容,频繁扩容就会出现性能的消耗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值