zoukankan      html  css  js  c++  java
  • 1268. 搜索推荐系统

    运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制 。
    实现 LRUCache 类:

    LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
    int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
    void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
     

    示例:

    输入
    ["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
    [[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
    输出
    [null, null, null, 1, null, -1, null, -1, 3, 4]

    解释
    LRUCache lRUCache = new LRUCache(2);
    lRUCache.put(1, 1); // 缓存是 {1=1}
    lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
    lRUCache.get(1); // 返回 1
    lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
    lRUCache.get(2); // 返回 -1 (未找到)
    lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
    lRUCache.get(1); // 返回 -1 (未找到)
    lRUCache.get(3); // 返回 3
    lRUCache.get(4); // 返回 4

    class LRUCache {
    public:
        // 定义双链表
        struct Node{
            int key,value;
            Node* left, *right;
            Node(int _key,int _value): key(_key), value(_value), left(NULL), right(NULL){}
        }*L,*R; // 双链表的最左和最右节点
    
        int n;
        unordered_map<int, Node*>hash;
    
        void remove(Node* p)
        {
            p->right->left = p->left;
            p->left->right = p->right;
        }
        void insert(Node *p)
        {
            p->right = L->right;
            p->left = L;
            L->right->left = p;
            L->right = p;
        }
        LRUCache(int capacity) {
            n = capacity;
            L = new Node(-1,-1);
            R = new Node(-1,-1);
            L->right = R;
            R->left = L;    
        }
        
        int get(int key) {
            if(hash.count(key) == 0){
                return -1; // 不存在关键字key 
            }
            auto p = hash[key];
            remove(p);
            insert(p);// 将当前节点放在双链表的第一位
            return p->value;
        }
        
        void put(int key, int value) {
            if(hash.count(key)) // 如果key存在,则修改对应的value
            {
                auto p = hash[key];
                p->value = value;
                remove(p);
                insert(p);
            }
            else 
            {
                if(hash.size() == n) //如果缓存已满,则删除双链表最右侧的节点
                {
                    auto  p = R->left;
                    remove(p);
                    hash.erase(p->key); //更新哈希表
                    delete p; //释放内存
                }
                //否则,插入(key, value)
                auto p = new Node(key,value);
                hash[key] = p;
                insert(p);
            }
        }
    };
    
    /**
     * 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);
     */
  • 相关阅读:
    消息中间件(一)MQ详解及四大MQ比较
    SIP协议
    PAT (Basic Level) Practice 1008 数组元素循环右移问题
    LeetCode-Algorithms 1. 两数之和
    PAT (Basic Level) Practice 1040 有几个PAT
    PAT (Basic Level) Practice 1023 组个最小数
    PAT (Basic Level) Practice 1021 个位数统计
    PAT (Basic Level) Practice 1007 素数对猜想
    PAT (Basic Level) Practice 1006 换个格式输出整数
    PAT (Basic Level) Practice 1004 成绩排名
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/15186215.html
Copyright © 2011-2022 走看看