LRU(Least Recnetly Used)最近最少使用
- 淘汰最长时间未被使用的页面
思路:
依次插入A,B,C:
插入A:
先从哈希表中查找到A的value,存储的是该节点的地址;
在双端队列中将该A节点移到末尾
插入D:
取出head指向的节点,取出其中的key为B;
删除head指向的节点,同时在哈希表中删除;
将D插入到末尾
class LRUCache {
public:
LRUCache(int capacity) {
this->capacity = capacity;
}
int get(int key) {
auto it = m.find(key); //unordered_map<int, list<pair<int, int>>::iterator>::iterator it
if(it == m.end())
return -1;
l.splice(l.begin(), l, it->second); //将节点插入到表头
return it->second->second;
}
void put(int key, int value) {
auto it = m.find(key);
if(it != m.end())
l.erase(it->second);
l.push_front(make_pair(key, value));
m[key] = l.begin(); //更新map
if(l.size() > capacity)
{
int k = l.rbegin()->first;
l.pop_back();
m.erase(k);
}
}
private:
int capacity;
list<pair<int, int>> l;
unordered_map<int, list<pair<int, int>>::iterator> m; //Key = key
//Value = iterator
};
/**
* Your LRUCache object will be instantiated and called as such:
* LRUCache* obj = new LRUCache(capacity);
* int param_1 = obj->get(key);
* obj->put(key,value);
*/