hash:存储的key、value、freq
freq:存储的freq、key,也就是说出现1次的所有key在一起,用list连接
class LFUCache { public: LFUCache(int capacity) { cap = capacity; } int get(int key) { auto it = hash.find(key); if(it == hash.end()) ; 这段代码以下处理的都是已有key的情况 freq[hash[key].second].erase(iter[key]); 如果这个key已经有了,那次数就要加1。所以必须把freq里面的对应次数的key先删除,然后更新hash里key对应的次数, ++hash[key].second; 同时在freq中将这个key连接次数加1的地方 freq[hash[key].second].push_back(key); iter[key] = --freq[hash[key].second].end(); 因为这个key在freq中变换了位置,那对应的迭代器地址也应该改变,是push_back进去的,所以尾地址-1就好了 ) 代码走到这一步,一定是有key存在的。如果min_freq没有了值,证明就是 ++min_freq; return hash[key].first; } void put(int key, int value) { ) return; ){ 注意调用的是 get(key),不是find hash[key].first = value; 如果这个key已经存在,就不用考虑容量的问题,直接更新value就好了,因为不用新添加 return; } if(hash.size() >= cap){ hash.erase(freq[min_freq].front()); 删除出现次数最少的中最久未出现的,list中越新出现的从后push进去 iter.erase(freq[min_freq].front()); 为什么要删除迭代器??? freq[min_freq].pop_front(); } hash[key] = {value,}; 对出现一次的key进行添加 freq[].push_back(key); iter[key] = --freq[].end(); min_freq = ; } int cap,min_freq; unordered_map<int,pair<int,int>> hash; <key,pair<value,freq>> unordered_map<int,list<int>> freq; <freq,list<key>> unordered_map<int,list<int>::iterator> iter; <freq,list<key>::iterator> };
https://www.cnblogs.com/grandyang/p/6258459.html