算法通关村-LRU算法的实现

本文介绍了LRU算法,一种在内存满时用于淘汰最久未使用的数据的策略。通过HashMap和双向链表实现,具有O(1)的时间复杂度。展示了如何在Java中实现LRU缓存,以及其在实际中的应用示例。
摘要由CSDN通过智能技术生成

什么是LRU算法?

LRU:Least Recently Used的缩写,即最近最少使用。LRU算法是内存淘汰场景下使用的一个算法,当内存满了,不得已删除某些数据时,然后选择最久时间没使用的数据进行删除。

实现方式:

实现LRU算法可以通过HashMap+双向链表的方式来实现,整个过程都是O(1)的时间复杂度,效率很高。

代码:

public class LRUCache {
    //定义双向链表节点类
    class DLinkNode{
        int key;
        int value;
        DLinkNode prev;
        DLinkNode next;

        public DLinkNode(){
        }

        public DLinkNode(int key,int value){
            this.key=key;
            this.value=value;
        }
    }

    private Map<Integer,DLinkNode> cacheMap = new HashMap<Integer,DLinkNode>();
    private int size;
    private int capacity;
    private DLinkNode head, tail;

    public LRUCache(int capacity) {
        this.size = 0;
        this.capacity=capacity;
        //使用伪头部和伪尾部节点
        head=new DLinkNode();
        tail=new DLinkNode();
        head.next=tail;
        tail.prev=head;
    }

    public int get(int key){
        DLinkNode node = cacheMap.get(key);
        if (node==null){
            return -1;
        }
        moveToHead(node);
        return node.value;
    }

    public void put(int key,int value){
        DLinkNode node = cacheMap.get(key);
        if (node==null){
            DLinkNode newNode = new DLinkNode(key,value);
            cacheMap.put(key,newNode);
            addToHead(newNode);
            size++;
            if (size>capacity){
                DLinkNode taliNode = removeTail();
                cacheMap.remove(taliNode.key);
                size--;
            }
        }else {
            node.value=value;
            moveToHead(node);
        }
    }


    public void moveToHead(DLinkNode node){
        //删除原节点
        removeNode(node);
        //连接到头部
        addToHead(node);
    }

    public void removeNode(DLinkNode node){
        node.prev.next=node.next;
        node.next.prev=node.prev;
    }

    public void addToHead(DLinkNode node){
        node.prev=head;
        node.next=head.next;
        head.next.prev=node;
        head.next=node;
    }

    public DLinkNode removeTail(){
        DLinkNode res = tail.prev;
        removeNode(res);
        return res;
    }
}

代码测试:

 public static void main(String[] args) {
        //定义容量大小为2
        LRUCache lruCache = new LRUCache(2);
        lruCache.put(1,1);//现在存储的顺序为{1=1}
        lruCache.put(2,2);//现在存储的顺序为{2=2,1=1}
        System.out.println(lruCache.get(1));//现在存储的顺序为{1=1,2=2}
        lruCache.put(3,3);//现在存储的顺序为{3=3,1=1}
        System.out.println(lruCache.get(2));//2已经不存在,返回-1
        lruCache.put(4,4);//现在存储的顺序为{4=4,3=3}
        System.out.println(lruCache.get(1));//1已经不存在,返回-1
        System.out.println(lruCache.get(3));
        System.out.println(lruCache.get(4));

    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值