📅  最后修改于: 2023-12-03 15:40:16.906000             🧑  作者: Mango
最近最少使用(LRU)页面替换算法是一种用于页面置换的算法。它的基本思想是,将最近最少使用的页面予以淘汰,以达到使缓存中的页面尽可能为当前工作集中的页面的目的。
LRU算法的核心是一个链表和一个哈希表。
链表用来记录所有缓存中存储的页面,每当一个页面被访问时,将其移到链表头部;
哈希表用于以O(1)的时间复杂度查找某个页面是否在缓存中。
当缓存已满,需要替换时,将链表尾部的页面淘汰即可。这是因为尾部的页面最少被访问,即最近最少使用。
以下是Python实现:
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.cache = {}
self.head = Node()
self.tail = Node()
self.head.next = self.tail
self.tail.prev = self.head
def get(self, key: int) -> int:
if key in self.cache:
node = self.cache[key]
self._remove(node)
self._add(node)
return node.value
else:
return -1
def put(self, key: int, value: int) -> None:
if key in self.cache:
node = self.cache[key]
self._remove(node)
node.value = value
self._add(node)
else:
if len(self.cache) == self.capacity:
node = self.tail.prev
self._remove(node)
del self.cache[node.key]
node = Node(key, value)
self.cache[key] = node
self._add(node)
def _add(self, node: Node) -> None:
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def _remove(self, node: Node) -> None:
node.prev.next = node.next
node.next.prev = node.prev
class Node:
def __init__(self, key=0, value=0):
self.key = key
self.value = value
self.prev = None
self.next = None
其中,LRUCache
类用于封装实现逻辑,Node
类用于实现链表节点。
实现LRU算法的时间复杂度为O(1)。
实现LRU算法的空间复杂度为O(n),其中n为缓存容量。