当前位置: 首页 > article >正文

lc 146. LRU 缓存

通过双向链表和哈希表实现

双向链表靠近头部是最近使用的键值对

双向链表靠近尾部是最久未被使用的键值对

哈希表将缓存数据作为key, value为其在双向链表中的位置

首先通过哈希表找到该项在双向链表中的位置,然后将其移动到链表的头部

对于get操作:

首先判断key是否存在,不存在返回-1

如果key存在,通过哈希表找出对应的位置,然后将它移动到头部 

对于put操作:

如果key不存在,使用key和value创建一个新结点并放到头部,然后判断节点是是否超出容量,如果超出容量,则删除链表尾部节点,并删除出哈希表中对应的项

如果key存在,则更新哈希表中的value,并将链表中结点放到头部

class LRUCache {

    //定义双向链表结构

    class Node{

        int key;

        int value;

        Node prev;

        Node next;

        public Node(){key = -1;}

        public Node(int k, int v){

            key = k;

            value = v;

        }

    }

    //定义哈希表和容量以及头尾结点

    private Map<Integer, Node> mp = new HashMap<>();

    private int capacity;

    private Node head, tail;

    //

    public LRUCache(int capacity) {

        this.capacity = capacity;

        head = new Node();

        tail = new Node();

        head.next = tail;

        tail.prev = head;

    }

   

    public int get(int key) {

        if(mp.containsKey(key)){

            Node node = mp.get(key);

            //先删除该结点

            node.prev.next = node.next;

            node.next.prev = node.prev;

            //移动到头部

            moveToHead(node);

            return node.value;

        }else{

            return -1;

        }

    }

   

    public void put(int key, int value) {

        if(mp.containsKey(key)){

            Node node = mp.get(key);

            node.value = value;

            node.prev.next = node.next;

            node.next.prev = node.prev;

            moveToHead(node);

        }else{

            Node node = new Node(key, value);

            mp.put(key, node);

            if(mp.size() > capacity){

                Node delNode = tail.prev;

                mp.remove(delNode.key);

                tail.prev.prev.next = tail;

                tail.prev = tail.prev.prev;

            }

            moveToHead(node);

        }

    }

        private void moveToHead(Node node){

            node.prev = head;

            node.next = head.next;

            head.next.prev = node;

            head.next = node;

        }

}


http://www.kler.cn/a/411573.html

相关文章:

  • Http文件上传
  • 什么是MyBatis?
  • 深度学习基础01_深度学习概述参数初始化激活函数
  • Mongo数据库 --- Mongo Pipeline
  • jmeter基础06_(练习)常见的http请求
  • 手搓人工智能—聚类分析(下)谱系聚类与K-mean聚类
  • 【系统架构设计师】真题论文: 论软件系统架构评估(包括解题思路和素材)
  • HDR视频技术之四:HDR 主要标准
  • 跨子网通信的具体流程
  • 【后端面试总结】MySQL索引
  • 学习日记_20241126_聚类方法(聚合聚类Agglomerative Clustering)
  • 构建与优化数据仓库-实践指南
  • ES6的第四天
  • huggingface使用
  • 【C++】读取数量不定的输入数据
  • 结构方程模型(SEM)入门到精通:lavaan VS piecewiseSEM、全局估计/局域估计;潜变量分析、复合变量分析、贝叶斯SEM在生态学领域应用
  • 无人机舵机转速运行原理!
  • Django 路由层
  • java——Tomcat调优策略
  • Prometheus从二进制部署迁移Docker中更新到v3.0.0版本
  • 【前端】ES6基础
  • 【二叉树】【2.1遍历二叉树】【刷题笔记】【灵神题单】
  • 【小白学机器学习36】关于独立概率,联合概率,交叉概率,交叉概率和,总概率等 概念辨析的例子
  • 堆排序实现
  • Linux服务器驱动安装
  • HarmonyOS:应用沙箱