面试题 16.25. LRU 缓存

Posted 不吐西瓜籽

tags:

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

算法记录

LeetCode 题目:

  设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目



说明

一、题目

  设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目

二、分析

  • 题目涉及一个 hash 的设计, 其余的步骤全靠编码能力.
  • 这里使用 hash 存储链表的节点形式来加快对链表元素的遍历.
class Node {
    int key;
    int value;
    Node pre;
    Node next;
    public Node(int key, int value) {
        this.next = null;
        this.pre = null;
        this.key = key;
        this.value = value;
    }
}

class LRUCache {
    Node head;
    Node tail;
    Integer size;
    Map<Integer,Node> map;

    public LRUCache(int capacity) {
        this.size = capacity;
        this.head = new Node(-1, -1);
        this.tail = new Node(-1, -1);
        head.next = tail;
        tail.pre = head;
        map = new HashMap();
    }
    
    public int get(int key) {
        if(!map.containsKey(key))
            return -1;
        put(key, map.get(key).value);
        return map.get(key).value;
    }
    
    public void put(int key, int value) {
        Node node = null;
        if(!map.containsKey(key)) {
            node = new Node(key, value);
            map.put(key, node);
            if(map.size() > size) {
                Node temp = head.next;
                temp.next.pre = temp.pre;
                temp.pre.next = temp.next;
                map.remove(temp.key);
            }
        } else {
            node = map.get(key);
            node.pre.next = node.next;
            node.next.pre = node.pre;
            map.get(key).value = value;
        }
        offer(node);
    }

    private void offer(Node node) {
        node.pre = tail.pre;
        node.next = tail;
        tail.pre.next = node;
        tail.pre = 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);
 */

总结

熟悉 hash 表的使用。

以上是关于面试题 16.25. LRU 缓存的主要内容,如果未能解决你的问题,请参考以下文章

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

JavaScript算法题实现-146-LRU缓存机制——腾讯面试题库

程序员代码面试指南第二版 156.设计LRU缓存结构

算法进阶面试题05——树形dp解决步骤返回最大搜索二叉子树的大小二叉树最远两节点的距离晚会最大活跃度手撕缓存结构LRU

面试挂在了 LRU 缓存算法设计上

最强解析面试题:Goland 实现LRU算法