返回
程序员必备神器:力扣题16.25 LRU缓存的奥秘
前端
2023-11-09 16:00:21
前言
在程序员的求职道路上,力扣刷题可谓是必经之路。而今天,我们就把目光聚焦在其中一道经典面试题上——面试题 16.25:LRU 缓存。
什么是 LRU 缓存?
LRU(Least Recently Used)缓存是一种特殊的哈希表,它根据最近使用的时间来存储键值对。当缓存已满时,它会删除最近最少使用的条目,为新条目腾出空间。
实现原理
LRU 缓存的实现通常采用链表或哈希表。我们这里以链表为例进行讲解:
- 哈希表: 用于快速查找键值对。
- 链表: 用于维护最近使用顺序。链表头表示最近使用的条目,而链表尾表示最少使用的条目。
当我们访问一个键值对时:
- 命中缓存: 如果键在哈希表中,我们将它移到链表头部,表示最近使用。
- 未命中缓存: 如果键不在哈希表中,我们将它添加到链表头部,并在链表尾部删除最少使用的条目。
代码实现
下面是 LRU 缓存的 Python 实现:
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.hashtable = {}
self.head = Node(None, None)
self.tail = Node(None, None)
self.head.next = self.tail
self.tail.prev = self.head
def get(self, key: int) -> int:
if key in self.hashtable:
node = self.hashtable[key]
self.remove_node(node)
self.add_to_head(node)
return node.value
return -1
def put(self, key: int, value: int) -> None:
if key in self.hashtable:
self.remove_node(self.hashtable[key])
node = Node(key, value)
self.add_to_head(node)
self.hashtable[key] = node
if len(self.hashtable) > self.capacity:
removed = self.remove_tail()
del self.hashtable[removed.key]
def remove_node(self, node):
node.prev.next = node.next
node.next.prev = node.prev
def add_to_head(self, node):
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
node.prev = self.head
def remove_tail(self):
node = self.tail.prev
self.remove_node(node)
return node
class Node:
def __init__(self, key, value):
self.key = key
self.value = value
self.prev = None
self.next = None
总结
LRU 缓存在许多场景中都有着广泛的应用,例如:
- 浏览器缓存:存储最近访问过的网页
- 数据库缓存:存储经常查询的数据
- 操作系统缓存:存储最近访问过的文件
掌握 LRU 缓存的实现原理,不仅能够提升你的代码能力,更能在面试中脱颖而出。因此,务必在刷题之余,深入理解底层实现,让技术加持你的职业道路。