返回

LRU 算法:内存管理中的高效利器

后端

LRU 算法的原理

LRU 算法的核心思想是将数据项按最近被访问的顺序排列,最近被访问的数据项放置在队头,最久未被访问的数据项放置在队尾。当内存空间不足时,LRU 算法会首先淘汰队尾的数据项,以此腾出空间容纳新的数据项。

LRU 算法的实现可以采用多种数据结构,最常见的是链表和哈希表。在基于链表的实现中,数据项按最近被访问的顺序连接成一个单链表,队头为最近被访问的数据项,队尾为最久未被访问的数据项。当需要淘汰数据项时,LRU 算法只需将队尾的数据项从链表中移除即可。

在基于哈希表的实现中,LRU 算法使用哈希表存储数据项的键值对,同时维护一个双向链表来记录数据项的访问顺序。当数据项被访问时,LRU 算法会将该数据项移动到链表的队头,并将该数据项的键值对更新到哈希表中。当需要淘汰数据项时,LRU 算法只需从链表的队尾移除数据项,并从哈希表中删除该数据项的键值对即可。

LRU 算法的应用

LRU 算法广泛应用于各种内存管理和缓存系统中,例如操作系统、数据库、Web 服务器等。在操作系统中,LRU 算法用于管理物理内存和虚拟内存,以确保系统具有足够的可用内存空间。在数据库中,LRU 算法用于管理缓存,以提高数据库的查询性能。在 Web 服务器中,LRU 算法用于管理文件缓存,以提高 Web 页面的加载速度。

LRU 算法的示例代码

以下是一个基于链表的 LRU 算法的示例代码:

class Node:
    def __init__(self, key, value):
        self.key = key
        self.value = value
        self.prev = None
        self.next = None

class LRUCache:
    def __init__(self, capacity):
        self.capacity = capacity
        self.head = Node(-1, -1)
        self.tail = Node(-1, -1)
        self.head.next = self.tail
        self.tail.prev = self.head
        self.cache = {}

    def get(self, key):
        if key in self.cache:
            node = self.cache[key]
            self.remove_node(node)
            self.add_node(node)
            return node.value
        else:
            return -1

    def put(self, key, value):
        if key in self.cache:
            self.remove_node(self.cache[key])
        node = Node(key, value)
        self.add_node(node)
        self.cache[key] = node

        if len(self.cache) > self.capacity:
            del self.cache[self.tail.prev.key]
            self.remove_node(self.tail.prev)

    def remove_node(self, node):
        node.prev.next = node.next
        node.next.prev = node.prev

    def add_node(self, node):
        node.next = self.head.next
        node.prev = self.head
        self.head.next = node
        node.next.prev = node

cache = LRUCache(2)
cache.put(1, 10)
cache.put(2, 20)
print(cache.get(1))
cache.put(3, 30)
print(cache.get(2))
cache.put(4, 40)
print(cache.get(1))
print(cache.get(3))
print(cache.get(4))

这个示例代码实现了一个简单的 LRU 缓存,它可以存储最多 2 个键值对。当缓存已满时,它会淘汰最近最少使用的键值对,以腾出空间容纳新的键值对。