设计LRU缓存器
要求:
设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能
set(key, value):将记录(key, value)插入该结构
get(key):返回key对应的value值
[要求]
set和get方法的时间复杂度为O(1)
某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。
当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。
class Lru
{
vector<int> key;//存放键
vector<int> value;//存放值
int len;//设置大小
public:
Lru(int a):len(a)
{
}
void set(int x,int y)//插入元素
{
if(key.size()<len)
{
key.push_back(x);
value.push_back(y);
}
else
{
key.erase(key.begin());
value.erase(value.begin());
key.push_back(x);
value.push_back(y);
}
}
int get(int x)//获取键对应的值,找不到返回-1
{
int i=0;
for(i = 0;i < key.size(); ++i)
if(x == key[i])break;
if(i == key.size())
return -1;
else{
key.push_back(key[i]);
value.push_back(value[i]);
key.erase(key.begin()+i);//指定迭代器
value.erase(value.begin()+i);//指定迭代器
return value.back();
}
}
};
结语:这只是一个比较简易的LRU缓存器,如果数据量非常,用vector作为底层实现数据存储,效率是非常低的,优化可以从两个角度去考虑,1:底层存储数据的容器。2.数据查找的算法。