实现LFU,3个unordered_map

刷题遇到这个,参考了别人的思路,将不同使用频率的节点放在不同的链表,用一个int记录最低出现频率,使用一个ordered_map记录节点在链表中的位置,在需要淘汰节点时可以以O1的复杂度删除节点,

实现如下:

将key,value,freq封装成结构体,节点保存在堆上,ordered_map只保存指针,淘汰节点后释放内存,

struct Node{
    int key;
    int value;
    int freq;
    Node(int a,int b,int c)
    :key(a),value(b),freq(c){}
};

class LFUCache {
private:
    int vol;
    int minfreq;
    unordered_map<int,Node*> uma;//int means key
    unordered_map<int,list<Node*>> freq_map;//int means freq
    unordered_map<int,list<Node*>::iterator> freq_itor;//int means key
public:
    LFUCache(int capacity)
        :vol(capacity),minfreq(1) {}
    ~LFUCache() {
        for(auto ele:uma)
            delete(ele.second);
    }
    void updateFreq(int curfreq,list<Node*>::iterator itor,Node* ptr)//更新使用频率
    {
        freq_map[curfreq].erase(itor);
        freq_map[curfreq+1].push_front(ptr);
        freq_itor[ptr->key] = freq_map[curfreq+1].begin();
    }

    int get(int key) {
        auto itor = uma.find(key);
        if(itor != uma.end())
        {
            Node* ptr = uma[key];
            int curfreq = ptr->freq++;
            auto ano_itor = freq_itor[key];
           updateFreq(curfreq,ano_itor,ptr);          
            if(freq_map[minfreq].empty())
                minfreq++;
            return ptr->value;
        }
        else
            return -1;
    }    
    void put(int key, int value) {
        auto itor = uma.find(key);
        if(itor != uma.end())// find key
        {
            Node* ptr = uma[key];
            ptr->value = value;
            auto ano_itor = freq_itor[key];
            int curfreq = ptr->freq++;
            updateFreq(curfreq,ano_itor,ptr);
            if(freq_map[minfreq].empty())
                minfreq++;
        }
        else if(vol != 0)//not find key
        {
            if(uma.size() == vol)
            {
                Node* last = freq_map[minfreq].back();
                freq_map[last->freq].pop_back();
                uma.erase(last->key);
                freq_itor.erase(last->key);
                delete(last);//释放内存
            }
            Node* ptr = new Node(key,value,1);
            uma[key] = ptr;
            freq_map[1].push_front(ptr);     
            freq_itor[key] = freq_map[1].begin();   
            minfreq = 1;
        }
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值