LeetCode的LRU缓存实现

LRU是什么意思

LRU是操作系统底层的一个页面置换算法,当空间不够需要换出最长时间没有使用的页面,在本题中的意思就是当到达容量上限的时候要换出最长时间没有被访问过的节点。

如何实现

LRU的实现可以使用链表的方式,参照MySQL的实现,将热数据每次都放到链表头,删除链表尾的冷数据。

题目需要get()和put()方法都是O(1)的事件复杂度,但是链表遍历需要O(n)的时间复杂度,无法满足题目要求,可以想到数组下标索引或者HashMap辅助我们访问,本题如果用数组还需要多写一步hash()来确认key存放的位置,所以我们使用HashMap。

通过HashMap我们可以快速找到节点,也就满足了get()的O(1),但是对于put()的O(1),考虑到我们需要删除节点,单链表显然无法满足,因为单链表需要O(n)找到前驱节点,所以我们修改为双链表。

最终的结构就是HashMap + 双链表。

相关推荐
佳児素花痴╮18 分钟前
树的基础知识与查找排序算法
数据结构·算法
lueluelue477 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水16810 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子10 小时前
Adaboost算法原理与计算实例
算法
别怪我很水10 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
ai_coder_ai12 小时前
分布式缓存架构设计与实践
分布式·缓存
Re.不晚13 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机14 小时前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*14 小时前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论