《漫画算法》笔记——内存管理算法LRU

2023-12-21 22:52:23
  • LRU,least recently used,最近最少使用
  • 它假设:最近不常使用的数据,在未来被用到的可能性也不大。
    所以,当内存达到一定阈值时,要从哈希表中移除最近最少被使用的数据。
  • 实现
    主要基于哈希链表这种数据结构实现。哈希链表可以看作是 哈希表+双向链表。在哈希表中每个键值对与其他键值对并不相关联,但是在哈希链表中每个键值对可以看作一个链表中的节点,两个节点之间存在着前向指针和后向指针。
  • 代码
import java.util.HashMap;

public class LRU2 {

    Node head;
    Node end;
    HashMap<String,Node> hashMap;
    int limit;

    public LRU2(int capa){
        limit=capa;
        hashMap=new HashMap<>();
    }

    public void put(String key,String value){
        Node node=hashMap.get(key);
        if(node==null){
            if(hashMap.size()>=limit){
                removeNode(head); // ?? wht is the differnce bwt head.key and String oldKey returned from this func
                hashMap.remove(head.key);// ?? right
            }
            node=new Node(key,value);
            addNode(node);
            hashMap.put(key,node);
        }else{
            node.value=value;
            refreshNode(node);
        }


    }


    public String get(String key){
        Node node=hashMap.get(key);
        if(node==null){
            return null;
        }
        refreshNode(node);
        return node.value;
    }

    public void remove(String key){
        Node node=hashMap.get(key);
        removeNode(node);
        hashMap.remove(node.key);
    }
    private String removeNode(Node node){
        if(head==node&&end==node){
            head=null;
            end=null;
        } else if (head==node) {
            head=head.next;
            head.pre=null;
        } else if (end==node) {
            end=end.pre;
            end.next=null;
        }else{
            node.pre.next=node.next;
            node.next.pre=node.pre;
        }
        return node.key;
    }


    private void addNode(Node node){
        if(head==null&&end==null){
            head=node;
            end=node;
        } else{//!! why not try it this way
            end.next=node;
            node.pre=end;
            end=node;
        }
    }

    private void refreshNode(Node node){
        if(end==node){
            return;
        }
        removeNode(node);
        addNode(node);
    }

    public static void main(String[] args) {
        LRU2 lru2=new LRU2(5);
        lru2.put("001","User 1 info");
        lru2.put("002","User 2 info");
        lru2.put("003","User 3 info");
        lru2.put("004","User 4 info");
        lru2.remove("001");
        System.out.println(lru2.get("001"));
    }

}

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

文章来源:https://blog.csdn.net/qq_43448491/article/details/135140296
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。