python实现最近最少使用(LRU)缓存机制

博客介绍了如何使用Python实现LRU缓存机制,利用字典保持插入顺序来达到O(1)时间复杂度的get和put操作。内容包括LRU算法原理、功能需求、实现思路及完整代码。通过创建一个LRUcache类,实现了缓存容量限制、任务获取与添加,并在满容量时删除最久未使用的任务。
摘要由CSDN通过智能技术生成

参考

题目来源:labuldong
底层实现:(leetcode)哈希表+双向链表(本文采用python中的字典,未采用双向链表,未理解 。由于Python中字典中的顺序是按照你插入的顺序的(和列表一样),但是C++中的map(红黑树,有序)或者unordered_map(哈希表无序)都是有一种’‘特定的顺序’‘,因此C++在删除字典中的第一个元素时,无法找到,所以是通过字典+链表(方便删除头部)的方式)
LRU理解:(百科)是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。

功能

  1. 初始化一个容量为cap的缓存器,并以O(1)时间复杂度进行以下两个操作
  2. get()获取缓存中的任务
  3. put()实现向容器添加任务(以键值对形式)

思路

  • 使用python中的字典,默认是按照创建字典的时间顺序排序的
  • 在获取任务时,首先判断是否存在,存在则返回并将该任务移到字典末尾
  • 添加任务时,先判断是否存在该任务,存在则修改值即可,不存在则需判断容量(容量满了则需移除字典第一个),添加新的任务

代码

class LRUcache:
    def __init__(self, cap):
        self.cap = cap #缓存容量
        self.cache = {} #缓存任务

    def get(self, key):
        '''
        获取键对应的值
        :param key:
        :return:
        '''
        if not key in self.cache.keys():
            return -1
        #将key变为最近使用, 并返回值
        self.makeRecently(key)
        return self.cache[key]

    def put(self, k, v):
    	'''
        将键值对任务添加进缓存
        :param k: 
        :param v: 
        :return: 
        '''
        if k in self.cache.keys():
            self.cache[k] = v
            # 将key变为最近使用, 并返回值
            self.makeRecently(k)
            return 0
        if len(self.cache) >= self.cap:
            #移除字典第一个
            first = list(self.cache.keys())
            self.cache.pop(first[0])
        self.cache[k] = v

    def makeRecently(self, key):
        value = self.cache.pop(key)
        self.cache[key] = value

#测试
cache = LRUcache(2)
print(cache.put(1, 1), cache.cache) #None {1: 1}
print(cache.put(2, 2), cache.cache) #None {1: 1, 2: 2}
print(cache.get(1), cache.cache) #1 {2: 2, 1: 1}
print(cache.put(3, 3), cache.cache) #None {1: 1, 3: 3}
print(cache.get(2), cache.cache) #-1 {1: 1, 3: 3}
print(cache.put(4, 4), cache.cache) #None {3: 3, 4: 4}
print(cache.get(1), cache.cache) #-1 {3: 3, 4: 4}
print(cache.get(3), cache.cache) #3 {4: 4, 3: 3}
print(cache.get(4), cache.cache) #4 {3: 3, 4: 4}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值