IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 0X02 LRU算法 -> 正文阅读

[数据结构与算法]0X02 LRU算法


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

/**
 * 0X02 LRU算法
 * @author Green.Gee
 * @date 2022/4/24 9:47
 * @email green.gee.lu@gmail.com
 */
public class SolveQ8 {

    public static void main(String[] args) {
        //System.err.println(LRU_LINKEDHASHMAP(1));
        /**
         * 关于数据申请范围是2的倍数的设计思路
         *         2的倍数  - 1 的二进制方式一定是全部是1
         *              15 = 二进制 1111
         *              全部是1进行&运算之后一定是奇数
         *              如果是非2的倍数则二进制末尾一定是0,任何&运算都是偶数
         *         这样会导致三列分布不均匀
         */
        LRUCache chche = new LRUCache(3);
        chche.put(1,11);
        chche.put(2,22);
        chche.put(3,33);
        chche.put(1,111);
        System.err.println(chche.get(1));
    }




    /**
     * LinkedHashMap
     *      LRU
     */
    public static Object LRU_LINKEDHASHMAP(Object key){
        LinkedHashMap<Object, Object> objectObjectLinkedHashMap = new LinkedHashMap<Object, Object>(2);
        objectObjectLinkedHashMap.put(1,"zhangsan");
        objectObjectLinkedHashMap.put(2,"lisi");
        objectObjectLinkedHashMap.put(3,"wangwu");
        return objectObjectLinkedHashMap.get(key);
    }
}

/**
 * LRU 实现
 */
class LRUCache{

    Map<Integer,Node> map = new HashMap<>(8);// 非线程安全
    DoubleList doubleList;
    int maxSize;
    public LRUCache(int capacity){
        doubleList = new DoubleList();
        maxSize = capacity;
    }

    /**
     * 获取缓存
     *  如果命中则更改当前缓存的LRU
     *  为命中则nothing
     * @param key
     * @return
     */
    public int get(int key){
        int val;
        if(!map.containsKey(key)){
            return -1;
        }
        val = map.get(key).value;
        // LRU
        Node team = map.get(key);// 获取节点信息
        doubleList.deleteNode(team);// 删除链表中的缓存
        doubleList.add(team);// LRU 位置
        // return cache value
        return val;
    }

    /**
     * 缓存存取
     *
     */
    public void put(int key,int value){
        if(map.containsKey(key)){
            //删除双链表原始位置缓存
            Node deleteNode = map.get(key);
            doubleList.deleteNode(deleteNode);// 维护最远未被使用
        }
        if(maxSize == doubleList.length){// max
            Node first = doubleList.head.next;//
            map.remove(first.key);// 删除缓存
            doubleList.deleteFirst();// 删除双链表第一个
        }
        // 增加LRU 最新缓存
        Node node = new Node(key,value);
        map.put(key,node);
        doubleList.add(node);
    }

    class Node {
        int key;
        int value;
        Node pre;
        Node next;
        public Node(){}
        public Node(int key,int value){
            this.key = key;
            this.value = value;
        }
    }

    class DoubleList{
        private Node head;
        private Node tail;
        private int length;
        public DoubleList(){
            head = new Node(-1,-1);
            tail = head;
            length = 0;
        }

        // 添加 默认尾巴节点
        void add(Node teamNode){
            tail.next = teamNode;
            teamNode.pre = tail;
            tail = teamNode;
            length++;
        }

        // 删除第一
        void deleteFirst(){
            if(head.next == null)
                return;
            if(head.next == tail)
                head = tail;
            head.next = head.next.next;
            if(head.next != null)
                head.next.pre = head;
            length--;
        }

        // 删除节点
        void deleteNode(Node teamNode){
            teamNode.pre.next = teamNode.next;
            if(teamNode.next != null)
                teamNode.next.pre = teamNode.pre;
            if(teamNode == tail)
                tail = tail.pre;
            teamNode.pre = null;
            teamNode.next = null;
            length--;
        }
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-29 12:21:18  更:2022-04-29 12:24:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:01:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码