LFU
设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。
get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。
put(key, value) - 如果键不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,最近最少使用的键将被去除。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lfu-cache
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
偷懒链表没有好好写,数组模拟了一下。
class LRUCache {public: int ca,c; const int Begin =0; struct node{ int key,val,pre,nxt; node(int _k,int _v,int _n,int _p):key(_k),val(_v),pre(_p),nxt(_n){}; }; vector<node> list; unordered_map<int,int> H; LRUCache(int capacity){ ca=capacity;c=0; list.push_back(node(-1,-1,0,0)); } void erase(int x){ list[list[x].nxt].pre=list[x].pre; list[list[x].pre].nxt=list[x].nxt; } void add(int _k,int _v,int _n,int _p){ list.push_back(node(_k,_v,_n,_p)); H[_k]=list[_n].pre=list[_p].nxt=list.size()-1; } int get(int key) { if(H.count(key)==0) return -1; else{ int h_k=H[key]; int ret = list[h_k].val; erase(h_k); add(key,list[h_k].val,0,list[0].pre); return ret; } } void put(int key, int value) { if(H.count(key)!=0){ int h_k=H[key]; erase(h_k); add(key,value,0,list[0].pre); } else{ c; if(c>ca){ H.erase(list[list[0].nxt].key); erase(list[0].nxt); --c; add(key,value,0,list[0].pre); } else{ add(key,value,0,list[0].pre); } } }};class LFUCache {public: int ca,c; const int Begin =0; struct node{ int feq,key,val,pre,nxt; node(int _f,int _k,int _v,int _n,int _p):feq(_f),key(_k),val(_v),pre(_p),nxt(_n){}; }; vector<node> list; unordered_map<int,int> H,F; LFUCache(int capacity){ ca=capacity;c=0; list.push_back(node(0,-1,-1,0,0)); } void erase(int x){ if(F[list[x].feq]==x){ if(list[list[x].pre].feq!=list[x].feq)F.erase(list[x].feq); else F[list[x].feq]=list[x].pre; } list[list[x].nxt].pre=list[x].pre; list[list[x].pre].nxt=list[x].nxt; } void add(int _f,int _k,int _v,int _n,int _p){ list.push_back(node(_f,_k,_v,_n,_p)); F[_f]=H[_k]=list[_n].pre=list[_p].nxt=list.size()-1; } int get(int key) { if(H.count(key)==0) return -1; else{ int h_k=H[key]; int ret = list[h_k].val; int _f=list[h_k].feq 1; if(F.count(_f)) add(_f,key,list[h_k].val,list[F[_f]].nxt,F[_f]); else{ add(_f,key,list[h_k].val,list[F[_f-1]].nxt,F[_f-1]); } erase(h_k); return ret; } } void put(int key, int value) { if(ca==0) return; if(H.count(key)!=0){ get(key); list[H[key]].val=value; } else{ c; if(c>ca){ if(list[0].nxt!=0)H.erase(list[list[0].nxt].key); --c; erase(list[0].nxt); if(F.count(1)) add(1,key,value,list[F[1]].nxt,F[1]); else{ add(1,key,value,list[0].nxt,0); } } else{ if(F.count(1)) add(1,key,value,list[F[1]].nxt,F[1]); else{ add(1,key,value,list[0].nxt,0); } } } }};
来源:https://www.icode9.com/content-4-541451.html
联系客服