链表&顺序表—优缺点对比

目录

链表:

优点:

缺点:

顺序表:

缺点:

优点:


链表:

优点:

1、任意位置插入删除O(1)

2、按需申请释放空间

缺点:

1、不支持下标随机访问

2、CPU高速缓存命中率会更低

  1. 内存非连续性:链表的节点通常不是在内存中连续存储的,每个节点可能分布在不同的内存地址上。这与CPU缓存的一级缓存(L1 Cache)和二级缓存(L2 Cache)的工作方式不匹配,这些缓存更喜欢处理连续内存块,因为它们采用缓存行(cache lines)的方式加载数据。当遍历链表时,由于节点的内存不连续,缓存行可能不断被刷新,导致缓存命中率降低。

  2. 缓存行失效:当CPU加载一个特定内存地址的数据时,它通常会加载整个缓存行,而不仅仅是单个数据项。链表节点之间的间隔较大,可能会导致多个节点散布在不同的缓存行中。当CPU访问一个链表节点,只有一个节点的数据被缓存,而其他节点可能因此而被缓存行失效。这会导致额外的内存访问开销,从而减低了缓存命中率。

  3. 缓存容量限制:CPU缓存有限的容量,如果链表过大,其中的节点数量超过了缓存能够容纳的范围,那么缓存的数据将会频繁被替换出去,导致更低的缓存命中率。这是因为缓存采用替换策略,最近使用的数据可能会被淘汰以给新的数据腾出空间。

顺序表:

缺点:

1、前面部分插入删除数据,效率是O(N),需要挪动数据。

2、空间不够,需要扩容。

        a、扩容是需要付出代价的

        b、一般还会伴随空间浪费。

优点:

1、尾插尾删效率不错。

2、下标的随机访问。

3、CPU高速缓存命中率会更高

  1. 内存连续性:顺序表中的元素是在内存中连续存储的,也就是它们在物理内存上的地址是相邻的。这与CPU缓存的工作方式非常匹配,因为缓存通常加载整个缓存行,连续存储的元素能够充分利用缓存行的性能,提高数据的加载效率,从而提高缓存命中率。

  2. 数据局部性:顺序表充分利用了数据局部性原理,当CPU访问一个元素时,通常会连续地访问相邻的元素。这符合缓存的预取机制,缓存会将可能需要的数据预取到缓存中,因为下一个元素通常在内存中也是相邻的,所以它们很可能也在缓存中。

  3. 缓存容量利用:由于顺序表的数据是紧凑排列的,它可以更好地利用CPU缓存的有限容量。这意味着更多的数据可以同时驻留在缓存中,减少了缓存替换的频率,提高了命中率。

你可能感兴趣的:(数据结构,链表,数据结构,c语言)