题解 | #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;
}
};
