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

LRU 缓存结构

文章目录

  • LRU
  • 实现

LRU

  • 优先去除最久没有访问到的数据。

实现

  • 通过组合哈希表(Hash Table)和双向链表(Doubly Linked List)实现 LRU 缓存。并且以 O(1) 的时间复杂度执行 get 和 put 操作
  • 核心是对节点的新增、访问都会让节点移动到双向链表头部,当容量超过时,直接删除尾部节点即可
class LRUCache {constructor(capacity) {// 容量this.capacity = capacity;this.cache = new Map();// 用于记录访问顺序的双向链表,声明空的头节点和尾节点this.head = {};this.tail = {};// 头和尾相连this.head.next = this.tail;this.tail.prev = this.head;}get(key) {const map = this.cache;if (!map.has(key)) {return -1;}// 每次把使用的节点放到链表的头部const node = map.get(key);this._moveToHead(node);return node.value;}put(key, value) {const map = this.cache;// 如果 key 已存在,更新并移动到双向链表头部if (map.has(key)) {const node = map.get(key);node.value = value;this._moveToHead(node);} else {if (map.size >= this.capacity) {// 缓存容量已满,移除尾部节点const leastUsedKey = this.tail.prev.key;this._removeNode(this.tail.prev);map.delete(leastUsedKey);}// 创建新节点,和更新 HashMap,并移动到链表头部const newNode = this._addNode({ key, value });map.set(key, newNode);}}// 双向链表删除节点_removeNode(node) {node.prev.next = node.next;node.next.prev = node.prev;}// 删除双向链表旧节点位置,然后移动到头部_moveToHead(node) {this._removeNode(node);this._addNode(node);}// 添加节点并移动到头部_addNode(node) {node.prev = this.head;node.next = this.head.next;this.head.next.prev = node;this.head.next = node;return node;}
}// 使用示例
const cache = new LRUCache(2);
cache.put(1, 10);
console.log(cache.get(1)); // 10
cache.put(2, 20);
cache.put(3, 30);
console.log(cache.get(1)); // -1
http://www.lryc.cn/news/99375.html

相关文章:

  • DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]
  • 25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)
  • 2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) | EI Compendex, Scopus双检索
  • Python - 嵌入式数据库Sqlite3的基本使用
  • VB制作网页自动填表
  • Kotlin 和 Java对比,具体代码分析
  • 目标检测之3维合成
  • 【playbook】Ansible的脚本----playbook剧本
  • PySpark基本操作:如何查看源码
  • HCIP——OSPF的防环机制
  • 安全基础 --- 正则表达式
  • 【vue】vue面试高频问题之-$nextTick的作用和使用场景
  • MySQL学习笔记之SQL语句执行过程查看
  • 如何以毫秒精度,查看系统时间以及文件的创建时间
  • 基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树
  • jMeter使用随记
  • [语义分割] DeepLab v3(Cascaded model、ASPP model、两种ASPP对比、Multi-grid、训练细节)
  • css - Media Query
  • 9.python设计模式【外观模式】
  • Webpack5 CopyPlugin的作用
  • kafka服务端允许生产者发送最大消息体大小
  • 台阶型Nim游戏博弈论
  • NestJS 的 中间件 学习
  • 搭建自己第一个golang程序
  • Mysql加锁过程
  • 财经界杂志财经界杂志社财经界编辑部2023年第19期目录
  • Linux常用命令——dpkg-split命令
  • 常见的二十种软件测试方法详解
  • Python(一)
  • git pull无效,显示 * branch master -> FETCH_HEADAlready up to date. pull无效解决方法