编写程序实现LRU算法
时间: 2023-06-07 22:12:02 浏览: 152
LRU算法,即最近最少使用算法,是一种缓存淘汰策略。它的基本思路是:当缓存已满时,把最近最少使用的数据淘汰掉,然后把新的数据存入缓存中。
实现LRU算法可以用双向链表和哈希表结合的方法。具体实现步骤如下:
1. 创建一个双向链表,用于存储缓存中的数据。
2. 创建一个哈希表,用于将数据的键值映射到链表中的节点。
3. 当需要访问某个数据时,先在哈希表中查找是否存在该节点。
4. 如果存在,则将其从链表中移动到链表头部,表示该数据被最近访问过。
5. 如果不存在,则将数据插入到链表头部,同时在哈希表中创建一个新的映射。
6. 如果插入后链表长度超过了缓存容量,则将链表尾部的节点删除,并在哈希表中删除对应的映射。
下面是一个示例代码实现:
```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.val
else:
return -1
def put(self, key: int, value: int) -> None:
if key in self.cache:
node = self.cache[key]
node.val = value
self._remove(node)
self._add(node)
else:
if len(self.cache) == self.capacity:
del self.cache[self.tail.prev.key]
self._remove(self.tail.prev)
node = Node(key, value)
self.cache[key] = node
self._add(node)
def _add(self, node: 'Node') -> None:
p = self.head.next
self.head.next = node
node.prev = self.head
node.next = p
p.prev = node
def _remove(self, node: 'Node') -> None:
p = node.prev
q = node.next
p.next = q
q.prev = p
class Node:
def __init__(self, key=None, val=None):
self.key = key
self.val = val
self.prev = None
self.next = None
```
上述代码中,Node类表示双向链表中的节点。LRUCache类实现了缓存的基本操作,包括get和put方法。其中,put方法中先判断数据是否在缓存中,如果在,则将其移动到链表头部,如果不在,则插入到链表头部。如果缓存已满,则删除链表尾部的节点。get方法中同样将访问的节点移动到链表头部。缓存的数据通过哈希表来快速查找。
阅读全文