您的位置:首页 > 其它

LRU Cache算法实现(leetcode)

2016-03-28 20:40 316 查看

题意

实现一个LRU cache类,使得在我们需要获取一个key的值时,如果cache中有,那么直接返回值,否则就返回-1;同时我们还可以设置一个cache的值,这个主要是在我们出现cache miss的时候,我们需要替换其中的项或者需要从主存中载入对应的项。

思路

LRU,最近最少使用,也就说在出现cache满的时候,替换原则就是替换最近最少使用的项。类中必须体现出这个原则,那么我们应该如何来做呢?

首先我们需要一个数据结构来抽象cache结构,用于存储key和value,自然就需要使用map结构,那么是使用红黑树还是hash table呢,其实都可以。这里选择unordered_map

实现

class LRUCache{
public:
LRUCache(int capacity):capacity(capacity) {

}
//获取一个项,直接从map中通过key查找,是否存在这个键,如果没有,
//那么说明cache中没有缓存,直接返回-1.如果找到了,说明cache中有
//这时候还需要完成的工作就是将其在链表中的位置移动到最前端。
int get(int key) {
auto it = caches.find(key);
if(it==caches.end())
return -1;
insert(it);
return it->second.first;
}
//set方法就是处理替换的情况,如果已经满了,那么就需要替换,如果没
//有,直接设置对应的项就可以。
void set(int key, int value) {
auto it = caches.find(key);
if(it!=caches.end())
insert(it);
else {
if (caches.size() == capacity) {
caches.erase(recently_use.back());
recently_use.pop_back();
}
recently_use.push_front(key);
}
caches[key] = { value, recently_use.begin() };
}
private:
list<int> recently_use;
unordered_map<int,pair<int,list<int>::iterator>> caches;
void insert(unordered_map<int,pair<int,list<int>::iterator>>::iterator it){
int key = it->first;
list<int>::iterator used_it = it->second.second;
recently_use.erase(used_it);
recently_use.push_front(key);
it->second.second = recently_use.begin();
}
int capacity;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: