LRU Cache 最近最少使用缓存的设计
2014-01-19 19:50
344 查看
class LRUCache{
public:
LRUCache(int capacity) {
cap=capacity;
head=new ListNode(0,0);
tail=new ListNode(0,0);
head->left=NULL;
head->right=tail;
tail->right=NULL;
tail->left=head;
}
int get(int key) {
int value;
Data::iterator iter=datas.find(key);
if(iter!=datas.end())
{
value=iter->second->value;
if(datas.size()==1)
{
return value;
}
else
{
DeleteNode(iter->second);
InsertNode(iter->second);
return value;
}
}
else
{
return -1;
}
}
void set(int key, int value) {
Data::iterator iter=datas.find(key);
if(iter!=datas.end())
{
iter->second->value=value;
DeleteNode(iter->second);
InsertNode(iter->second);
return;
}
if(datas.size()<cap)
{
ListNode *newnode=new ListNode(key,value);
InsertNode(newnode);
datas[key]=newnode;
}
else
{
ListNode *node=head->right;
DeleteNode(node);
InsertNode(node);
datas.erase(node->key);
datas[key]=node;
node->key=key;
node->value=value;
}
}
~LRUCache()
{
ListNode *next;
while(head)
{
next=head->right;
delete head;
head=next;
}
}
private:
struct ListNode
{
int key;
int value;
ListNode *left;
ListNode *right;
ListNode(int k,int v):key(k),value(v),left(NULL),right(NULL){}
};
typedef map<int,ListNode*> Data;
Data datas;
ListNode *head,*tail;
int cap;
void DeleteNode(ListNode *node)
{
node->left->right=node->right;
node->right->left=node->left;
}
void InsertNode(ListNode *node)
{
ListNode *last=tail->left;
last->right=node;
node->left=last;
node->right=tail;
tail->left=node;
}
};
public:
LRUCache(int capacity) {
cap=capacity;
head=new ListNode(0,0);
tail=new ListNode(0,0);
head->left=NULL;
head->right=tail;
tail->right=NULL;
tail->left=head;
}
int get(int key) {
int value;
Data::iterator iter=datas.find(key);
if(iter!=datas.end())
{
value=iter->second->value;
if(datas.size()==1)
{
return value;
}
else
{
DeleteNode(iter->second);
InsertNode(iter->second);
return value;
}
}
else
{
return -1;
}
}
void set(int key, int value) {
Data::iterator iter=datas.find(key);
if(iter!=datas.end())
{
iter->second->value=value;
DeleteNode(iter->second);
InsertNode(iter->second);
return;
}
if(datas.size()<cap)
{
ListNode *newnode=new ListNode(key,value);
InsertNode(newnode);
datas[key]=newnode;
}
else
{
ListNode *node=head->right;
DeleteNode(node);
InsertNode(node);
datas.erase(node->key);
datas[key]=node;
node->key=key;
node->value=value;
}
}
~LRUCache()
{
ListNode *next;
while(head)
{
next=head->right;
delete head;
head=next;
}
}
private:
struct ListNode
{
int key;
int value;
ListNode *left;
ListNode *right;
ListNode(int k,int v):key(k),value(v),left(NULL),right(NULL){}
};
typedef map<int,ListNode*> Data;
Data datas;
ListNode *head,*tail;
int cap;
void DeleteNode(ListNode *node)
{
node->left->right=node->right;
node->right->left=node->left;
}
void InsertNode(ListNode *node)
{
ListNode *last=tail->left;
last->right=node;
node->left=last;
node->right=tail;
tail->left=node;
}
};
相关文章推荐
- LeetCode: LRU Cache 最近最少使用算法 缓存设计
- [Leetcode-146] LRU Cache 最近最少使用页面置换算法
- LeetCode OJ:LRU Cache(最近使用缓存)
- Java实现LRU(最近最少使用)缓存
- leetcode LRU Cache(高级缓存的最近最少使用算法实现)
- Java实现LRU(最近最少使用)缓存
- Java实现LRU(最近最少使用)缓存
- Java--缓存热点数据,最近最少使用算法
- 缓存淘汰算法--LRU算法【最近最少使用算法LRU置换策略适用于热点数据比较多的场景】
- Java实现LRU(最近最少使用)缓存
- 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
- LeetCode题解: LRU Cache 缓存设计
- 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
- 晦涩的翻译LRU (Least Recently Used) - 最近最少使用?
- 使用读写锁设计缓存系统
- 如何高效使用和管理Bitmap--图片缓存管理模块的设计与实现
- 面试题:实现LRUCache::Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法
- 自适应Lru(最近最少使用)算法
- 【设计优化】-使用缓存(Cache)提高程序性能
- 线程中如何创建锁和使用锁 Lock,设计一个缓存系统