题解 | #LFU缓存结构设计#

LFU缓存结构设计

http://www.nowcoder.com/practice/93aacb4a887b46d897b00823f30bfea1

c++ 哈希+二叉树
随手记录,写的比较粗糙,有问题欢迎指正!

// NC94_LFU缓存结构设计,根据力扣题解写的,
struct node{
    int cnt,time,key,value;//cnt:使用次数 time:时间戳,用数字表示 

    node(int mcnt,int mtime,int mkey,int mvalue):cnt(mcnt),time(mtime),key(mkey),value(mvalue){}

    bool operator <(const node&tmp)const{
        return cnt==tmp.cnt ? time<tmp.time: cnt<tmp.cnt;//建立排序规则
    }
};


class Solution {
public:
    /**
     * lfu design
     * @param operators int整型vector<vector<>> ops
     * @param k int整型 the k
     * @return int整型vector
     */
    vector<int> LFU(vector<vector<int> >& operators, int k) {    
        // write code here
        int len=operators.size();
        if(len==0) return {};
        int time=0;
        unordered_map<int,node>keyt;
        set<node>s;
        keyt.clear();
        s.clear();
        vector<int>ret;
        for(int i=0;i<len;++i){
            //如果是插入操作
            if(operators[i][0]==1){
                // 先看是否在其中
                auto it=keyt.find(operators[i][1]);
                //如果不在其中就新建一个插入
                if(it == keyt.end()){
                    //如果是满了,先删除
                    if(keyt.size()==k){
                        keyt.erase(s.begin()->key);//哈希表也删除
                        s.erase(s.begin());//第一个永远是最不满足条件的,删除二叉树中第一个
                    }
                    //没满,直接插入
                    ++time;//时间戳
                    node tmpnode=node(1,time,operators[i][1],operators[i][2]);
                    keyt.insert(make_pair(operators[i][1],tmpnode));
                    s.insert(tmpnode);    
                }else{
                    // 如果在其中,更新时间和使用频率以及value

                    auto tmpnode=it->second;//tmpnode:临时
                    s.erase(tmpnode);//删除旧记录
                    ++time;//更新时间戳
                    tmpnode.time=time;
                    tmpnode.cnt+=1;//使用频率加1
                    tmpnode.value=operators[i][2];
                    s.insert(tmpnode);
                    //keyt[operators[i][1]]=tmpnode;
                    it->second=tmpnode;
                }    

            }else{// 如果是查询操作
                auto it=keyt.find(operators[i][1]);
                //如果不在其中
                if(it == keyt.end()){
                    ret.push_back(-1);
                    continue;
                }
                //如果在其中,删除s中的旧节点,更新时间和使用频率,再存进哈希map
                auto tmpnode=it->second;//tmpnode:临时
                s.erase(tmpnode);
                time++;//更新时间戳
                tmpnode.time=time;
                tmpnode.cnt+=1;//使用频率加1
                s.insert(tmpnode);
                //keyt[operators[i][1]]=tmpnode;    
                it->second=tmpnode;
                ret.push_back(tmpnode.value);
            }
        }
        return ret;
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务