zoukankan      html  css  js  c++  java
  • LFU

    struct node{
        int cnt;//使用的次数
        int time;//最近使用的时间
        int key;
        int value;
        node(int _cnt,int _time,int _key,int _value):cnt(_cnt),time(_time),key(_key),value(_value){}
        bool operator < (const node &x)const{
            return cnt == x.cnt ? time < x.time : cnt < x.cnt;
        }
    };
    class LFUCache {
    public:
    int capacity;
    int time;
    unordered_map<int,node>key_map;
    set<node>s;
        LFUCache(int _capacity) {
            capacity = _capacity;
            time = 0;
            s.clear();
            key_map.clear();
        }
        
        int get(int key) {
            if(capacity == 0)
                return -1;
            auto it = key_map.find(key);
            if(it == key_map.end())
                return -1;
            node temp = it -> second;
            s.erase(temp);
            temp.cnt++;
            temp.time = ++time;
            s.insert(temp);
            it -> second = temp;
            // key_map[key] = temp;
            return temp.value;
        }
        
        void put(int key, int value) {
            if(capacity == 0)
                return;
            auto it = key_map.find(key);
            if(it == key_map.end())//没有
            {
                if(s.size() == capacity)//满了
                {
                    auto temp = s.begin();
                    key_map.erase(s.begin()->key);
                    s.erase(s.begin());
                }
                node temp = node(1,++time,key,value);
                s.insert(temp);
                key_map.insert(make_pair(key,temp));
            }
            else
            {
                node temp = it -> second;
                s.erase(temp);
                temp.cnt++;
                temp.time = ++time;
                temp.value = value;
                s.insert(temp);
                // key_map[key] = temp;
                it -> second = temp;
            }
        }
    };
    
    /**
     * Your LFUCache object will be instantiated and called as such:
     * LFUCache* obj = new LFUCache(capacity);
     * int param_1 = obj->get(key);
     * obj->put(key,value);
     */
    
  • 相关阅读:
    导出数据到Excel
    VB中导入数据到Excel内容换行
    上传附件导入,确认弹框取消后,无法上传附件
    扫描审核,出错声音报警
    C语言中,隐藏结构体的细节
    C语言 符号的不同意义
    IAR 和 keil 使用外部 SDRAM 的区别
    C语言 ringBuffer 实现
    C语言 malloc 内存泄漏
    STM32 硬件CRC和软件CRC速度比较
  • 原文地址:https://www.cnblogs.com/hh13579/p/14022574.html
Copyright © 2011-2022 走看看