设计LRU/LFU缓存结构

本文详细介绍了如何设计LRU(最近最少使用)和LFU(最不经常使用)缓存结构。LRU缓存利用双向链表和哈希映射,保证了O(1)的get和set操作。LFU缓存则通过优先级队列和访问计数器,实现按访问频率淘汰元素。文章包含每种结构的要求、设计思路和具体实现代码。
摘要由CSDN通过智能技术生成

目录

一.设计LRU(最近最少未使用)缓存结构

1.要求

2.思路步骤

3.代码

二.设计LFU缓存结构

1.要求

2.思路图解

3.代码


一.设计LRU(最近最少未使用)缓存结构

1.要求

设计LRU(最近最少使用)缓存结构,该结构在构造时确定大小,假设大小为 capacity ,操作次数是 n ,并有如下功能:
1. Solution(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
2. get(key):如果关键字 key 存在于缓存中,则返回key对应的value值,否则返回 -1 。
3. set(key, value):将记录(key, value)插入该结构,如果关键字 key 已经存在,则变更其数据值 value,如果不存在,则向缓存中插入该组 key-value ,如果key-value的数量超过capacity,弹出最久未使用的key-value。

这里set和get要求的时间复杂度为O(1)。

 

2.思路步骤

(1)首先自己维护一个双向链表,其中包含自定义的Node类,Node中包含该节点的value,和前后指针,还有key(方便之后将结点存储在map中get的时间复杂度为O(1)).

(2)初始化一个头结点和尾结点,将两个结点连接起来,之后set或get时对该双向链表维护的结点进行操作

(3)对于get操作时,直接将map中维护的结点返回,然后将该结点设置为最近使用。

(4)对于set操作时,首先判断容量是否足够,如果够,就添加到map和链表中;否则就删除掉链表和map中最久未使用的元素,再将该元素设置为最近使用,并添加到map中。

(5)接下来是用双向链表来维护一个最近最久未使用的规则。首先尾结点存放的是最久未使用的结点,头结点存放最新使用的结点。对于最久未使用结点进行删除转化为删除尾结点和map中存放的结点;对于新结点直接插入到头结点,然后再将结点保存到map中即可;对于老节点的访问,首先需要删除链表中该节点,然后再将该节点插入到链表头(相当于是将结点移动到最新访问的位置)。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值