LRU
#include
#include
#include
struct Node{
int key;
int value;
Node(int key, int value):key(key),value(value){}
};
class LruCache{
private:
int maxCapacity;
std::list<Node>CacheList;
std::unordered_map<int, std::list<Node>::iterator>mp;
public:
LruCache(int cap):maxCapacity(cap){}
int get(int key){
if(mp.find(key) == mp.end()){
return -1;
}
auto cur = mp[key];
CacheList.splice(CacheList.begin(), CacheList, cur);
return cur->value;
}
void put(int key, int value){
if(mp.find(key) != mp.end()){
auto cur = mp[key];
cur->value = value;
CacheList.splice(CacheList.begin(), CacheList, cur);
return;
}
if(CacheList.size() == maxCapacity){
auto last = CacheList.back();
mp.erase(last.key);
CacheList.pop_back();
}
CacheList.insert(CacheList.begin(), Node(key, value));
mp[key] = CacheList.begin();
}
};
int main(){
LruCache cache(3);
cache.put(1, 1);
cache.put(2, 2);
std::cout << cache.get(1) << std::endl;
cache.put(3, 3);
std::cout << cache.get(2) << std::endl;
cache.put(4, 4);
std::cout << cache.get(1) << std::endl;
std::cout << cache.get(3) << std::endl;
std::cout << cache.get(4) << std::endl;
std::getchar();
return 0;
}
LFU
#include
#include
#include
#include
#include
struct CacheNode{
int key;
int value;
int freq;
CacheNode() = default;
CacheNode(int key, int value, int freq):key(key),value(value),freq(freq){}
bool operator < (const CacheNode& other)const{
return this->freq > other.freq;
}
};
class LfuCache{
public:
int maxCapacity;
std::unordered_map<int, CacheNode>keymap;
std::unordered_map<int, std::vector<CacheNode>>freqmap;
std::priority_queue<CacheNode, std::vector<CacheNode>>minheap;
public:
LfuCache(int cap):maxCapacity(cap){}
int get(int key){
if(keymap.find(key) == keymap.end()){
return -1;
}
auto cur = keymap[key];
updateFreq(cur);
return cur.value;
}
void put(int key, int value){
if(keymap.find(key) != keymap.end()){
auto cur = keymap[key];
cur.value = value;
updateFreq(cur);
return ;
}
if(keymap.size() == maxCapacity){
CacheNode node = minheap.top();
minheap.pop();
freqmap[node.freq].erase(std::remove_if(freqmap[node.freq].end(),freqmap[node.freq].end(),
[&](const CacheNode cur){return cur.key == node.key;}),freqmap[node.freq].end());
keymap.erase(node.key);
}
CacheNode node(key, value, 1);
keymap[key] = node;
minheap.push(node);
freqmap[1].push_back(node);
}
void updateFreq(CacheNode node) {
freqmap[node.freq].erase(std::remove_if(freqmap[node.freq].end(),freqmap[node.freq].end(),
[&](const CacheNode cur){return cur.key == node.key;}),freqmap[node.freq].end());
++node.freq;
freqmap[node.freq].push_back(node);
std::priority_queue<CacheNode, std::vector<CacheNode>>tmp;
while(!minheap.empty()){
auto cur = minheap.top();
minheap.pop();
if(cur.key != node.key){
tmp.push(cur);
}
}
minheap.swap(tmp);
minheap.push(node);
}
};
int main(){
LfuCache cache(3);
std::cout<<cache.get(1)<<std::endl;
cache.put(1,1);
cache.put(2,2);
cache.put(3,3);
cache.get(1);
cache.get(2);
cache.put(4,4);
std::cout<<cache.minheap.size()<<std::endl;
while(!cache.minheap.empty()){
auto cur = cache.minheap.top();
cache.minheap.pop();
std::cout<<cur.key<<cur.value<<cur.freq<<std::endl;
}
std::getchar();
};