LRU Cache :
設計一個遵循最近最少使用 (LRU) 緩存約束的數據結構。
實現 LRUCache 類:
LRUCache(int capacity) 用正容量初始化 LRU 緩存。
int get(int key) 如果key存在則返回key的值,否則返回-1。
void put(int key, int value) 如果鍵存在,則更新鍵的值。 否則,將鍵值對添加到緩存中。 如果鍵的數量超過此操作的容量,則驅逐最近最少使用的鍵。
函數 get 和 put 必須各自以 O(1) 平均時間複雜度運行。
Python
class ListNode:
def __init__(self, key, value):
self.key = key
self.value = value
self.prev = self
self.next = self
class LRUCache:
def __init__(self, capacity: int):
self.dic = dict()
self.capacity = capacity
self.size = 0
self.root = ListNode(0, 0)
def get(self, key: int) -> int:
if key in self.dic:
node = self.dic[key]
self.removeFromList(node)
self.insertIntoHead(node)
return node.value
else:
return -1
def put(self, key: int, value: int) -> None:
if key in self.dic:
node = self.dic[key]
self.removeFromList(node)
self.insertIntoHead(node)
node.value = value
else:
if self.size >= self.capacity:
self.removeFromTail()
self.size -= 1
node = ListNode(key, value)
self.insertIntoHead(node)
self.dic[key] = node
self.size += 1
def removeFromList(self, node):
if node == self.root: return
prev_node = node.prev
next_node = node.next
prev_node.next = next_node
next_node.prev = prev_node
node.prev = node.next = None
def insertIntoHead(self, node):
head_node = self.root.next
head_node.prev = node
node.prev = self.root
self.root.next = node
node.next = head_node
def removeFromTail(self):
if self.size == 0: return
tail_node = self.root.prev
del self.dic[tail_node.key]
self.removeFromList(tail_node)
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.dict = collections.OrderedDict()
self.size = 0
def get(self, key: int) -> int:
if key in self.dict:
self.dict.move_to_end(key)
return self.dict[key]
else:
return -1
def put(self, key: int, value: int) -> None:
if key in self.dict:
self.dict[key] = value
self.dict.move_to_end(key)
else:
if self.size < self.capacity:
self.dict[key] = value
self.size += 1
else:
self.dict.popitem(False)
self.dict[key] = value