#include <iostream>
#include <unordered_map>
using namespace std;
// 双向链表节点
struct DLinkedNode {
int key, val;
DLinkedNode* pre;
DLinkedNode* next;
DLinkedNode() : key(0), val(0), pre(nullptr), next(nullptr) {}
DLinkedNode(int _key,int _val) : key(_key), val(_val), pre(nullptr), next(nullptr) {}
};
class LRUCache {
unordered_map<int, DLinkedNode*> cache;
DLinkedNode* head;
DLinkedNode* tail;
int size;
int capacity;
public:
LRUCache(int capacity):capacity(capacity),size(0){
head = new DLinkedNode();
tail = new DLinkedNode();
head->next = tail;
tail->pre = head;
}
// 读取
int get(int key) {
if (!cache.count(key)) {
return -1;
}
// 如果存在,先通过hash表定位,在移到头部
DLinkedNode* node = cache[key];
moveToHead(node);
return node->val;
}
void moveToHead(DLinkedNode* node) {
// 删除点
remodeNode(node);
// 添加点
addTohead(node);
}
void remodeNode(DLinkedNode* node) {
node->pre->next = node->next;
node->next->pre = node->pre;
}
void addTohead(DLinkedNode* node) {
node->pre = head;
node->next = head->next;
head->next->pre = node;
head->next = node;
}
DLinkedNode* removeTail() {
DLinkedNode* node = tail->pre;
remodeNode(node);
return node;
}
// 插入
void put(int key, int value) {
if (!cache.count(key)) {
// 如果不存在
DLinkedNode* node = new DLinkedNode(key, value);
cache[key] = node;
addTohead(node);
++size;
if (size > capacity) {
// 去尾巴,超出容量
DLinkedNode* remove = removeTail();
// 在map中删除对应的元素
cache.erase(remove->key);
delete remove;
--size;
}
else {
// 如果存在key,先定位,在修改val,再移动到头部
DLinkedNode* node = cache[key];
node->val = value;
moveToHead(node);
}
}
}
};
最近最少使用算法LRU
最新推荐文章于 2023-02-09 11:03:21 发布