urlname
type
Post
password
SyncToConfluence
category
编程基础
date
Apr 14, 2024
slug
01HVGJ88AF33PNEZAVB0YPN0G9
icon
Button
catalog
summary
tags
Algorithm
Java
cover
Status
BusyTime
Status 1
status
Published
😀
LRU算法,即“最近最少使用”(Least Recently Used)算法,用来管理内存中的数据缓存。 其核心思想是:当内存不足时,优先淘汰那些最长时间未被访问的数据。

📝 简介

  • LRU Cache 指最近最少使用缓存,它是一种常见的缓存管理技术,用于加速数据访问。
  • LRU Cache 基于最近使用的记录在缓存中保留一个固定大小的记录集,并剔除最近最少使用的记录。
  • 当缓存中的记录数量达到上限时,最早之前被使用的记录会被替换掉。

实现思路

  • 维护一个哈希表以及一个双向链表。
  • 哈希表用于记录每个记录的位置和值,而双向链表用于记录记录的顺序。
  • 当一个新记录被访问时,在哈希表中查找该记录,如果记录存在则将其移动到链表的头部;
  • 如果记录不存在,就将其添加到哈希表和链表的头部。
  • 如果缓存已满,则将链表的末尾元素从哈希表和链表中移除。

代码实现

基于LinkedHashMap

  • LinkedHashMap提供了按访问顺序(access-order)排序的功能

基于HashMap

🤗 时间复杂度

以下分析的时间复杂度对上述两种实现都适用
  • 哈希表操作 (HashMap):
    • 查找(get, containsKey:平均时间复杂度为 O(1)。
    • 插入和删除(put, remove:平均时间复杂度 O(1)。
  • 双向链表操作:
    • 移动到头部(moveToHead)、添加到头部(addToHead:这些操作直接操作链表的头部,时间复杂度为 O(1)。
    • 删除节点(removeNode:时间复杂度也是 O(1) 的,因为每个节点都存储了指向前一个和后一个节点的直接引用。
  • 综上,LRU的各种操作,最优的时间复杂度都为 O(1)

📎 参考文章

 
DNS解析Leetcode LCR 016. 无重复字符的最长子串
Loading...