前言:这里的链表指的是带头双向循环链表.
顺序表与链表的优缺点
顺序表的优点:
1 支持下标的随机访问;
2 cpu高速缓存命中率高.
顺序表的缺点:
1 中间位置的插入删除效率低O(N);
2 扩容会有一定的性能开销,realloc在扩容时,若原空间后面没有足够的空间,
会在堆区的其它位置重新申请一块空间,把原空间的数据拷贝进去,同时自动释放旧空间.
3 扩容也会存在一定的空间浪费,一般扩2倍,当要存101个数据时,只有100个数据的空间,
那么最后会浪费99*这类数据的空间大小.
链表优点:
1 按需申请和释放节点;
2 任意位置插入删除效率高O(1).
链表缺点:
1 不支持下标随机访问;
2 cpu高速缓存命中率低.
因此顺序表适用于频繁访问的情况;
链表适用于频繁进行任意位置插入删除的情况。
关于cpu高速缓存命中率
数据结构是在内存中管理数据,链表和顺序表的数据均存储在内存中。
计算机的部分存储介质:
当遍历链表或顺序表时,cpu本应去内存中读取数据,
可是cpu的速度与内存的速度相比,cpu非常快。
为了进行速度的匹配,引入了寄存器(数据量小才会进这里,一般4byte或8byte)和高速缓存.
于是cpu不会直接去访问内存,而是先访问高速缓存,
cpu拿到一个地址后访问一个位置:
1 若该位置在缓存中就直接访问,
2 若不在则先加载到缓存中,再去缓存访问。
同时,cpu在把这个位置加载到缓存时,还会把后面的一段加载上去.
以顺序表为例【他的物理空间连续】:
当cpu去访问顺序表的第一个位置时,这个位置通常不在高速缓存中,
所以会把这个位置和后面的一段加载到高速缓存。
于是第一次没命中,后面的基本都能命中(加载后面多大的一段具体看cpu).
因此顺序表的cpu高速缓存命中率高.
相反,链表中各个节点的地址都是随机的,不一定连续,
因此链表的cpu高速缓存命中率低.