BM100 设计LRU缓存结构(python)

题目

题目链接

设计LRU 缓存结构,该结构在构造时确定大小,假设大小为 capacity 有如下功能:

  1. Solution(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
  2. get(key):如果关键字 key 存在于缓存中,则返回key对应的value值,否则返回 -1
  3. set(key, value):将记录(key, value)插入该结构,如果关键字 key 已经存在,则变更其数据值 value,如果不存在,则向缓存中插入该组 key-value ,如果key-value的数量超过capacity,弹出最久未使用的key-value

实现

使用collections.OrderedDict实现
OrderedDict是一个有序字典,有序指它记录了每个元素插入的顺序,适合用来动态增删元素

  • __init__:初始化一个空的有序字典,并记录传入的容量值capacity
  • get:根据key值查字典,若不存在返回-1,若存在则返回值,并把这个键值对删除,重新插入,使得它在字典尾部(表示最近被访问)
  • set:根据key值查字典
    -若存在,将原来的键值对删除,以新的值重新插入
    -若不存在,将新的键值对插入字典,检查是否超出容量,超出则删除当前字典中最先插入的元素(表示最久未被访问)
    通过OrderedDict.popitem()实现,它有一个参数last,指定last=False时会弹出最先插入的元素,last=True时会弹出最后插入的元素;本题中使用last=False

代码

from collections import OrderedDict


class Solution:

    def __init__(self, capacity):
        self.capacity = capacity
        self.LRUdict = OrderedDict()
        return

    def get(self, key):
        value = -1
        if key in self.LRUdict:
            value = self.LRUdict[key]
            self.LRUdict.pop(key)
            self.LRUdict.update({key: value})
        return value

    def set(self, key, value):
        if key in self.LRUdict:
            self.LRUdict.pop(key)
            self.LRUdict.update({key: value})
        else:
            self.LRUdict.update({key: value})
            if len(self.LRUdict) > self.capacity:
                self.LRUdict.popitem(last=False)  # 移除队头元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值