首页 > 其他分享 >146. LRU 缓存

146. LRU 缓存

时间:2023-05-20 20:12:26浏览次数:39  
标签:146 pre 缓存 node self next tail LRU key

 

 

labuladong 题解思路 难度中等 请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类:
  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

 

示例:

输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]

解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1);    // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2);    // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1);    // 返回 -1 (未找到)
lRUCache.get(3);    // 返回 3
lRUCache.get(4);    // 返回 4

 

 

 

class ListNode:
    def __init__(self,key,val) -> None:
        self.key = key
        self.val = val
        self.next = None
        self.pre = None
    
        
class LRUCache:

    def __init__(self, capacity: int):
        self.capacity = capacity
        self.head = ListNode(0,0)
        self.tail = ListNode(0,0)
        self.head.next = self.tail
        self.tail.pre = self.head
        self.map = {}


    def move_to_tail(self,node):
        pre = node.pre
        pre.next = node.next

        next = node.next
        node.next = None
        next.pre = pre

        self.tail.pre.next = node
        node.pre = self.tail.pre
        node.next = self.tail
        self.tail.pre = node

    def get(self, key: int) -> int:
        res = -1
        if key in self.map:
            self.move_to_tail(self.map[key])
            res = self.map[key].val
        return res

    def put(self, key: int, value: int) -> None:
        if key in self.map:
            self.map[key].val = value
            self.move_to_tail(self.map[key])
        else:
            if len(self.map) == self.capacity:
                self.map.pop(self.head.next.key)
                self.head.next = self.head.next.next
                self.head.next.pre = self.head

            node = ListNode(key,value)
            self.map[key] = node
            self.tail.pre.next = node
            node.pre = self.tail.pre
            node.next = self.tail
            self.tail.pre = node

        

 

标签:146,pre,缓存,node,self,next,tail,LRU,key
From: https://www.cnblogs.com/zle1992/p/17417717.html

相关文章

  • aop & 反射 & 缓存
    aop&反射&缓存有时候一些公用属性,就想一个对象继承这个对象,这个对象里面的属性就自动赋值,这个时候就可以用到反射(反射加上缓存速度嘎嘎快,性能损耗微乎其微),那些方法需要赋值用aop切就行。1.第一步定义注解和对应的公共类@Target({ElementType.METHOD,ElementType......
  • Linux的磁盘缓存和刷脏页
    导读无论您选择哪种路线,您都应该始终收集硬数据来支持您的更改,并帮助您确定是正在改进还是使事情变得更糟。在这种情况下,您可以从许多不同的位置获取数据,包括应用程序本身、/proc/vmstat、/proc/meminfo、iostat、vmstat以及/proc/sys/vm中的许多内容。我们讨论了Linux......
  • Android之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面
    感觉Android到处都是坑,每个地方都要把人折腾半天。今天来简单说说Android之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面关于他们的介绍就不多说了,网上到处都是,只说关键的部分:我在开发的时候遇到几个疑难问题,花费大量时间处理,总结如下:1.关于Fragment内部......
  • Nginx一网打尽:动静分离、压缩、缓存、黑白名单、跨域、高可用、性能优化...
    干货!文章有点长,建议先收藏引言一、性能怪兽-Nginx概念深入浅出二、Nginx环境搭建三、Nginx反向代理-负载均衡四、Nginx动静分离五、Nginx资源压缩六、Nginx缓冲区七、Nginx缓存机制八、Nginx实现IP黑白名单九、Nginx跨域配置十、Nginx防盗链设计十一、Nginx大文件传输配置十二、Ngi......
  • 缓存更新的四种策略及选取建议
    缓存更新策略缓存更新是指在数据发生变化时,保持缓存和数据库的数据一致性的问题。如果缓存和数据库的数据不一致,会导致用户看到过期或者错误的数据,影响业务逻辑和用户体验。为了实现缓存更新,我们可以采用以下四种方式:CacheAside策略:应用程序直接与数据库和缓存交互,并负责维......
  • 【JMM内存模型-4】JMM内存模型之CPU缓存策略-jmmcpu4
    title:【JMM内存模型-4】JMM内存模型之CPU缓存策略date:2021-11-1713:27:48.139updated:2021-12-2617:43:10.442url:https://www.yby6.com/archives/jmmcpu4categories:-并发编程-JMM内存模型tags:-并发编程CPU缓存策略原理缓存概述CPU为了提升执行效率,减少C......
  • CleanMyWechat是一个用于自动删除PC端微信缓存数据的工具
    CleanMyWechat是一个用于自动删除PC端微信缓存数据的工具。它可以删除微信自动下载的大量文件、视频和图片等数据,从而释放存储空间。工具支持识别微信账号,允许用户选择自定义路径,并且可以管理多个账号。删除后的文件会被放置在回收站中,以防止意外删除。该工具支持Windows系统中的......
  • 宝塔面板删除文件后,磁盘占用比例显示一直没变化,可能是删除文件后缓存没有释放导致
    问题描述:linux磁盘空间太少,删除了不必要的文件和缓存后,宝塔面板磁盘使用率没变化,如下图: 解决方法:1.重启服务器2.登录linux界面:2.1、使用df-h和du-sh/*命令查看磁盘空间,查看磁盘情况 du-sh./查看的当前目录的总大小 du-sh./*查看的是当前目录下所有子文件与子......
  • 第13章 使用Bind提供域名解析服务。 dns 正向反向解析 主从 dns加密传
    章节简述: 本章讲解了DNS域名解析服务的原理以及作用,介绍了域名查询功能中正向解析与反向解析的作用,并通过实验的方式演示了如何在DNS主服务器上部署正、反解析工作模式,以便让大家深刻体会到DNS域名查询的便利以及强大。本章还介绍了如何部署DNS从服务器以及DNS缓存服务器来提......
  • 在Linux/Windows/Mac上刷新DNS缓存的方法
    在Linux/Windows/Mac上刷新DNS缓存的方法刷新dns缓存让你可以得到新的域名解析。当你无法正确访问一个新注册的域名时就可以刷新dns缓存试试。但是不同的系统,Windows、MacOS和Linux上的方法是不一样的。1.Windows系统刷新DNS缓存开始-->运行-->输入cmd并回车在打开的命......