为最近最少使用(LRU)缓存策略设计一个数据结构,它应该支持以下操作:获取数据和写入数据。 get(key) 获取数据:如果缓存中存在key
思路:最新数据放在链表头部,超过大小,删除尾部数据。
struct Node
{
Node()
{
key = -1;
value = 0;
next = nullptr;
pre = nullptr;//方便删除
}
int value;
int key;
Node* next;
Node* pre;
};
class LRUCache {
public:
/*
* @param capacity: An integer
*/LRUCache(int capacity)
{
// do intialization if necessary
size_ = capacity;
head_ = nullptr;
tail_ = nullptr;
}
/*
* @param key: An integer
* @return: An integer
*/
int get(int key) {
// write your code here
auto it = cacheMap_.find(key);
if (it != cacheMap_.end())
{
moveNodeToHead(it->first);
return it->second->value;
}
return -1;
}
/*
* @param key: An integer
* @param value: An integer
* @return: nothing
*/
void set(int key, int value) {
// write your code here
auto it = cacheMap_.find(key);
if (it != cacheMap_.end())
{
it->second->value = value;
moveNodeToHead(key);
}
else
{
if (cacheMap_.size() == size_)
{
deleteTail();
}
if (cacheMap_.size() == 0)
{
Node*cur = new Node();
cur->value = value;
cur->key = key;
head_ = cur;
tail_ = cur;
cacheMap_[key] = cur;
return;
}
Node*cur = new Node();
cur->value = value;
cur->key = key;
//insert head
cur->next = head_;
head_->pre = cur;
head_ = cur;
cacheMap_[key] = cur;
}
}
void moveNodeToHead(int key)
{
std::unordered_map<int, Node*> ::iterator it = cacheMap_.find(key);
Node* cur = it->second;
if (head_ == cur)//head
{
return;
}
if (tail_ == cur) //tail
{
tail_ = cur->pre;
tail_->next = nullptr;
cur->next = head_;
head_->pre = cur;
cur->pre = nullptr;
head_ = cur;
return;
}
// mid
cur->pre->next = cur->next;
cur->next->pre = cur->pre;
cur->next = head_;
head_->pre = cur;
cur->pre = nullptr;
head_ = cur;
}
void deleteTail()
{
int key = -1;
if (nullptr == tail_)
{
return;
}
Node* cur = tail_;
if ( tail_ == head_) //only one node
{
key = cur->key;
cacheMap_.erase(key);
delete cur;
head_ = nullptr;
tail_ = nullptr;
return;
}
tail_ = cur->pre;
key = cur->key;
tail_->next = nullptr;
cacheMap_.erase(key);
delete cur;
cur = nullptr;
}
private:
std::unordered_map<int, Node*>cacheMap_;
Node* head_;
Node* tail_;
int size_;
};
void test()
{
LRUCache cache(2);
cache.set(2,1);
cache.set(1, 1);
int a = cache.get(2);
cache.set(4, 1);
int b = cache.get(1);
b = cache.get(2);
/*LRUCache cache(1);
cache.set(2, 1);
int a = cache.get(2);
cache.set(3, 2);
int b = cache.get(2);
b = cache.get(3);*/
}
int main()
{
test();
getchar();
return 0;
}