当缓存数据达到预设的上限后,就会优先淘汰近期最少使用的缓存对象,原理是使用双端队列存放元素,哈希表判断数据是否存在
思路
- 维护一个双端队列用于存放元素,哈希表判断元素是否存在,越接近队列表尾部的元素表示越少被使用到
- 插入一个元素时,如果元素已存在则将其移动到队列头部,并更新哈希表Key所对应的Value值,如果不存在,则:
- 如果缓存容量已达到最大值,则将队列尾部节点删除掉,将新的数据放入队列头部
- 如果缓存容量未达到最大值,则直接将新的数据放入队列头部
查询一个数据时,我们可以使用哈希表来记录每个Key所对应的位置,时间复杂度为O(1)。
# 自建双端列表、哈希表class LRUCache:def __init__(self, capacity):self.dicts = {}self.queue = []# capacity是总大容量self.capacity = capacitydef get(self, key):if key in self.dicts:# 将其移动到双向队列的头部,最后返回该节点的值self.queue.remove(key)self.queue.append(key)return self.dicts[key]else:return -1def put(self, key, value):# 判断再次插入缓存会不会满if len(self.dicts) < self.capacity:if key in self.dicts:# 将其移动到双向队列的头部self.dicts[key] = valueself.queue.remove(key)self.queue.append(key)else:# 直接放到头部self.dicts[key] = valueself.queue.append(key)# 如果满了就可能就需要干掉尾部的一些元素else:if key in self.dicts:# 将其移动到双向队列的头部self.dicts[key] = valueself.queue.remove(key)self.queue.append(key)else:# 缓存满了就干掉尾部的一些元素,再放到头部self.dicts.pop(self.queue[0])self.queue.remove(self.queue[0])self.dicts[key] = valueself.queue.append(key)
