其他分享
首页 > 其他分享> > 03_链表(上)

03_链表(上)

作者:互联网

03_链表(上)

写在最前

缓存淘汰策略

链表与数组

链表与数组不一样,不需要一块连续的内存空间,他通过“指针”将一组零散的内存块串联起来使用。

同样是申请一个100MB大小的空间,当内存中没有连续的这么大空间时,数组会申请失败。

单链表、循环链表、双向链表

单链表

单链表结构示意图

这种结构的好处,插入和删除数据不需要搬运过多数据,速度快。

插入和删除数据的时间复杂度:O(1)

查询元素的时间复杂度:O(n) 需要遍历链表

循环链表

相比于单链表,多了一个从尾指针指向头指针的指针,形成一个闭环。

循环链表结构示意图

双向链表

顾名思义,支持两个方向遍历,多了一个前驱指针。

双向链表结构示意图:

弊端:增加一个指针的内存空间。

优点:删除和插入数据更加灵活。

双向循环链表

双向链表结构示意图:

数组与链表

数组与链表的对比,并不能局限于时间复杂度。在时间的业务开发当中,不能仅仅利用复杂度分析就决定使用哪个数据结构来进行使用,需要针对不同的业务场景,来进行选择。

使用链表实现LRU缓存淘汰算法

思路:维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。

  1. 访问的这个数据之前已经被缓存在链表当中,我们遍历链表得到这个数据对应的结点,将其从原来的位置删除,然后插入到链表的头部。

  2. 访问的这个数据不在缓存的链表中:

    • 如果此时缓存未满,则将此结点直接插入到链表的头部。

    • 如果此时缓存已满,则链表的尾结点删除,将新的数据结点插入链表的头部。

基于链表的思路,缓存的访问时间复杂度为O(n)。

 

标签:03,结点,缓存,复杂度,链表,单链,指针
来源: https://www.cnblogs.com/l12138h/p/16399103.html