第291天学习打卡(知识点回顾 LRU算法)

Posted doudoutj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第291天学习打卡(知识点回顾 LRU算法)相关的知识,希望对你有一定的参考价值。

知识点回顾

LRU

  • LRU是最近最少使用,是一种常用的页面置换算法,选择最近最近未使用的数据予以淘汰。
public class LRUCache
    private int capacity;
    private Map<Integer, ListNode>map;
    private ListNode head;
    private ListNode tail;
    public LRUCache(int capacity)
        this.capacity = capacity;
        map = new HashMap<Integer, ListNode>();
        head = new ListNode(-1,-1);
        tail = new ListNode(-1,-1);
        head.next = tail;
        tail.pre = head;
    
    public int get(int key)
        //没有就返回-1
        if(!map.containsKey(key))
            return -1;
        
        //有就获取这个值  然后把它删除移动到尾部
        ListNode node = map.get(key);
        //这两句相当于把node的前一个和后一个节点连接 然后删除Node
        node.pre.next = node.next;
        node.next.pre = node.pre;
        moveToTail(node);
        return node.val;//这里是返回节点的值
        

    
    public void put(int key, int value)
          // 直接调用这边的get方法,如果存在,它会在get内部被移动到尾巴,不用再移动一遍,直接修改值即可
        if(get(key)!=-1)
            map.get(key).val = value;
            return;
        
        ListNode node = new ListNode(key, value);
        map.put(key, node);
        moveToTail(node);
        if(map.size() > capacity)
            map.remove(head.next.key);
            head.next = head.next.next;
            head.next.pre = head;

        
        
    
    private void moveToTail(ListNode node)
        //node节点的前一个节点指向了tail.pre节点 就说明node移动到了真正的尾部
        node.pre = tail.pre;
        tail.pre = node;
        node.pre.next= node;
        node.next = tail;
    
    private class ListNode
        int key;
        int val;
        ListNode pre;
        ListNode next;
        public ListNode(int key, int val)
            this.key = key;
            this.val = val;
            pre = null;
            next =null;
        
    

尚硅谷2021逆袭版Java面试题第三季(java大厂面试题,周阳主讲)_哔哩哔哩_bilibili

以上是关于第291天学习打卡(知识点回顾 LRU算法)的主要内容,如果未能解决你的问题,请参考以下文章

第302天学习打卡(知识点回顾 arraylist 和 linkedlist 区别)

第302天学习打卡(知识点回顾 arraylist 和 linkedlist 区别)

第302天学习打卡(知识点回顾 arraylist 和 linkedlist 区别)

第302天学习打卡(知识点回顾 arraylist 和 linkedlist 区别)

第236天学习打卡(知识点回顾 常见的垃圾回收算法)

第244天学习打卡(知识点回顾 索引)