LRU(Least Recently Used Algorithm)
LRU算法的高效执行(插入、查找、删除)。
插入、删除(链表)
查找(哈希表)
因此采用哈希表和链表相结合的方式实现LRU算法。
#include<iostream>
#include<unordered_map>//包含include<list>
using namespace std;
class cacheLRU
{
private:
struct Node
{
int key;
int val;
Node(int k,int v):key(k),val(v){}
};
int capacity;//容量
list<Node> cacheList;
unordered_map<int,list<Node>::iterator> cacheMap;
public:
cacheLRU(int a):capacity(a){}
int get(int key)
{
if(cacheMap.find(key)==cacheMap.end())
{
return -1;
}
cacheList.splice(cacheList.begin(),cacheList,cacheMap[key]);
cacheMap[key]=cacheList.begin();
return cacheMap[key]->val;
}
void set(int key,int val)
{
if(cacheMap.find(key)==cacheMap.end())//不存在
{
//检查空间
if(cachList.size()==capacity)
{
cacheMap.erase(cacheList.back().key);
cacheList.pop_back();
}
cacheList.push_front(Node(key,val));
cacheMap[key]=cacheList.begin();
}
else
{
cacheMap[key]->val=val;
cacheLsit.splice(cacheList.begin(),cacheList,cacheMap[key]);
cacheMap[key]=cacheList.begin();
}
}
};