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

目录

    • 参考
    • 功能
    • 思路
    • 代码

参考

题目来源: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}

你可能感兴趣的:(算法,Python,python,算法)