class Node
{
public:
int key;
int val;
Node* next;
Node* prev;
Node(int i_key, int i_val)
{
key=i_key;
val=i_val;
}
};
class DoubleList
{
public:
Node* head;
Node* tail;
int size;
DoubleList()
{
head=new Node(0,0);
tail=new Node(0,0);
head->next=tail;
tail->prev=head;
size=0;
}
void AddLast(Node* x)
{
x->prev=tail->prev;
x->next=tail;
tail->prev->next=x;
tail->prev=x;
size++;
}
void Remove(Node* x)
{
x->prev->next=x->next;
x->next->prev=x->prev;
size--;
}
Node* RemoveFirst()
{
if(head->next==tail)
return nullptr;
Node* first=head->next;
Remove(first);
return first;
}
int Size(){return size;}
};
class LRUCache {
public:
unordered_map<int, Node*> map;
DoubleList cache;
int cap;
LRUCache(int capacity) {
cap=capacity;
//map=new unorder_map<int,Node*> ();
//cache=new DoubleList();
}
void MakeRecently(int key)
{
Node* x=map[key];
cache.Remove(x);
cache.AddLast(x);
}
void AddRecently(int key, int val)
{
Node* x=new Node(key,val);
cache.AddLast(x);
map[key]=x;
}
void DeleteKey(int key)
{
Node* x=map[key];
cache.Remove(x);
map.erase(key);
}
void RemoveLeastRecently()
{
Node* deleNode=cache.RemoveFirst();
int deleteKey=deleNode->key;
map.erase(deleteKey);
}
int get(int key)
{
if(map.find(key)==map.end())
return -1;
MakeRecently(key);
return map[key]->val;
}
void put(int key, int value)
{
if(map.find(key)!=map.end())
{
DeleteKey(key);
AddRecently(key,value);
return;
}
if(cap==cache.Size())
{
RemoveLeastRecently();
}
AddRecently(key,value);
}
};
/**
* 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);
*/
LRU算法的实现
最新推荐文章于 2022-11-01 20:26:30 发布