算法思路
LRU(Least Recently Used)算法是一种常用的页面置换算法,它根据页面的最近使用情况来进行页面置换。具体实现如下:
-
创建一个哈希表和一个双向链表。哈希表用于存储键值对,其中键是页面的编号,值是指向该页面在双向链表中的节点的指针。双向链表用于存储页面的顺序,最近使用的页面位于链表的头部,最久未使用的页面位于链表的尾部。
-
当要访问一个页面时,首先在哈希表中查找该页面是否存在。如果存在,则将该页面从链表中移除,并将其插入链表的头部。如果不存在,则将该页面加入哈希表,并将其插入链表的头部。如果链表长度超过了缓存的大小,将链表尾部的页面移除,并从哈希表中删除。
-
当要访问一个页面时,有三种情况:
- 如果页面存在于哈希表中,则将该页面从链表中移除,并将其插入链表的头部。
- 如果页面不存在于哈希表中,且缓存未满,则将该页面加入哈希表,并将其插入链表的头部。
- 如果页面不存在于哈希表中,且缓存已满,则将链表尾部的页面移除,并从哈希表中删除,然后将新页面加入哈希表,并插入链表的头部。
下面是一个简单的实现示例(使用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