面试题答案
一键面试实现方式
以Python为例,使用OrderedDict
实现LRU缓存:
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.cache = OrderedDict()
def get(self, key: int) -> int:
if key not in self.cache:
return -1
self.cache.move_to_end(key)
return self.cache[key]
def put(self, key: int, value: int) -> None:
if key in self.cache:
self.cache.move_to_end(key)
else:
if len(self.cache) == self.capacity:
self.cache.popitem(last=False)
self.cache[key] = value
优势
- 有效利用缓存空间:LRU算法优先淘汰长时间未使用的数据,确保缓存中保留的是最近频繁使用的数据,能有效利用有限的缓存空间,提高缓存命中率。
- 简单直观:LRU算法概念简单,实现相对容易理解,不需要复杂的数学运算或模型。
可能存在的问题
- 无法适应访问模式变化:如果数据的访问模式突然改变,之前长时间未使用的数据可能突然变得频繁使用,但LRU算法会继续淘汰这些数据,导致缓存命中率下降。
- 实现成本:在一些情况下,LRU算法的实现需要额外的数据结构和维护操作,可能会增加系统的时间和空间开销。例如在大规模缓存中维护LRU链表可能会消耗较多资源。
- 缓存污染:某些低频访问的数据可能因为偶尔的一次访问而一直驻留在缓存中,占据空间,影响其他高频数据的缓存,这种现象称为缓存污染。