03_链表(上)
作者:互联网
03_链表(上)
写在最前
缓存淘汰策略
-
FIFO(First In, First Out):先进先出策略。
-
LFU(Least Frequentlly Used):最少使用策略。
-
LRU(Least Recently Used):最近最少使用策略。
链表与数组
链表与数组不一样,不需要一块连续的内存空间,他通过“指针”将一组零散的内存块串联起来使用。
同样是申请一个100MB大小的空间,当内存中没有连续的这么大空间时,数组会申请失败。
单链表、循环链表、双向链表
单链表
单链表结构示意图
这种结构的好处,插入和删除数据不需要搬运过多数据,速度快。
插入和删除数据的时间复杂度:O(1)
查询元素的时间复杂度:O(n) 需要遍历链表
循环链表
相比于单链表,多了一个从尾指针指向头指针的指针,形成一个闭环。
循环链表结构示意图
双向链表
顾名思义,支持两个方向遍历,多了一个前驱指针。
双向链表结构示意图:
弊端:增加一个指针的内存空间。
优点:删除和插入数据更加灵活。
双向循环链表
双向链表结构示意图:
数组与链表
数组与链表的对比,并不能局限于时间复杂度。在时间的业务开发当中,不能仅仅利用复杂度分析就决定使用哪个数据结构来进行使用,需要针对不同的业务场景,来进行选择。
使用链表实现LRU缓存淘汰算法
思路:维护一个有序单链表,越靠近链表尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们从链表头开始顺序遍历链表。
-
访问的这个数据之前已经被缓存在链表当中,我们遍历链表得到这个数据对应的结点,将其从原来的位置删除,然后插入到链表的头部。
-
访问的这个数据不在缓存的链表中:
-
如果此时缓存未满,则将此结点直接插入到链表的头部。
-
如果此时缓存已满,则链表的尾结点删除,将新的数据结点插入链表的头部。
-
基于链表的思路,缓存的访问时间复杂度为O(n)。
标签:03,结点,缓存,复杂度,链表,单链,指针 来源: https://www.cnblogs.com/l12138h/p/16399103.html