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天前
|
存储 缓存 算法
LRU(Least Recently Used)算法原理
LRU(Least Recently Used)算法原理
3 0
|
2天前
|
机器学习/深度学习 搜索推荐 算法
推荐系统的算法与实现:深入解析与实践
【6月更文挑战第14天】本文深入探讨了推荐系统的原理与实现,包括用户和项目建模、协同过滤、内容过滤及混合推荐算法。通过收集用户行为数据,系统预测用户兴趣,提供个性化推荐。实践中,涉及数据处理、建模、算法选择及结果优化。随着技术发展,推荐系统将持续改进,提升性能和用户体验。
|
6天前
|
算法 数据挖掘 定位技术
算法必备数学基础:图论方法由浅入深实践与应用
算法必备数学基础:图论方法由浅入深实践与应用
|
6天前
|
存储 算法 数据挖掘
螺旋矩阵 II:从理论到实践的五种算法解析
螺旋矩阵 II:从理论到实践的五种算法解析
|
30天前
|
缓存 算法 Java
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
数据结构~缓存淘汰算法--LRU算法(Java的俩种实现方式,万字解析
|
30天前
|
缓存 算法 前端开发
前端开发者必知的缓存淘汰策略:LRU算法解析与实践
前端开发者必知的缓存淘汰策略:LRU算法解析与实践
|
1月前
|
缓存 监控 算法
如何调整InnoDB的LRU算法以提高效率?
【5月更文挑战第14天】如何调整InnoDB的LRU算法以提高效率?
16 2
|
1月前
|
缓存 算法
LRU(Least Recently Used)算法是一种常用的计算机缓存替换算法
【5月更文挑战第4天】LRU算法是基于页面使用频率的缓存策略,优先淘汰最近最久未使用的页面。实现可采用双向链表或数组,前者灵活,后者时间复杂度低。优点是利用时间局部性提高命中率,简单易实现;缺点是占用空间,对循环访问和随机访问场景适应性不佳。
43 0
|
1月前
|
机器学习/深度学习 运维 算法
【Python机器学习专栏】异常检测算法在Python中的实践
【4月更文挑战第30天】本文介绍了异常检测的重要性和在不同领域的应用,如欺诈检测和网络安全。文章概述了四种常见异常检测算法:基于统计、距离、密度和模型的方法。在Python实践中,使用scikit-learn库展示了如何实现这些算法,包括正态分布拟合、K-means聚类、局部异常因子(LOF)和孤立森林(Isolation Forest)。通过计算概率密度、距离、LOF值和数据点的平均路径长度来识别异常值。
|
1月前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。