数据结构:缓存淘汰策略

本文介绍了三种缓存淘汰策略——FIFO、LFU和LRU,重点讲解了LRU的链表和数组实现方式。在链表实现中,访问的数据不在缓存中时,若链表未满则插入头部,已满则删除尾部并插入头部;而在数组实现中,可选择首位置或尾位置存放最新访问数据,满时清理相应端的数据。这两种方法都确保了最近最少使用的数据优先被淘汰。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三种缓存淘汰策略

1.FIFO - First In First Out - 先进先出
2.LFU - Least Frequently Used - 最少 - 使用
3.LRU - Least Recently Used - 最近 - 最少 - 使用


其中LRU使用最广,下面介绍 使用 链表 和 数组 来实现LRU


单链表实现LRU

(1)当访问的数据 - 没有存在 - 于存储缓存的链表中时:
i- 如果缓存链表没满:将数据插入链表表头,时间复杂度为 O(1);
ii - 如果缓存链表满了:删除链表的末位,将新数据添加到 缓存链表 的表头,时间复杂度为 O(1)。
该图为链表未满的情况

(2)当访问的数据 - 存在于 - 存储缓存的链表中时:
将该数据对应的节点,调整到链表表头,时间复杂度为 O(1)。

缓存链表满,从链表尾部开始清理。


数组实现LRU

第一种:数组首位置存放最新访问的数据,缓存满,最先清理数组末尾
(1)最新访问的数据 - 未存在 - 于缓存数组中时:
i - 缓存数组未满:将数据插入到数组首位,数组内的其他数据依次向后移动一位。时间复杂度为 O(n)
ii - 缓存数组满:清理 数组 末尾,再存入新的。
在这里插入图片描述

(2)最新访问的数据 - 存在 - 于缓存数组中时:将该数据移动至数组首位,其他数据依次向后移动。时间复杂度为O(n)
在这里插入图片描述

缓存数组满时,首先清理数组末尾的数据。

第二种:数组末尾存放最新访问的数据,缓存满,最先清理数组首位
(1)最新访问的数据 - 未存在 - 于缓存数组中时:将数据插入到数组末尾,时间复杂度为 O(n)
在这里插入图片描述

(2)最新访问的数据 - 存在 - 于缓存数组中时:将该数据移动至数组末尾,其他数据根据情况依次向前移动,时间复杂度为O(n)
在这里插入图片描述

缓存数组满时,清理数组首位置的元素,剩余元素根据需要依次向前移动。
在这里插入图片描述

补充代码等待!!!

(看文章整理的,如有错误,欢迎指正,感谢。)
侵删

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值