LRU 算法实践(上)

简介: LRU 算法实践

redis 的 LRU 算法简介


题目:1、redis 的 lru 了解过吗?是否可以手写一个 lru 算法?


什么是 LRU?


LRU 是 Least Recently Used 的缩写,即最近最少使用,是一种常用的页面置换算法。

选择最近最久未使用的数据予以淘汰。


算法设计来源


力扣(146 题目 LRU 算法简介):


leetcode-cn.com/problems/lr…


如图:


image.png


设计思想


1、所谓缓存,必须要有读 + 写两个操作,按照命中率的思路考虑,写操作 + 读操作时间复杂度都需要为 O(1)。


2、 特征要求


2.1 必须要有顺序之分,一区分最近使用的和很久没有使用的数据排序。


2.2 写和读操作一次执行。


2.3 如果容量(坑位)满了要删除最不长用的谁,每次新访问还要把新的数据出入到队头(按照业务你自己设定左右那一边是队头)。


查找快、插入快、删除快、且还要先后排序 -----> 什么样的数据结构可以满足这个问题?


你是否可以在 O(1) 的时间复杂度内完成这两种操作?


如果一次就可以找到,你觉得什么数据结构最合适???


LRU 的算法核心是哈希链表


本质就是 HashMap + DoubleLinkedList


时间复杂是O(1) ,哈希+双向链表的结合体。


LRU 算法动画

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fb6141874f37416eb530678bbe2f6d79~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?


LRU 手动编码实现



实现案例一


参考: LinkedHashMap


依赖 jdk


public class Q149<K, V> extends LinkedHashMap<K, V> {
    private int capacity; // 缓存坑位
    public Q149(int capacity) {
        // true 是访问顺序
        // false 是插入顺序
        super(capacity, 0.75F, true);
        this.capacity = capacity;
    }
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return super.size() > capacity;
    }
    public static void main(String[] args) {
        Q149 q149 = new Q149(3);
        q149.put(1, "a");
        q149.put(2, "b");
        q149.put(3, "c");
        System.out.println(q149.keySet());
        q149.put(4, "d");
        q149.put(5, "e");
        System.out.println(q149.keySet());
    }
  }


相关文章
|
2月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
91 4
|
19天前
|
机器学习/深度学习 人工智能 算法
深入解析图神经网络:Graph Transformer的算法基础与工程实践
Graph Transformer是一种结合了Transformer自注意力机制与图神经网络(GNNs)特点的神经网络模型,专为处理图结构数据而设计。它通过改进的数据表示方法、自注意力机制、拉普拉斯位置编码、消息传递与聚合机制等核心技术,实现了对图中节点间关系信息的高效处理及长程依赖关系的捕捉,显著提升了图相关任务的性能。本文详细解析了Graph Transformer的技术原理、实现细节及应用场景,并通过图书推荐系统的实例,展示了其在实际问题解决中的强大能力。
114 30
|
23天前
|
存储 算法
深入解析PID控制算法:从理论到实践的完整指南
前言 大家好,今天我们介绍一下经典控制理论中的PID控制算法,并着重讲解该算法的编码实现,为实现后续的倒立摆样例内容做准备。 众所周知,掌握了 PID ,就相当于进入了控制工程的大门,也能为更高阶的控制理论学习打下基础。 在很多的自动化控制领域。都会遇到PID控制算法,这种算法具有很好的控制模式,可以让系统具有很好的鲁棒性。 基本介绍 PID 深入理解 (1)闭环控制系统:讲解 PID 之前,我们先解释什么是闭环控制系统。简单说就是一个有输入有输出的系统,输入能影响输出。一般情况下,人们也称输出为反馈,因此也叫闭环反馈控制系统。比如恒温水池,输入就是加热功率,输出就是水温度;比如冷库,
172 15
|
2月前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
2月前
|
机器学习/深度学习 人工智能 Rust
MindSpore QuickStart——LSTM算法实践学习
MindSpore QuickStart——LSTM算法实践学习
53 2
|
2月前
|
机器学习/深度学习 算法 数据建模
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
计算机前沿技术-人工智能算法-生成对抗网络-算法原理及应用实践
40 0
|
3月前
|
数据采集 算法 物联网
【算法精讲系列】阿里云百炼SFT微调实践分享
本内容为您提供了百炼平台SFT微调的实践案例,帮助您方便并快速借助模型微调定制化您自己的专属模型。
|
4月前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
224 1
|
4月前
|
DataWorks 算法 调度
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
51 1