时隔十年,再次上路 LRU缓存

这篇具有很好参考价值的文章主要介绍了时隔十年,再次上路 LRU缓存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个博客是为了十年前找工作时候创建的,用来记录自己的积累,没想到,一晃十年,我又回到了这里,想Mark下,时光弹指一瞬,令人唏嘘。

记录一道代码题吧。

力扣

Problem: 146. LRU 缓存

思路
解题方法
复杂度
Code
思路
使用一个Map来存储数据,使用双端链表来做LRU元素排序,新访问的元素插入表尾,最早的元素就被排序到表头了。

解题方法
注意元素为0个的判定和处理。map里要保存在双端链表的位置,使用一个node结构体都保存了

复杂度
时间复杂度:
get是o(1), put也是o(1)

空间复杂度:
o(n)文章来源地址https://www.toymoban.com/news/detail-534485.html


class LRUCache {
    private class Node {
        int key;
        int value;
        Node pre;
        Node next;
        Node(int k, int v) {
            key = k;
            value = v;
            pre = next = null;
        }

        Node() {}
    }

    HashMap<Integer, Node> cache;
    int capacity;
    int size;
    Node head;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        size = 0;
        head = new Node();
        head.next = head.pre = head;
        cache = new HashMap<Integer, Node>();
    }
    
    public int get(int key) {
        Node data = cache.get(key);

        if(data != null) {
            Node pre = data.pre;
            Node next = data.next;
            pre.next = data.next;
            next.pre = data.pre;

            pre = head.pre;
            pre.next = data;
            data.pre = pre;
            data.next = head;
            head.pre = data;

            return data.value;
        } else {
            return -1;
        }
    }
    
    public void put(int key, int value) {
        Node n = cache.get(key);

        if(n != null) {
            n.value = value;
            n.pre.next = n.next;
            n.next.pre = n.pre;

            Node pre = head.pre;
            pre.next = n;
            n.pre = pre;
            n.next = head;
            head.pre = n;

        } else {
            Node newNode = new Node(key, value);

            Node pre = head.pre;
            head.pre = newNode;
            newNode.next = head;
            if(pre != null) {
                pre.next = newNode;
                newNode.pre = pre;
            } else {
                head.next = newNode;
                newNode.pre = head;
            }

            cache.put(key, newNode);
            size++;
        

            if(size > capacity) {
                Node delNode = head.next;
                Node next = delNode.next;
                head.next = next;
                next.pre = head;
                cache.remove(delNode.key);
                size--;
            }
        }
    }
}

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */

作者:neomcgo
链接:https://leetcode.cn/problems/lru-cache/solutions/2334297/lruhuan-cun-by-neomcgo-3ozo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

到了这里,关于时隔十年,再次上路 LRU缓存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】用JAVA代码实现LRU 【缓存】【LRU】

    LRU(Least Recently Used)是一种常见的缓存淘汰策略,用于在缓存空间不足时确定哪些数据应该被淘汰。其基本原则是淘汰最近最少被访问的数据。 工作原理 : 最近使用优先 : LRU算法基于这样的思想:最近被使用的数据很可能在短时间内还会被使用,因此保留这些数据有助于

    2024年01月23日
    浏览(34)
  • kafka和rabbitmq区别面试题,十年Java编程开发生涯

    前言 作为同时具备高性能、高可靠和高可扩展性的典型键值数据库,Redis不仅功能强大,而且稳定,理所当然地成为了大型互联网公司的首选。 众多大厂在招聘的时候,不仅会要求面试者能简单地使用Redis,还要能深入地理解底层实现原理,并且具备解决常见问题的能力。可

    2024年04月25日
    浏览(30)
  • 【十年开发积累】STM32产品开发代码案例合集,嵌入式物联网工程师珍贵资料(物联技术666)

    简介     例程涵盖:STM32各类功能配置,外围传感器初始化,模块初始化,物联网协议,操作系统移植,功能开发,产品案例等等,十分具有参考价值。 0001基于STM32F103单片机GPIO实现控制LED灯闪烁的程序代码0001.rar 0002基于STM32F103单片机GPIO实现按键KEY的检测程序代码0002.rar

    2024年02月21日
    浏览(35)
  • 【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

    LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。

    2024年02月03日
    浏览(34)
  • LeetCode刷题---LRU缓存

    LRU是Least Recently Used的缩写,即最近最少使用,是一种内存管理算法,也可以用作缓存淘汰策略。 这种算法的核心思想是:如果数据最近被访问过,那么将来被访问的几率也更高。 因此,当内存或缓存容量有限,需要淘汰部分数据时,LRU算法会优先淘汰那些最长时间未被访问

    2024年02月22日
    浏览(28)
  • 146. LRU 缓存

    请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果 key 存在于缓存中,则返回的值,否则返回 -1 。 void put(int key, int value) 如果 key 已经存在,

    2024年02月12日
    浏览(35)
  • leetcode 146. LRU 缓存

             本题核心就是要将map中,最近最少操作的那个key给剔除掉,于是我们可以使用双端链表LinkedList 来维护每个元素的操作情况,最近操作的元素就将其移至表头,越久没操作的元素,自然就会沉到表尾。  一旦缓存满了,将表尾元素剔除即可。  java代码如下:

    2024年02月08日
    浏览(32)
  • 35、链表-LRU缓存

            首先要了解LRU缓存的原理,首先定下容量,每次get请求和put请求都会把当前元素放最前/后面,如果超过容量那么头部/尾部元素就被移除,所以最近最少使用的元素会被优先移除,保证热点数据持续存在。 不管放在头部还是尾部都可以。看你怎么定义         那

    2024年04月23日
    浏览(27)
  • LRU 缓存

    LRU 缓存 如果插入操作导致数量超过 capacity ,则应该 逐出 最久未使用的 函数 get 和 put 必须以 O(1) 的平均时间复杂度运行 如果想以O(1)的速度进行get,则需要将对应的key、value存到map中 如果想以O(1)的速度进行put,又因为插入的时候可能由于空间已满需要将最久未

    2024年02月16日
    浏览(28)
  • LRU 缓存结构

    优先去除最久没有访问到的数据。 通过组合哈希表(Hash Table)和双向链表(Doubly Linked List)实现 LRU 缓存。并且以 O(1) 的时间复杂度执行 get 和 put 操作 核心是对节点的新增、访问都会让节点移动到双向链表头部,当容量超过时,直接删除尾部节点即可

    2024年02月15日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包