编写代码实现LRU算法
时间: 2023-06-07 07:12:06 浏览: 193
好的,以下是Python语言实现的LRU算法代码:
```python
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.hash = {}
self.head = DoublyLinkedListNode()
self.tail = DoublyLinkedListNode()
self.head.next = self.tail
self.tail.prev = self.head
def get(self, key: int) -> int:
node = self.hash.get(key, None)
if not node:
return -1
self._move_to_head(node)
return node.value
def put(self, key: int, value: int) -> None:
node = self.hash.get(key)
if not node:
node = DoublyLinkedListNode(key=key, value=value)
self.hash[key] = node
self._add_to_head(node)
if len(self.hash) > self.capacity:
tail = self._pop_tail()
del self.hash[tail.key]
else:
node.value = value
self._move_to_head(node)
def _add_to_head(self, node):
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def _remove_node(self, node):
node.prev.next = node.next
node.next.prev = node.prev
def _move_to_head(self, node):
self._remove_node(node)
self._add_to_head(node)
def _pop_tail(self):
tail = self.tail.prev
self._remove_node(tail)
return tail
class DoublyLinkedListNode:
def __init__(self, key=None, value=None):
self.key = key
self.value = value
self.prev = None
self.next = None
```
该代码模拟了一个双向链表来实现LRU,主要的操作包括get、put、_add_to_head、_remove_node、_move_to_head和_pop_tail,其中_put_to_head用于将一个节点添加到链表的头部,_remove_node用于移除一个节点,_move_to_head用于把链表中的某一个节点移到链表的头部,_pop_tail用于移除链表的尾节点。LRUCache类则是通过调用这些方法来实现LRU缓存。