数据结构——链表与顺序表的对比

95 阅读2分钟

前言:这里的链表指的是带头双向循环链表.

顺序表与链表的优缺点

顺序表的优点:

1 支持下标的随机访问;

2 cpu高速缓存命中率高.

顺序表的缺点:

1 中间位置的插入删除效率低O(N);

2 扩容会有一定的性能开销,realloc在扩容时,若原空间后面没有足够的空间,

会在堆区的其它位置重新申请一块空间,把原空间的数据拷贝进去,同时自动释放旧空间.

3 扩容也会存在一定的空间浪费,一般扩2倍,当要存101个数据时,只有100个数据的空间,

那么最后会浪费99*这类数据的空间大小.

链表优点:

1 按需申请和释放节点;

2 任意位置插入删除效率高O(1).

链表缺点:

1 不支持下标随机访问;

2 cpu高速缓存命中率低.

因此顺序表适用于频繁访问的情况;

链表适用于频繁进行任意位置插入删除的情况。

关于cpu高速缓存命中率

数据结构是在内存中管理数据,链表和顺序表的数据均存储在内存中。

计算机的部分存储介质:

image.png

当遍历链表或顺序表时,cpu本应去内存中读取数据,

可是cpu的速度与内存的速度相比,cpu非常快。

为了进行速度的匹配,引入了寄存器(数据量小才会进这里,一般4byte或8byte)和高速缓存.

于是cpu不会直接去访问内存,而是先访问高速缓存

cpu拿到一个地址后访问一个位置:

1 若该位置在缓存中就直接访问,

2 若不在则先加载到缓存中,再去缓存访问。

同时,cpu在把这个位置加载到缓存时,还会把后面的一段加载上去.

以顺序表为例【他的物理空间连续】:

image.png

当cpu去访问顺序表的第一个位置时,这个位置通常不在高速缓存中,

所以会把这个位置和后面的一段加载到高速缓存。

于是第一次没命中,后面的基本都能命中(加载后面多大的一段具体看cpu).

因此顺序表的cpu高速缓存命中率高.

相反,链表中各个节点的地址都是随机的,不一定连续,

因此链表的cpu高速缓存命中率低.