📜  最近最少使用(LRU)页面替换算法的程序(1)

📅  最后修改于: 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为缓存容量。

参考资料
  1. LRU Cache,https://leetcode.com/problems/lru-cache/description/