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

LRU缓存(手写双向链表和哈希表)

就是采用淘汰策略,对于不咋进行调用得cache放到最后面

🌟 LRU 缓存实现详解(Java版)—— 哈希表 + 双向链表

LRU(Least Recently Used,最近最少使用)是一种经典的缓存淘汰策略。当缓存容量达到上限时,优先淘汰最久未被访问的数据。

本实现采用哈希表(HashMap) + 双向循环链表的方式,确保getput操作的时间复杂度均为O(1)


✅ 核心设计思路

  1. 哈希表(HashMap):用于快速查找键值对,时间复杂度 O(1)。
  2. 双向循环链表:维护数据的访问顺序,最近使用的数据放在链表头部,最久未使用的在尾部。
  3. 虚拟头节点(dumNode):简化链表操作,避免空指针判断。
  4. 访问即更新:每次getput已存在的键时,都将对应节点移到链表头部。
  5. 容量控制:当缓存超出容量时,删除链表尾部节点(最久未使用)。

class LRUCache { private static class Node{ int key,value; Node pre,next; Node(int k,int v){ this.key=k; this.value=v; } } private final HashMap<Integer,Node>hm=new HashMap<>(); private final int capacity; private final Node dumNode=new Node(0,0); public LRUCache(int capacity) { this.capacity=capacity; dumNode.pre=dumNode; dumNode.next=dumNode; } public int get(int key) { Node node=getNode(key); return node!=null?node.value:-1; } public void put(int key, int value) { Node node=getNode(key); if(node!=null){ node.value=value; return ; } node=new Node(key,value); hm.put(key,node); pushFront(node); if(hm.size()>capacity){ Node backNode=dumNode.pre; hm.remove(backNode.key); remove(backNode); } } private Node getNode(int key){ if(!hm.containsKey(key)){ return null; } Node node =hm.get(key); remove(node); pushFront(node); return node; } private void remove(Node node){ node.pre.next=node.next; node.next.pre=node.pre; } private void pushFront(Node node){ node.pre=dumNode; node.next=dumNode.next; dumNode.next=node; node.next.pre=node; } } /** * Your LRUCache object will be instantiated and called as such: * LRUCache obj = new LRUCache(capacity); * int param_1 = obj.get(key); * obj.put(key,value); */
http://www.jsqmd.com/news/700893/

相关文章:

  • Spring Boot项目大变身:为何要拆成这六大模块?
  • PyCaret自动化机器学习:从入门到实战
  • 2025届学术党必备的五大降重复率平台横评
  • 数组练习题
  • 中国半导体展哪家好?深度解析国内展会优势,助力企业挑选合适平台 - 品牌2026
  • 协作与版本控制:MLflow、DVC与Git LFS管理模型与数据
  • Claude-Mem:为AI编程助手构建持久化记忆系统的架构与实践
  • Amazon ECS Agent 深度解析:架构、部署与生产环境实战指南
  • 【AI Agent实战】公众号排版丑?AI帮你一键改造成「课堂型」高级感
  • 线性回归与XGBoost实战对比:原理与性能解析
  • ARM RealView Debugger硬件断点技术深度解析
  • 环境与依赖管理:Conda、Docker与Poetry构建可复现开发环境
  • Python实现带动量的梯度下降算法与优化技巧
  • Claude Scientific Skills:134个技能打造桌面AI科学家,加速科研工作流
  • Keras文本预处理核心技术解析与实践指南
  • 贝叶斯定理:从直觉理解到实战应用
  • 深度学习噪声训练:原理、实现与调优指南
  • 如何打造出色的产品设计作品集?5 大核心要素与面试加分指南
  • LangAgent框架:从API调用到目标驱动的AI智能体开发实战
  • Cursor + Claude Code 接入 API 实战:国内稳定使用 Claude 4.7 配置全攻略
  • 3个关键步骤解锁手绘白板Excalidraw:从零到高效协作的完整指南
  • Kurtosis一键部署Auto-GPT:告别环境配置,专注AI智能体开发
  • 谷歌最新算法有哪些更改?首屏加载超过2秒将直接失去排名
  • MIUI自动化任务脚本:3个核心技巧解决小米社区重复性工作
  • C语言刷题日记 #6
  • CentOS 7 安装与使用教程(手把手图文详解版)
  • 投稿踩坑3个月,被拒两次才发现:一开始的选刊方向就错了
  • 阿里云AgentBay SDK:云端沙盒环境为AI智能体提供安全执行能力
  • 如何用PyMICAPS快速制作专业气象图表:从数据到可视化的一站式解决方案
  • 基于大语言模型的代码仓库智能文档生成:RepoAgent实战指南