题解 | 设计LFU缓存结构
设计LFU缓存结构
https://www.nowcoder.com/practice/93aacb4a887b46d897b00823f30bfea1
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# lfu design
# @param operators int整型二维数组 ops
# @param k int整型 the k
# @return int整型一维数组
#
from typing import List
from collections import OrderedDict
class Solution:
def LFU(self, operators: List[List[int]], k: int) -> List[int]:
# 初始化缓存容量
self.capacity = k
# 存储键到 (值, 访问频率) 的映射
self.key_dict = {}
# 存储访问频率到对应的键的映射
self.freq_dict = {}
# 记录当前最小的访问频率
self.min_freq = 0
result = []
for op in operators:
if op[0] == 1:
# 插入或更新键值对
self.set(op[1], op[2])
elif op[0] == 2:
# 获取键对应的值
result.append(self.get(op[1]))
return result
def get(self, key):
if key not in self.key_dict:
return -1
# 获取键对应的值和频率
value, freq = self.key_dict[key]
# 从当前频率对应的有序字典中移除该键
self.freq_dict[freq].pop(key)
if not self.freq_dict[freq]:
# 如果当前频率对应的有序字典为空,删除该频率的记录
del self.freq_dict[freq]
if self.min_freq == freq:
# 如果当前最小频率的记录为空,更新最小频率
self.min_freq = min(self.freq_dict.keys()) if self.freq_dict else 0
# 访问频率加 1
freq += 1
if freq not in self.freq_dict:
# 如果新的频率不存在,创建一个新的有序字典
self.freq_dict[freq] = OrderedDict()
# 将键添加到新的频率对应的有序字典中
self.freq_dict[freq][key] = 1
# 更新键对应的频率
self.key_dict[key] = (value, freq)
return value
def set(self, key, value):
if self.capacity <= 0:
return
if key in self.key_dict:
# 如果键已经存在,更新值并增加访问频率
self.key_dict[key] = (value, self.key_dict[key][1])
self.get(key)
return
if len(self.key_dict) >= self.capacity:
# 如果缓存已满,淘汰访问频率最低且最久未使用的元素
min_freq_keys = self.freq_dict[self.min_freq]
evict_key = next(iter(min_freq_keys))
del self.key_dict[evict_key]
del self.freq_dict[self.min_freq][evict_key]
if not self.freq_dict[self.min_freq]:
del self.freq_dict[self.min_freq]
# 插入新的键值对,初始访问频率为 1
self.min_freq = 1
if 1 not in self.freq_dict:
self.freq_dict[1] = OrderedDict()
self.freq_dict[1][key] = 1
self.key_dict[key] = (value, 1)
#Python3#