系列文章目录
例如:
python算法技巧: 逻辑运算符的短路效应
进制转换原理和python实现
前言
仅做个人记录之用
提示:以下是本篇文章正文内容,下面案例可供参考
一、LRU是什么?
LRU 英文全称(Least recently used,最近最少使用)
二、python 实现
1.最小单位,Node
包含了key, value, prev, successor
可以把key 理解为手机的app,或者网页
value为app或者网页内容
prev和succ 是 Node类别,为网址 和 内容 的组合
class Node:
def __init__(self, key, value, prev = None, succ = None):
self.key = key
self.value = value
self.prev = prev
self.succ = succ
2.双向链表 LinkedList
链表由Node链接而成,开头代表最近最少使用的节点,末尾代表最近使用的node节点。使用 head 和 tail 两个dummy虚拟node来标记
## head ---> node ---> node ---> tail_prev---> tail
class LinkedList():
def __init__(self):
self.head = Node(None, "head")
self.tail = Node(None, "tail")
self.head.succ = self.tail
self.tail.prev = self.head
def append(self, node):
# 将最新使用的node加入到list尾,同时可以更新node的prev和succ
# tail_prev---> tail
tail_prev = self.tail.prev
node.prev = tail_prev
node.succ = self.tail
tail_prev.succ = node
node.succ.prev = node
def delete(self, node):
succ = node.succ
prev = node.prev
succ.prev = prev
prev.succ = succ
def find_head(self):
return self.head.succ
3.LRU
LRU类别由内存限制capacity, 缓存 cache ,和记录缓存顺序的双向链表 linkedlist 组成
class LRU():
def __init__(self, capacity):
self.capacity = capacity
self.cache = {}
self.linkedlist = LinkedList()
def put_recently(self, key):
# 将 已经在缓存中 的记录放到最近的对尾
node = self.cache[key]
self.linkedlist.delete(node)
self.linkedlist.append(node)
def update_cache_value(self, key, value):
# 若已经在缓存中,需要更新
if key in self.cache:
old_node = self.cache[key]
self.linkedlist.delete(old_node)
self.cache[key] = Node(key, value)
self.linkedlist.append(self.cache[key])
return
# 当不在时,同时缓存已到容量
if len(self.cache) >= self.capacity:
head_node = self.head.succ
self.linkedlist.delete(head_node)
del self.cache[head_node.key]
# 将 新的node加入进去
new_node = Node(key, value)
self.linkedlist.append(new_node)
self.cache[key] = new_node
def get_value(self, key):
if key not in self.cache:
return None
self.put_recently(key)
return self.cache[key].value