LRU Cache的实现,应用和题解

本文介绍了LRU Cache的概念,作为CPU Socket中缓存的一种策略,重点讨论了其大小限制和替换策略。通过使用Hash Table和Double LinkedList,可以实现O(1)查询和修改的高效操作。文章还探讨了LRU与其他替换策略如LFU的差异,并结合面试题和Python的OrderedDict讲解了LRU Cache的工作示例及其在Python中的实现。
摘要由CSDN通过智能技术生成

CPU Socket中Cache的理解
LRU Cache 最近最少使用的缓存放在淘汰的位置
两个要点: 大小,替换策略
实现: Hash Table + Double LinkedList
复杂度: O(1)查询, O(1)修改,更新

LRU cache工作示例
在这里插入图片描述
替换策略:
LFU - least frequently used 统计每个元素使用到的频次最少
LRU - least recently used
替换算法

LRU Cache

面试题 16.25. LRU缓存
146. LRU缓存机制

# Python 
class LRUCache(object): 
	def __init__(self, capacity): 
		self.dic = collections.OrderedDict() # OrderedDict的get和put比较简单
		self.remain = capacity # remain得到capacity
	def get(self, key): 
		if key not in self.dic: 
			return -1 
		v = self.dic.pop(key) 
		self.dic[key] = v   # key as the newest one 
		return v 
	def put(self, key, value): 
		if key in self.dic:    # 如果key已经在字典中,只要pop出去即可
			self.dic.pop(key) 
		else: 		
			if self.remain > 0: 	#不然就判断remain到底够不够,remain还够的话,就-1
				self.remain -= 1 
			else:   # self.dic is full #remain = 0不够,就要弹一个最老的元素,空一个位置
				self.dic.popitem(last=False) 
		self.dic[key] = value

python知识点:class collections.OrderedDict([items])
继承自dict, 与dict不同的是, dict由于hash的特性,是无序的, 而OrderedDict是有序的, 是依照插入的顺序排列的。

  1. popitem(last=True)
    该方法返回并删除一个(key, value)对, 删除的顺序遵循:
    如果参数设置为True, 则为:LIFO, 后进先出。
    如果参数设置为False, 则为:FIFO, 先进先出。
  2. move_to_end(key, last=True)
    将现有 key 移动到有序字典的任一端。
    如果 last 为真值(默认)则将元素移至末尾;
    如果 last 为假值则将元素移至开头。
    如果 key 不存在则会触发 KeyError:
//C/C++

struct CacheNode {
   
    int key, value;
    CacheNode *pre, *next;
      
    CacheNode(int key_ = 0, int value_ = 0) 
        : key(key_), value(value_), pre(NULL), next(NULL) {
   }
};

class LRUCache {
   
public:
    LRUCache(int capacity) 
        : _capacity(capacity), _head(new CacheNode()), _tail(_head) {
   }
    
    int get(int key) {
   
        auto it = _cache.find
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值