目录
1.链表与顺序表的区别
1.1 存储空间
1.2 插入删除
1.3 扩容
1.4 使用场景
1.5 缓存使用率
1.链表与顺序表的区别
1.1 存储空间
顺序表在物理上与逻辑上都是连续的
链表在逻辑上连续物理不一定连续
因此顺序表我们可以任意访问而链表不可以随机访问
链表每次访问都要从头结点遍历
1.2 插入删除
顺序表需要进行移动效率低,链表只要改变指针的指向就行
但如果我们尾删时顺序表的效率也高
1.3 扩容
顺序表需要考虑扩容,而链表没有容量的概念避免了空间浪费
并且顺序表扩容本身就需要消耗,还有空间浪费因此链表在空间
上更优
1.4 使用场景
顺序表适用于我们频繁地访问数据以及高效存储
链表使用于任意位置的删除插入
1.5 缓存使用率
顺序表的缓存利用率大于链表的使用率
下面我们先看一下存储器层次结构
可以看到从下往上越靠上的读取数度越快越往下内存越大读取速度越慢
我们可以想一下平常我们的数据都是放在内存中的当我们需要访问时需要先把内存加载到缓存为了提高效率。我们想一下如果我们现在要读数据我们需要从内存加载到缓存如果我们一次就加载一个数据到缓存是不是效率很低如果我们一次加载n个数据(这里其实是取该数据往后连续的一段内存空间)这样如果当我们下次再取一个数据时可能就不需要再次将数据加载到缓存中。如果再次取一个数据在我们前一次取数据时该数据已经加载到缓存中就叫缓存命中。也就是我们的缓存使用率。
这样我们知道顺序表在物理上是连续的
如上我们第一次就取数据1当加载到缓存中的可能就是1,2,3,4(这里是一个假设具体加载多少要看缓存容量)这样我们下次取2时是不是就不用加载到缓存了这就是缓存命中。因为顺序表是连续的因此我们取1时会把1后面的一段连续内存空间加载到缓存这样就提高了缓存使用率。
相反链表物理上不一定是连续的因此当我们取一段连续的空间时可能里面没有我们下次访问的数据因此缓存利用率低