java之双向链表与哈希表实现LRU缓存机制

背景

在研究双向队列之前,是遇到了这么一道题。
146. LRU缓存机制
这道题的思路是HashMap与双向队列的组合。LRU就是删除最近最少使用的数据值。
比如我先打开了支付宝,之后打开了手机淘宝,之后打开微信,此时在后台就是如下排列
在这里插入图片描述
之后我又点击支付宝,在后台中就会来到队友
在这里插入图片描述
假如缓存容量为3的话,此时又打开了时钟,就会把淘宝从缓存中删除,因为他是最近最少使用的应用。
在这里插入图片描述
那么这道题的思路很清晰了,就是使用一个队列,然后只要用户调用get函数去查找某个key(应用),就把这个key(键值对)放在队列头部,当用户向队列put新的键值对的时候,我们就要判断队列的长度是否超过缓存容量,不超过的话就把新的键值对插入队列的头部,超过的话就把队列尾部的键值对弹出,然后将新的键值对插入队列的头部。下面是代码形式的解释。

/* 缓存容量为 2 */
LRUCache cache = new LRUCache(2);
// 你可以把 cache 理解成一个队列
// 假设左边是队头,右边是队尾
// 最近使用的排在队头,久未使用的排在队尾
// 圆括号表示键值对 (key, val)

cache.put(1, 1);
// cache = [(1, 1)]
cache.put(2, 2);
// cache = [(2, 2), (1, 1)]
cache.get(1);       // 返回 1
// cache = [(1, 1), (2, 2)]
// 解释:因为最近访问了键 1,所以提前至队头
// 返回键 1 对应的值 1
cache.put(3, 3);
// cache = [(3, 3), (1, 1)]
// 解释:缓存容量已满,需要删除内容空出位置
// 优先删除久未使用的数据,也就是队尾的数据
// 然后把新的数据插入队头
cache.get(2);       // 返回 -1 (未找到)
// cache = [(3, 3), (1, 1)]
// 解释:cache 中不存在键为 2 的数据
cache.put(1, 4);    
// cache = [(1, 4), (3, 3)]
// 解释:键 1 已存在,把原始值 1 覆盖为 4
// 不要忘了也要将键值对提前到队头

解决方法

解决方法就是双向链表+哈希表,如下图所示。下图出处
在这里插入图片描述
具体为什么这么解决先放一放,先说下双向链表要实现什么功能。
1.在队头插入元素(每次get操作中都要插入数据头部),
2.删除队尾的元素(每次都要弹出队尾的元素)
3.删除元素(当要把当前的键

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值