使用JAVA实现LRU算法

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。使用JAVA实现LRU算法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

原理

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。

  • 通俗的来讲,就是淘汰使用时间最长的

代码

//使用双向链表+HashMap来实现 -- LRU算法
public class LRUTest {

    //========================链表节点===========================
    class Node{
        Node pre;
        Node next;
        int key,value;
        public Node(int a,int b){
            this.key = a;
            this.value = b;
        }
    }


    //====================链表成员变量======================
    Node head;
    Node tail;

    //默认最大长度为 2
    int maxSize;
    int currentCacheSize;

    HashMap<Integer,Node> map;


    //=====================构造方法===========================

    public LRUTest(int capacity) {
        currentCacheSize = 0;
        this.maxSize = capacity;
        map = new HashMap<>();
    }


    //======================具体的函数实现===========================
    public int get(int index){
        if(!map.containsKey(index)){
            return -1;
        }
        //使用了当前节点还需要把当前节点移到链表头
        transToHead(map.get(index));
        return map.get(index).value;
    }


    public void put(int a,int b){
        Node node = map.get(a);
        if (node == null){
            map.put(a,new Node(a, b));
        }
    }

    //移除map中的
    public Object remove(int k){
        Node node = map.get(k);
        if(node != null){
            if(node.pre != null){
                node.pre.next=node.next;
            }
            if(node.next != null){
                node.next.pre=node.pre;
            }
            if(node == head){
                head = node.next;
            }
            if(node == tail){
                tail = node.pre;
            }
        }

        return map.remove(k);
    }


    public void transToHead(Node node){
        //考虑三种情况: 链表头,链表尾,链表中
        if (node == head){
            return;
        }
        if(node.next != null){
            node.next.pre = node.pre;
        }
        if(node.pre != null){
            node.pre.next = node.next;
        }
        if(node == tail){
            tail = tail.pre;
        }
        //改变头结点为node
        node.next = head;
        head.pre = node;
        head = node;
        head.pre = null;
    }

    public void removeLast(){
        if (tail != null){
            tail = tail.pre;
            //如果尾节点为null
            if(tail == null){
                head = null;
            }else {
                tail.next = null;
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202500.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!