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 + 双链表。

相关推荐
怕浪猫10 小时前
多 Agent 系统面试怎么答?我总结了 4 种经典架构
人工智能·算法·面试
程序员清风10 小时前
排序算法:从冒泡排序到归并排序
数据结构·算法·排序算法
万年咸鱼10 小时前
C语言内功心法篇——变量与数据类型
c语言·jvm·算法
@#¥&~是乱码鱼啦10 小时前
ArkWeb开发手记02|权限、网络白名单与页面缓存控制
网络·缓存
Omics Pro10 小时前
反式感知虚拟细胞!超越线性序列
数据库·人工智能·算法·机器学习·自然语言处理
-dzk-10 小时前
【动态规划】LC 152.乘积最大子数组
算法·动态规划
积流成海10 小时前
一致性哈希原理与实现:分布式系统负载均衡
算法·负载均衡·哈希算法·哈希函数·盘子工具站
Nil20821 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
wanderist.1 天前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.1 天前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode