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

  • 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;
    }
}

最近更新

  1. TCP协议是安全的吗?

    2023-12-22 10:00:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-22 10:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-22 10:00:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-22 10:00:04       20 阅读

热门阅读

  1. 2866. 美丽塔 II(单调栈)

    2023-12-22 10:00:04       48 阅读
  2. 技术面试的斗智斗勇III

    2023-12-22 10:00:04       43 阅读
  3. Lua脚本在Redis中的高效应用

    2023-12-22 10:00:04       51 阅读
  4. LeetCode day29

    2023-12-22 10:00:04       55 阅读
  5. 基于OpenCV的视频流处理方法

    2023-12-22 10:00:04       41 阅读
  6. vue和react diff的详解和不同

    2023-12-22 10:00:04       50 阅读
  7. 前端八股文(vue篇)

    2023-12-22 10:00:04       42 阅读
  8. HTML中的6种空格标记

    2023-12-22 10:00:04       43 阅读