用双向链表实现内存置换算法(三)
这一篇是用双向链表实现LRU算法:
算法思路:
假如我们的缓存可以缓存4个子块:
- 缓存中不存在要放入的字块时,把子块放在链表的头部
- 如果缓存中存在相同子块,则把这一字块移到链表的头部。
- 缓存满了,放入新的字块时,把尾部的字块移除。
下面附上代码:
class LRUCache:
def __init__(self, capacity):
self.capacity = capacity
self.map = {}
self.list = DoubleLinkedList(self.capacity)
def get(self, key):
if key in self.map:
node = self.map[key]
self.list.remove(node)
self.list.append_front(node)
return node.value
else:
return -1
def put(self, key, value):
if key in self.map:
node = self.map.get(key)
self.list.remove(node)
node.value = value
self.list.append_front(node)
else:
node = Node(key, value)
# 链表缓存已满
if self.list.size >= self.list.capacity:
old_node = self.list.remove()
self.map.pop(old_node.key)
self.list.append_front(node)
self.map[key] = node