Guest User

Untitled

a guest
Aug 27th, 2020
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.74 KB | None | 0 0
  1. from collections import defaultdict, OrderedDict
  2.  
  3.  
  4.  
  5. class LFUCache:
  6.     def __init__(self, capacity: int):
  7.         self.capacity = capacity
  8.         self.keyToVal = {}
  9.         self.keyToFreq = {}
  10.         # freq to ordering of keys (implemented as an OrderedDict of key to True which has fast remove and reinsert to back)
  11.         self.freqToLRU = defaultdict(OrderedDict)
  12.         # minFreq tracks smallest freq with non-empty list in freqToLRU
  13.         self.minFreq = 0
  14.  
  15.     def _use(self, key: int) -> int:
  16.         freq = self.keyToFreq[key]
  17.         del self.freqToLRU[freq][key]  # Remove from `freq` list
  18.         self.freqToLRU[freq + 1][key] = True  # Add to back of `freq + 1` list
  19.         self.keyToFreq[key] = freq + 1
  20.         if freq == self.minFreq and not self.freqToLRU[freq]:
  21.             self.minFreq += 1
  22.  
  23.     def get(self, key: int) -> int:
  24.         if key in self.keyToVal:
  25.             self._use(key)
  26.             return self.keyToVal[key]
  27.         return -1
  28.  
  29.     def put(self, key: int, value: int) -> None:
  30.         if self.capacity == 0:
  31.             return
  32.         if key in self.keyToVal:
  33.             self._use(key)
  34.             self.keyToVal[key] = value
  35.         else:
  36.             if len(self.keyToVal) == self.capacity:
  37.                 # Pop from front of `minFreq` list
  38.                 # Note: The list might become empty but we will be inserting a new key with freq 0 anyway
  39.                 evictKey, _ = self.freqToLRU[self.minFreq].popitem(last=False)
  40.                 del self.keyToFreq[evictKey]
  41.                 del self.keyToVal[evictKey]
  42.             freq = 0
  43.             self.keyToVal[key] = value
  44.             self.keyToFreq[key] = freq
  45.             self.freqToLRU[freq][key] = True
  46.             self.minFreq = freq
Advertisement
Add Comment
Please, Sign In to add comment