java编写LRU算法

Posted 本站大佬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java编写LRU算法相关的知识,希望对你有一定的参考价值。

LRU是什么,如何实现?
最近最少使用策略LRU(Least Recently Used)是一种缓存淘汰算法,是一种缓存淘汰机制。
使用双向链表实现的队列,队列的最大容量为缓存的大小。在使用过程中,把最近使用的页面移动到队列头,最近没有使用的页面将被放在队列尾的位置。
使用一个hashmap,把页号作为键,把缓存在队列中的节点的地址作为值,只需要把这个页对应的节点移动到队列前面,如果需要的页面在内存中,此时需要把这个页面加载到内存中,简单来说,就是将一个新节点添加到队列前面,并在hashmap中更新相应的节点地址,如果队列是满的,那么就从队尾移除一个节点,并将新节点添加到队列的前面。

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

public class MyLRU 
//    头节点,尾节点
    Entry head,tail;
//    链表当前长度
    int size;
//    hashmap容量
    int capacity;
    Map<Integer,Entry> cache;
    public MyLRU(int capacity)
//        获取到容量
        this.capacity = capacity;
//        初始化链表
        initLinkedList();
//        链表起始长度为0
        size = 0;
//        定义hashmap
        cache = new HashMap<Integer,Entry>(this.capacity);
    

//    Map put
    public void put(int key,int value)
        Entry node = cache.get(key);
        if (node != null)
            node.value = value;
            moveEntryToHead(node);
        
        if (size == capacity)
            Entry tailnode = tail.pre;
            deleteTailEntry(tailnode);
            cache.remove(tailnode.key);
            size--;
        
        Entry newnode = new Entry(key,value);
        cache.put(key,newnode);
        addHeadEntry(newnode);
        size++;
    

//    Map get
    public Entry get(int key)
        Entry node = cache.get(key);
        if (node != null)
            moveEntryToHead(node);
            return node;
        
        Entry entry = new Entry();
        System.out.println(entry.key);
        System.out.println(entry.value);
        return entry;
    
//    访问到节点后的操作
    public void moveEntryToHead(Entry node)
        deleteTailEntry(node);
        addHeadEntry(node);
    

//    删除链表尾部节点
    public void deleteTailEntry(Entry node)
        node.pre.next = tail;
        tail.pre = node.pre;
    

//    添加链表头部节点
    public void addHeadEntry(Entry node)
        head.next.pre = node;
        node.next = head.next;
        node.pre = head;
        head.next = node;
    

//    创建链表
    public void initLinkedList()
        head = new Entry();
        tail = new Entry();
        head.next = tail;
        tail.pre = head;
    

//    节点
    public static class Entry
        public Entry pre;
        public Entry next;
        public int key;
        public int value;

        public Entry() 
        

        public Entry(int key, int value) 
            this.key = key;
            this.value = value;
        
    

    public static void main(String[] args) 

        MyLRU cache = new MyLRU(2);

        cache.put(1, 1);
        cache.put(2, 2); // 21
        System.out.println(cache.get(1).value); // 12
        cache.put(3, 3); // 31
        System.out.println(cache.get(2).value);

    


以上是关于java编写LRU算法的主要内容,如果未能解决你的问题,请参考以下文章

如何实现一个LRU算法?

LRU 缓存淘汰算法

LRU算法

Goland 实现LRU算法

缓存淘汰策略之LRU

面试题LRU算法及编码实现LRU策略缓存