LRU算法思路以及实现

201 阅读2分钟

算法思路

LRU(Least Recently Used)算法是一种常用的页面置换算法,它根据页面的最近使用情况来进行页面置换。具体实现如下:

  1. 创建一个哈希表和一个双向链表。哈希表用于存储键值对,其中键是页面的编号,值是指向该页面在双向链表中的节点的指针。双向链表用于存储页面的顺序,最近使用的页面位于链表的头部,最久未使用的页面位于链表的尾部。

  2. 当要访问一个页面时,首先在哈希表中查找该页面是否存在。如果存在,则将该页面从链表中移除,并将其插入链表的头部。如果不存在,则将该页面加入哈希表,并将其插入链表的头部。如果链表长度超过了缓存的大小,将链表尾部的页面移除,并从哈希表中删除。

  3. 当要访问一个页面时,有三种情况:

    • 如果页面存在于哈希表中,则将该页面从链表中移除,并将其插入链表的头部。
    • 如果页面不存在于哈希表中,且缓存未满,则将该页面加入哈希表,并将其插入链表的头部。
    • 如果页面不存在于哈希表中,且缓存已满,则将链表尾部的页面移除,并从哈希表中删除,然后将新页面加入哈希表,并插入链表的头部。

下面是一个简单的实现示例(使用Python语言):

代码实现

class LRUCache:
    def __init__(self, capacity: int):
        self.capacity = capacity
        self.cache = {}
        self.head = ListNode(0)
        self.tail = ListNode(0)
        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.val
        else:
            return -1

    def put(self, key: int, value: int) -> None:
        if key in self.cache:
            self._remove(self.cache[key])
        node = ListNode(value)
        self.cache[key] = node
        self._add(node)
        if len(self.cache) > self.capacity:
            node = self.tail.prev
            self._remove(node)
            del self.cache[node.key]

    def _add(self, node: ListNode) -> None:
        next_node = self.head.next
        self.head.next = node
        node.prev = self.head
        node.next = next_node
        next_node.prev = node

    def _remove(self, node: ListNode) -> None:
        prev_node = node.prev
        next_node = node.next
        prev_node.next = next_node
        next_node.prev = prev_node


class ListNode:
    def __init__(self, val=0):
        self.val = val
        self.prev = None
        self.next = None