Java实现LRU

2023-05-16

首先看看什么是LRU

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。(来自[百度百科](https://baike.baidu.com/item/LRU/1269842?fr=aladdin))

Java实现

先来捋一下思路,我们需要准备一个双向链表,这样到时候删除cache中很久没有被使用的key的时间复杂度就为n(1)。但是链表的查询时间复杂度为O(n),对此我们引入HashMap进行存储链表节点,HashMap的查询时间复杂度为O(1)。

代码实现如下

import java.util.HashMap;
import java.util.Map;

class LRUCacheTest{
    private class LinkedNode{
        private int key;
        private int val;
        LinkedNode pre;
        LinkedNode next;
        public LinkedNode(){}
        public LinkedNode(int key, int val){
            this.key = key;
            this.val = val;
            this.pre = null;
            this.next = null;
        }
    }
    private Map<Integer, LinkedNode> map = new HashMap<>();
    private int capacity;
    private LinkedNode head;
    private LinkedNode tail;
    public LRUCacheTest(int capacity){
        this.capacity = capacity;
        head = new LinkedNode(-1,-1);
        tail = new LinkedNode(-1,-1);
        head.next = tail;
        head.pre = null;
        tail.pre = tail;
        tail.next = null;
    }
    public int get(int key){
        // 如果该关键字还在cache中,返回其对应的值,如果没有就返回-1
        if(map.containsKey(key)){
            LinkedNode node = map.get(key);
            removeNode(node);
            addToHead(node);
            System.out.print("The value of "+key+" is ");
            return map.get(key).val;
        }
        System.out.print("404, the key you get is not in cache ");
        return -1;
    }

    private void removeNode(LinkedNode node) {
        LinkedNode from = node.pre;
        LinkedNode to = node.next;
        from.next = to;
        to.pre = from;
    }

    private void addToHead(LinkedNode node) {
        node.next = head.next;
        node.pre = head;
        head.next.pre = node;
        head.next = node;
    }
    public void put(int key, int val){
        if(map.containsKey(key)){
            map.remove(key);
            removeNode(map.get(key));
            LinkedNode node = new LinkedNode(key, val);
            map.put(key, node);
            addToHead(node);
            System.out.println(key+" has been put in cache, the value of "+key+" is "+ val);
        }else{
            if(map.size()==capacity){
                int removeKey = removeTailNode();
                map.remove(removeKey);
                LinkedNode node = new LinkedNode(key, val);
                addToHead(node);
                map.put(key,node);
                System.out.println(key+" has been put in cache, the value of "+key+" is "+ val);
            }else{
                LinkedNode node = new LinkedNode(key, val);
                map.put(key,node);
                addToHead(node);
                System.out.println(key+" has been put in cache, the value of "+key+" is "+ val);
            }
        }
    }

    private int removeTailNode() {
        LinkedNode node = tail.pre;
        removeNode(tail.pre);
        return node.key;
    }

}

public class LRUTest01 {
    public static void main(String[] args) {
        LRUCacheTest lru = new LRUCacheTest(3);
        lru.put(1,1);
        lru.put(2,2);
        lru.put(3,3);
        System.out.println(lru.get(1));
        lru.put(4,4);
        System.out.println(lru.get(2));
    }
}

运行结果如下

请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实现LRU 的相关文章

随机推荐

  • 微信小程序获取手机号码第一次失败第二次成功的解决方案

    标题 微信小程序获取手机号码第一次失败第二次成功的解决方案 注意点 xff1a 1 千万记住在getphone之后不能login xff0c 否则session key就会失效 我的解决方案是再onshow里面直接登录获取code 拿着这个
  • vue-element-vue修改菜单切换标签,tagsview

    vue element vue修改菜单切换标签 xff0c tagsview 1 从 vue element admin 项目中复制文件到对应的项目中文件夹中 将 vue admin template src layout componen
  • Linux系统怎么复制文件夹下的全部文件到另外文件夹?

    在Linux系统中复制或拷贝文件我们可以用cp或者copy命令 xff0c 但要对一个文件夹中的全部文件复制到另外一个文件夹中去 xff0c 如何进行操作呢 xff1f 下面简单来介绍一下 copy命令 1 copy cp xff0c 该命
  • docker of minio解决浏览器无法访问的问题

    1 拉取镜像 docker pull minio minio 2 启动minio xff0c 动态端口云服务器会改变 docker run span class token punctuation span p 9090 span clas
  • vue3引入vant3配置整合详情(按需引入)

    一 安装 Vue Cli npm install g 64 vue cli 二 创建一个项目 xff0c hello world为你定义的项目名称 vue create hello world 三 安装vant依赖 npm i vant 6
  • java基础正则表达式(验证手机号码,验证电话号码等)

    1 验证用户名和密码 xff0c 第一个字必须为字母 xff0c 一共6 16位字母数字下划线组成 xff1a xff08 34 1 w 5 15 34 xff09 2 验证电话号码 xff1a xff08 34 d 3 4 d 7 8 3
  • 九、大数据技术之Hive

    一 Hive基本概念 1 1 什么是Hive 1 xff09 hive简介 Hive xff1a 由Facebook开源用于解决海量结构化日志的数据统计工具 Hive是基于Hadoop的一个数据仓库工具 xff0c 可以将结构化的数据文件映
  • nacos2.2启动命令mysql版本

    docker run d p 8848 8848 p 7848 7848 p 9848 9848 p 9849 9849 e MODE 61 standalone e PREFER HOST MODE 61 hostname e SPRIN
  • 一、Redis入门概述(是什么,能干嘛,去哪下,怎么玩)

    一 redis是什么 xff1f Redis REmote Dictionary Server 远程字典服务器 官方解释 xff1a Remote Dictionary Server 远程字典服务 是完全开源的 xff0c 使用ANSIC语
  • 二、Redis安装配置(云服务器、vmware本地虚拟机)

    一 自己购买服务器 自己购买阿里云 青牛云 腾讯云或华为云服务器 xff0c 自带CentoOS或者Ubuntu环境 xff0c 直接开干 二 Vmware本地虚拟机安装 1 VMWare虚拟机的安装 xff0c 不讲解 xff0c 默认懂
  • 【MySQL基础】数据类型

    文章目录 整数类型浮点类型定点数类型日期和时间类型字符串类型文本类型二进制字符串类型JSON 类型位类型ENUM类型SET类型空间类型 整数类型 整数类型一共有 5 种 xff0c 包括 TINYINT SMALLINT MEDIUMINT
  • ubuntu16.04备份和迁移

    ubuntu16 04备份和迁移 背景实践1 备份整个系统2 重装Ubuntu16 043 恢复系统 题外话 xff1a 修改主机名参考文章 背景 此文用来快速记录备份和恢复的过程步骤 xff0c 具体命令意思不做过多介绍 因为不想新设备重
  • c++20协程基础概念

    c 43 43 协程介绍 前言 官方文档地址 本文主要对c 43 43 reference做翻译 不会逐字翻译 xff0c 同时对其中的概念以及协程运行过程做对应的解释 因为是学习过程中的记录 xff0c 如有问题 xff0c 希望大家能够
  • Flask 与 Django 框架对比

    详细分析了两种 Python Web框架 xff1a Flask 与 Django 从开发难易度 应用架构 性能 可扩展性以及适用范围等方面进行了详细说明 Django 中级教程在 B 站上线 xff0c 深入解析 Django 体系架构
  • STM32F103C8T6基础开发教程(HAL库)—点亮第一颗LED灯

    STM32F103C8T6基础开发教程目录 STM32F103C8T6基础开发教程 xff08 HAL库 xff09 开发环境配置STM32F103C8T6基础开发教程 xff08 HAL库 xff09 Keil添加注释的快捷键STM32F
  • C++实现插入排序算法(直接插入排序、折半插入排序、希尔排序)

    排序算法分为五大类 xff0c 一共是有九种 xff0c 如下 xff1a 插入类 xff1a 直接插入排序 折半插入排序 希尔排序 交换类 xff1a 冒泡排序 快速排序 选择类 xff1a 简单选择排序 堆排序 归并类 xff1a 二路
  • C++实现二路归并排序算法

    排序算法分为五大类 xff0c 一共是有九种 xff0c 如下 xff1a 插入类 xff1a 直接插入排序 折半插入排序 希尔排序 交换类 xff1a 冒泡排序 快速排序 选择类 xff1a 简单选择排序 堆排序 归并类 xff1a 二路
  • C语言实现-学生信息管理系统

    通过C语言实现一个学生信息管理系统 xff0c 要求如下 xff1a xff08 1 xff09 用户采用自己账号和密码登录系统 xff1b xff08 2 xff09 学生信息和账号密码通过文件的形式存储 xff1b xff08 3 xf
  • 通过python画矢量图(matplotlib,有代码)

    python画矢量图 xff08 有代码 xff09 python的matplotlib可以保存的文件格式word可以插入哪些图片格式呢代码中文乱码问题 有些同学因为文章的要求 xff0c 图片插入到word里的时候需要足够清晰 xff0c
  • Java实现LRU

    首先看看什么是LRU LRU是Least Recently Used的缩写 xff0c 即最近最少使用 xff0c 是一种常用的页面置换算法 xff0c 选择最近最久未使用的页面予以淘汰 该算法赋予每个页面一个访问字段 xff0c 用来记录