当前位置: 首页 > news >正文

LRU Java实现

总结下来,步骤大致是:

定义节点类,包含前驱、后继、键和值。
定义LRUCache类,包含容量、哈希表、头尾哑节点。
初始化时,创建头尾节点并连接,方便插入和删除操作。
get方法:如果存在节点,移动它到头部,返回值;否则返回-1。
put方法:如果存在节点,更新值并移动;否则创建新节点,添加到哈希表和链表头部,检查容量,超限则删除尾部节点。
辅助方法:添加节点到头部,删除节点,移动节点到头部,删除尾部节点。
这样应该就能正确实现LRU缓存了。然后,复杂度分析则是每个操作都是O(1),因为哈希表和双向链表的操作都是常数时间。
在这里插入图片描述

import java.util.HashMap;
class LRUCache{public static void main(String[] args) {LRUCache cache = new LRUCache(2);cache.put(1,11);cache.put(2,22);cache.put(3,33);cache.get(2);cache.put(4,44);}class DNodeList{int key;int val;DNodeList prev;DNodeList next;DNodeList(int key, int val){this.key = key;this.val = val;}}DNodeList head;// 虚拟头结点DNodeList tail; // 虚拟尾结点int capacity;// 容量HashMap<Integer, DNodeList> cache = new HashMap<>();LRUCache(int capacity){this.capacity = capacity;head = new DNodeList(-1, -1);tail = new DNodeList(-1, -1);head.next = tail;tail.prev = head;}// 存储节点的Hash表// 获取值int get(int key){if(!cache.containsKey(key)){return -1;}DNodeList node = cache.get(key);// 移动到头部moveToHead(node);return node.val;}// 放置值void put(int key, int val){if(cache.containsKey(key)){DNodeList node = cache.get(key);node.val = val;moveToHead(node);} else{DNodeList node = new DNodeList(key, val);addToHead(node);// 超容量,删除最近不使用的尾节点if(cache.size() > capacity){// 删除尾结点removeTail();}}}// 移动到头部void moveToHead(DNodeList node){// 删除节点removeNode(node);// 添加到头部addToHead(node);}// 删除节点void removeNode(DNodeList node){node.prev.next = node.next;node.next.prev = node.prev;cache.remove(node.key);}// 添加到头部void addToHead(DNodeList node){node.next = head.next;head.next.prev = node;head.next = node;node.prev = head;cache.put(node.key, node);}// 删除尾结点void removeTail(){removeNode(tail.prev);}}

相关文章:

  • 移动自动化测试-appium
  • jQuery — 动画和事件
  • kimi+deepseek制作PPT
  • 【java实现+4种变体完整例子】排序算法中【桶排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
  • spring-batch批处理框架(2)
  • 已注册商标如何防止被不使用撤销!
  • UDS中功能寻址可以请求多帧数据嘛?当ECU响应首帧后,诊断仪是通过物理寻址发送流控帧嘛?
  • 如何给云开发生成的智能体增加权限判断
  • 【排队论】Probabilistic Forecasts of Bike-Sharing Systems for Journey Planning
  • NestJS——使用TypeORM连接MySQL数据库(Docker拉取镜像、多环境适配)
  • 文献×材料 | 基于ANSYS的刹车片环保材料分析研究
  • CRC实战宝典:从原理到代码,全面攻克循环冗余校验
  • Transformer 进阶:拥抱预训练模型,迈向实际应用
  • DDPM(diffusion)原理
  • opencv练习
  • 16、堆基础知识点和priority_queue的模拟实现
  • opencv(双线性插值原理)
  • 解决 Vue3 项目中使用 pdfjs-dist 在旧版浏览器中的兼容性问题
  • 智能座舱架构与芯片 - 背景篇
  • QT网络拓扑图绘制实验
  • 重大虚开发票偷税骗补案被查处:价税2.26亿,涉700余名主播
  • 《蛮好的人生》上海特色鲜明,聚焦荧屏甚少出现的保险业
  • 观察|中日航线加速扩容,航空公司如何抓住机会?
  • 观察|智驾监管升级挤掉宣传水分,行业或加速驶入安全快车道
  • 河南社旗县委书记张荣印转任南阳市人大常委会农工委主任
  • 习近平主席东南亚三国行|元首外交硕果累累 • 一图读懂