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);
     */
  • 相关阅读:
    Google字典API与语音库
    CentOS 6.0 安装字符界面/text 安装/文本安装
    W3C Strict 验证的几个注意事项
    前端开发必备的6个Firefox插件
    自制的一套Aptana配色方案
    Firebug Console 与命令行全集
    项目管理的“三边六拍”!
    不使用第三个变量,交换两变量的值 (总结篇)
    dba学习笔记
    三思涂抹oracle(笔记)
  • 原文地址:https://www.cnblogs.com/USTC-ZCC/p/15186215.html
Copyright © 2011-2022 走看看