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);
 */
posted @ 2020-11-23 02:06  hh13579  阅读(191)  评论(0编辑  收藏  举报