Spaces:
Runtime error
Runtime error
| from collections import defaultdict, OrderedDict | |
| class LFUCache: | |
| def __init__(self, capacity: int): | |
| self.capacity = capacity | |
| self.data = {} # session_id -> (value, freq) | |
| self.freq_map = defaultdict(OrderedDict) # freq -> {session_id: None} | |
| self.min_freq = 0 | |
| def _update_freq(self, session_id): | |
| value, freq = self.data[session_id] | |
| del self.freq_map[freq][session_id] | |
| if not self.freq_map[freq]: | |
| del self.freq_map[freq] | |
| if self.min_freq == freq: | |
| self.min_freq += 1 | |
| new_freq = freq + 1 | |
| self.data[session_id] = (value, new_freq) | |
| self.freq_map[new_freq][session_id] = None | |
| def get(self, session_id): | |
| if session_id not in self.data: | |
| return None | |
| self._update_freq(session_id) | |
| return self.data[session_id][0] | |
| def put(self, session_id, value): | |
| if self.capacity == 0: | |
| return | |
| if session_id in self.data: | |
| self.data[session_id] = (value, self.data[session_id][1]) | |
| self._update_freq(session_id) | |
| else: | |
| if len(self.data) >= self.capacity: | |
| # Evict the least frequently used item | |
| lfu_session_id, _ = self.freq_map[self.min_freq].popitem(last=False) | |
| del self.data[lfu_session_id] | |
| self.data[session_id] = (value, 1) | |
| self.freq_map[1][session_id] = None | |
| self.min_freq = 1 | |
| def delete(self, session_id): | |
| if session_id in self.data: | |
| _, freq = self.data[session_id] | |
| del self.data[session_id] | |
| del self.freq_map[freq][session_id] | |
| if not self.freq_map[freq]: | |
| del self.freq_map[freq] |