/** * Your LFUCache object will be instantiated and called as such: * LFUCache* obj = new LFUCache(capacity); * int param_1 = obj->get(key); * obj->put(key,value); */
structNode{ int key, value, freq; Node(int _key, int _value, int _freq):key(_key),value(_value),freq(_freq){} };
classLFUCache { int minfreq, capacity; unordered_map<int, list<Node>> freq_table; unordered_map<int, list<Node>::iterator> key_table; public: LFUCache(int _capacity) { capacity = _capacity; minfreq = 0; freq_table.clear(); key_table.clear(); } intget(int key){ if (capacity == 0) return-1; auto it = key_table.find(key); if (it == key_table.end()) return-1; list<Node>::iterator node = it->second; int freq = node->freq; int value = node->value; //需要更新频率 freq_table[freq].erase(node); if (freq_table[freq].size() == 0){ freq_table.erase(freq); if (freq == minfreq) minfreq += 1; } freq_table[freq+1].push_front(Node(key, value, freq+1)); key_table[key] = freq_table[freq+1].begin(); return value; } voidput(int key, int value){ if (capacity == 0) return ; auto it = key_table.find(key); // 未找到相同元素,新增 if (it == key_table.end()){ // 存储已满,需要剔除频次最小,时间最久的一个元素 if (key_table.size() == capacity){ // back返回的是最后一个元素的引用 auto it2 = freq_table[minfreq].back(); key_table.erase(it2.key); freq_table[minfreq].pop_back(); if (freq_table[minfreq].size() == 0){ freq_table.erase(minfreq); } } freq_table[1].push_front(Node(key, value, 1)); key_table[key] = freq_table[1].begin(); minfreq = 1; }else{ //更新 // iterator相当于指针,也表示内存地址,*node则为一个Node对象。访问对象成员变量用, 指针访问变量用-> list<Node>::iterator node = it->second; int freq = node->freq; freq_table[freq].erase(node); if (freq_table[freq].size() == 0){ freq_table.erase(freq); if (freq == minfreq) minfreq+=1; } freq_table[freq+1].push_front(Node(key, value, freq+1)); key_table[key] = freq_table[freq+1].begin(); }
} };
/** * Your LFUCache object will be instantiated and called as such: * LFUCache* obj = new LFUCache(capacity); * int param_1 = obj->get(key); * obj->put(key,value); */