LRU cache算法实现。
数据结构:hashmap 和 双向链表
#include <iostream>
#include <list>
#include <unordered_map>
//被注释部分是判断大端小端的代码
//union{
// short s;
// char a[sizeof(short)];
//}un;
//
//using namespace std;
//
//int main()
//{
// un.s = 0x0102;
// if (sizeof(short) == 2){
// if (un.a[0] == 1 && un.a[1] == 2)
// cout << "big endian" << endl;
// else if (un.a[0] == 2 && un.a[1] == 1)
// cout << "little endian" << endl;
// }
// return 0;
//}
using namespace std;
struct CacheNode{
int key;
int value;
CacheNode(int k, int val) :key(k), value(val){}
};
class LRUCache{
public:
LRUCache(int capacity) {
size = capacity;
}
int get(int key) {
if (cacheMap.find(key) == cacheMap.end()){
return -1;
}
else{
cacheList.splice(cacheList.begin(), cacheList, cacheMap[key]);
cacheMap[key] = cacheList.begin();
return cacheMap[key]->value;
}
}
void set(int key, int value) {
if (cacheMap.find(key) == cacheMap.end()){
if (cacheList.size() == size){
cacheMap.erase(cacheList.back().key);
cacheList.pop_back();
}
CacheNode node(key, value);
cacheList.push_front(node);
cacheMap[key] = cacheList.begin();
}
else{
cacheMap[key]->value = value;
cacheList.splice(cacheList.begin(), cacheList, cacheMap[key]);
cacheMap[key] = cacheList.begin();
}
}
private:
unordered_map<int, list<CacheNode>::iterator> cacheMap;
list<CacheNode> cacheList;
int size;
};
本文介绍了一种使用哈希表和双向链表实现的LRU(最近最少使用)缓存算法。通过这种方式,可以有效地在O(1)时间内完成获取和设置操作,并保持缓存项的访问顺序。
2049

被折叠的 条评论
为什么被折叠?



