# 方法一 使用python有序字典OrderedDict
from collections import OrderedDict
class LRUCache1:
def __init__(self, capacity):
self.capacity = capacity
self.lrucache = OrderedDict()
def get(self, key):
if key not in self:
return -1
self.lrucache.move_to_end(key)
return self.lrucache.get(key, -1)
def put(self, key, value):
if key in self.lrucache:
del self.lrucache[key]
self.lrucache[key] = value
if len(self.lrucache) > self.capacity:
self.lrucache.popitem(last=False)
# 方法二 哈希 + 双向链表
class DLinkedNode():
def __init__(self, key, val):
self.key = key
self.val = val
self.prev = None
self.next = None
class LRUCache2:
def __init__(self, capacity):
self.cache = {}
self.capacity = capacity
self.head, self.tail = DLinkedNode(0, 0), DLinkedNode(0, 0)
self.head.next = self.tail
self.tail.prev = self.head
def get(self, key):
if key in self.cache:
node = self.cache[key]
self.remove(node)
self.add(node)
return node.val
else:
return -1
def put(self, key, value):
if key in self.cache:
self.remove(self.cache[key])
self.add(DLinkedNode(key, value))
def remove(self, node):
del self.cache[node.key]
node.prev.next = node.next
node.next.prev = node.prev
def add(self, node):
self.cache[node.key] = node
pre_tail = self.tail.prev
node.next = self.tail
self.tail.prev = node
pre_tail.next = node
node.prev = pre_tail
146_LRU缓存机制
最新推荐文章于 2020-07-29 16:40:47 发布