算法 LRU Cache

? LRU  Cache  

 LRU (最近最少使用) 缓存机制

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lru-cache
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

---- java

class LinkedNode {
    int key;
    int value;
    LinkedNode font;
    LinkedNode next;
    LinkedNode(int key, int value){
        this.key = key;
        this.value =value;
    }
}

class LRUCache {
    private int capacity;
    private HashMap<Integer,LinkedNode> map = new HashMap();
    private LinkedNode head;
    private LinkedNode tail;
    public LRUCache(int capacity) {
        this.capacity =capacity;
        head = new LinkedNode(0,0);
        tail = new LinkedNode(0,0);
        head.next = tail;
        tail.font = head;
    }

    public int get(int key) {
        if(map.containsKey(key)){
            LinkedNode node = map.get(key);
            moveHead(node);
            return node.value;
        }else{
            return -1;
        }
    }

    public void put(int key, int value) {
        if(!map.containsKey(key)){
            if(map.size() == this.capacity){
                deleteTailNode();
            }
            LinkedNode curNode = new LinkedNode(key,value);
            LinkedNode temp = head.next;
            head.next = curNode;
            curNode.font= head;
            curNode.next = temp;
            temp.font = curNode;
            map.put(key,curNode);
        }
        else{
            LinkedNode curNode = map.get(key);
            curNode.value = value;
            moveHead(curNode);
        }
    }

    private void  deleteTailNode(){
        LinkedNode curNode = tail.font;
        tail.font = curNode.font;
        curNode.font.next = tail;
        map.remove(curNode.key);
    }

    private void  moveHead(LinkedNode node){
          node.font.next = node.next;
        node.next.font = node.font;
        LinkedNode temp = head.next;
        head.next= node;
        node.font = head;
        node.next =temp;
        temp.font = node;
    }
}

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache obj = new LRUCache(capacity);
 * int param_1 = obj.get(key);
 * obj.put(key,value);
 */
发布了61 篇原创文章 · 获赞 1 · 访问量 672

猜你喜欢

转载自blog.csdn.net/u012842247/article/details/103358657
今日推荐