手撸高频面试算法LRU缓存,力扣热题

embedded/2024/12/22 14:48:37/

文章目录

  • 一、什么是LRU?
  • 二、Java的两种实现
    • 1.双向链表和哈希表结合实现
    • 2.LinkedHashMap快速实现LRU缓存


一、什么是LRU?

LRU是一种常用的缓存淘汰策略,全称为“Least Recently Used”,即最近最少使用的意思。这种算法主要用于内存管理、浏览器缓存、数据库系统以及其他需要缓存数据的场景中,用来决定当缓存空间不足时应该移除哪些数据项。

LRU的基本思想是:当缓存满时,优先删除最近最少访问的数据项。这里的“最近最少访问”是指在所有缓存中的数据项里,选择那个自上次被访问以来时间最长的数据项进行淘汰。

二、Java的两种实现

在实现上,LRU通常使用双向链表和哈希表结合的方式。每当有一个新的元素加入缓存时,就在链表尾部添加该元素;而当某个元素被访问时,就将这个元素移动到链表的头部。这样,链表的尾部始终是最久未被访问的元素,当需要腾出空间时,就可以直接移除尾部的元素。

1.双向链表和哈希表结合实现

代码如下:

java">class LRUCache {class Node{ // 定义内部链表节点类int key;int value;Node prev;  //前驱Node next;  //后继public Node(int key, int value) {this.key = key;this.value = value;}}// 定义缓存容量、大小private int capacity;private int size;// 定义头和尾节点,便于链表的操作private Node head;private Node tail;private Map<Integer, Node> cache = new HashMap<>(); // 定义map用于快速查找结果public LRUCache(int capacity) { // 初始化this.capacity = capacity;this.size = 0;this.head = new Node(0, 0);this.tail = new Node(0, 0);this.head.next = this.tail;this.tail.prev = this.head;}public int get(int key) {Node node = cache.get(key);if (node == null) {return -1;}// 移动到链表头部moveToHead(node);return node.value;}public void put(int key, int value) {Node node = cache.get(key);if (node == null) { // 新增node = new Node(key, value);cache.put(key, node);addNode(node);size++;if (size > capacity) { // 超出容量时移除尾节点Node tail = removeTail();cache.remove(tail.key);size--;}} else { // 更新并移动到头节点node.value = value;moveToHead(node);}}private void moveToHead(Node node) {removeNode(node);addNode(node);}// 移除节点private void removeNode(Node node) {node.prev.next = node.next;node.next.prev = node.prev;}// 头插private void addNode(Node node) {node.next = head.next;node.prev = head;head.next.prev = node;head.next = node;}// 移除尾节点private Node removeTail() {Node node = tail.prev;removeNode(node);return node;}

实现说明:

  • 用一个双向链表结构和一个hash表结构配合实现,双向链表用于保证数据顺序,hash表用于快速检索数据
  • 在查询时需要将数据移动到表头
  • 插入时进行链表头插,若数据size大于capacity,则需要移除尾节点
  • 更新数据时,将节点移动到头部

2.LinkedHashMap快速实现LRU缓存

代码如下:

java">class LRUCache extends LinkedHashMap<Integer, Integer>{private int capacity;public LRUCache(int capacity) {super(capacity, 0.75F, true); // true设置按照访问顺序排序this.capacity = capacity;}public int get(int key) {return super.getOrDefault(key, -1);}public void put(int key, int value) {super.put(key, value);}@Overrideprotected boolean removeEldestEntry(Map.Entry<Integer, Integer> eldest) {return size() > capacity;}
}

为什么这么写就能够实现LRU缓存?实际上看过LinkedHashMap源码的小伙伴可能会有所了解。
LinkedHashMap 实现 LRU 的关键在于它的构造函数参数:accessOrder 和 removeEldestEntry 方法。

  • accessOrder: 当设置为 true 时,LinkedHashMap 将按照访问顺序而不是插入顺序排序条目。这意味着每次访问一个条目后,它都会被移到链表的末尾,表示它是最新访问的。
  • removeEldestEntry: 这是一个可选的方法引用,当 LinkedHashMap 大小超过设定限制时调用此方法。如果返回 true,那么最老的条目(根据 accessOrder 决定的顺序)会被移除。

http://www.ppmy.cn/embedded/93270.html

相关文章

Stable Diffusion绘画 | 图生图-批量处理

批量处理中&#xff0c;对待处理图片的要求&#xff1a;宽高比一致 修改提示词后批量处理 调整参数&#xff1a; 确保宽高与原图一致增加一定的重绘幅度 调整提示词信息&#xff1a; 批量处理后&#xff0c;出图如下所示&#xff1a; 修改模型后批量处理 恢复提示词&#xf…

银行卡二三四要素验证-银行卡二三四要素验证接口-银行卡二三四要素

接口简介&#xff1a;全面覆盖&#xff0c;支持所有带银联标识的银行卡; 高准确性-验证结果实时返回&#xff0c;准确率达99%; 高稳定性-双通道自动切换&#xff0c;保证业务不间断; 专业服务-7*24小时服务&#xff0c;极速响应&#xff0c;为用户保驾护航; 接口地址&#xff1…

DjangoORM注入分享

DjangoORM注入 简介 ​ 这篇文章中&#xff0c;分享一些关于django orm相关的技术积累和如果orm注入相关的安全问题讨论。 ​ 攻击效果同数据库注入 从Django-Orm开始 开发角度 ​ Django ORM&#xff08;Object-Relational Mapping&#xff09;是Django框架中用于处理数…

工程师 - 版本管理工具TLIB

TLIB 是 Burton Systems Software 开发的版本控制工具&#xff0c;主要用于管理软件开发项目中的源代码和其他文件。十多年来&#xff0c;它一直是配置管理领域的著名工具&#xff0c;具有强大的性能和广泛的可配置性。 TLIB is a version control tool developed by Burton Sy…

小智常见报表-自由报表

概述 自由报表&#xff1a;具有自由设计、修改、完善的能力的报表。 应用场景 如下图所示&#xff0c;简单展示数据 示例说明 数据准备 在数据面板中添加数据集&#xff0c;可选择Json数据集和API服务数据集。Json数据集输入如下图所示&#xff1a; [{"姓名"…

如何用 CocosCreator 对接抖音小游戏的侧边栏复访

前言 最近小游戏的软著下来了&#xff0c;用 CocosCreator 做的游戏也完成了 1.0 版本。而当我打包成抖音小游戏进行提交时&#xff0c;还没到初审就给拒了&#xff0c;因为还有一个机审&#xff0c;机器检测到代码中没有接入 “侧边栏复访功能”。这个我还真不知道&#xff0…

magic-api相关应用与配置

目录 项目启动 工具&#xff1a;IDEA 运行项目 关于配置 项目启动 工具&#xff1a;IDEA 新建——》项目——》导入——》运行 运行项目 http://localhost:9999/magic/web/index.htmlhttp://localhost:9999/magic/web/index.html 关于配置 配置多数据源 在线配置多数据…

PyTorch安装与简介

安装PyTorch&#xff1a;使用PIP的方法比较简单 CPU版本安装&#xff1a;pip install torch1.3.0cpu torchvision0.4.1cpu -f https://download.pytorch.org/whl/torch_stable.html GPU版本安装&#xff1a;pip install torch1.3.0 torchvision0.4.1 -f https://download.pyt…