460. LFU Cache 最近最少使用演算法
{
# 頻率
1: {
# 這裡面是有序的排列
# 鍵值:數值
3: 4
2: 1
}
}Last updated
{
# 頻率
1: {
# 這裡面是有序的排列
# 鍵值:數值
3: 4
2: 1
}
}Last updated
class LFUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.key_to_freq = collections.defaultdict()
self.freq_to_keys = collections.defaultdict(collections.OrderedDict)
self.minfreq = 0class LFUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.keyToFreq = {}
self.freqAndKeyToVal = defaultdict(OrderedDict)
self.minFreq = 0
def get(self, key: int) -> int:
if key not in self.keyToFreq:
return -1
else:
freq = self.keyToFreq[key]
val = self.freqAndKeyToVal[freq][key]
del self.freqAndKeyToVal[freq][key]
if not self.freqAndKeyToVal[freq]:
del self.freqAndKeyToVal[freq]
if freq == self.minFreq:
self.minFreq += 1
self.keyToFreq[key] = freq + 1
self.freqAndKeyToVal[freq + 1][key] = val
return val
def put(self, key: int, value: int) -> None:
if self.capacity <= 0: return None
if key in self.keyToFreq:
freq = self.keyToFreq[key]
self.freqAndKeyToVal[freq][key] = value
self.get(key)
else:
if len(self.keyToFreq) == self.capacity:
delKey, delVal = self.freqAndKeyToVal[self.minFreq].popitem(last=False)
del self.keyToFreq[delKey]
self.minFreq = 1
self.keyToFreq[key] = self.minFreq
self.freqAndKeyToVal[self.minFreq][key] = value