LRU(least recently used)算法的python基础实现

系列文章目录

例如:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值