实现lru算法
时间: 2023-06-22 13:30:42 浏览: 126
LRU算法的自编c++实现及源码。 .rar_LRU_lru算法
LRU(Least Recently Used)算法是一种常用的缓存淘汰算法,它会优先淘汰最近最少使用的数据,以保证缓存中的数据是最有用的。下面是一份基于双向链表和哈希表的LRU算法实现代码:
```python
class Node:
def __init__(self, key=None, value=None):
self.key = key
self.value = value
self.prev = None
self.next = None
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._move_to_head(node)
return node.value
else:
return -1
def put(self, key: int, value: int) -> None:
if key in self.cache:
node = self.cache[key]
node.value = value
self._move_to_head(node)
else:
if len(self.cache) == self.capacity:
tail = self._pop_tail()
del self.cache[tail.key]
node = Node(key, value)
self.cache[key] = node
self._add_to_head(node)
def _move_to_head(self, node: Node) -> None:
self._remove_node(node)
self._add_to_head(node)
def _remove_node(self, node: Node) -> None:
node.prev.next = node.next
node.next.prev = node.prev
def _add_to_head(self, node: Node) -> None:
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def _pop_tail(self) -> Node:
node = self.tail.prev
self._remove_node(node)
return node
```
LRUCache类中的cache属性是一个哈希表,用于快速查询某个key是否在缓存中。head和tail分别是双向链表的头尾节点,它们的next和prev属性分别指向下一个和上一个节点。_move_to_head、_remove_node和_add_to_head方法分别用于移动节点、删除节点和添加节点,它们都是对双向链表进行操作的方法。_pop_tail方法用于删除尾节点。
在get方法中,如果key存在于哈希表中,就将对应的节点移动到链表头部,并返回节点的value。如果key不存在于哈希表中,就返回-1。
在put方法中,如果key存在于哈希表中,就更新对应节点的value,并将其移动到链表头部。如果key不存在于哈希表中,就需要先判断缓存是否已满,如果已满,则需要先删除最近最少使用的节点(即尾节点),然后再添加新节点到链表头部。如果缓存未满,则直接将新节点添加到链表头部。
阅读全文