wordpress for bae哪里搜索引擎優(yōu)化好
請你設計并實現(xiàn)一個滿足??LRU (最近最少使用) 緩存?約束的數(shù)據(jù)結構。
實現(xiàn)?LRUCache
?類:
LRUCache(int capacity)
?以?正整數(shù)?作為容量?capacity
?初始化 LRU 緩存int get(int key)
?如果關鍵字?key
?存在于緩存中,則返回關鍵字的值,否則返回?-1
?。void put(int key, int value)
?如果關鍵字?key
?已經存在,則變更其數(shù)據(jù)值?value
?;如果不存在,則向緩存中插入該組?key-value
?。如果插入操作導致關鍵字數(shù)量超過?capacity
?,則應該?逐出?最久未使用的關鍵字。
函數(shù)?get
?和?put
?必須以?O(1)
?的平均時間復雜度運行。
示例:
輸入 ["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"] [[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]] 輸出 [null, null, null, 1, null, -1, null, -1, 3, 4]解釋 LRUCache lRUCache = new LRUCache(2); lRUCache.put(1, 1); // 緩存是 {1=1} lRUCache.put(2, 2); // 緩存是 {1=1, 2=2} lRUCache.get(1); // 返回 1 lRUCache.put(3, 3); // 該操作會使得關鍵字 2 作廢,緩存是 {1=1, 3=3} lRUCache.get(2); // 返回 -1 (未找到) lRUCache.put(4, 4); // 該操作會使得關鍵字 1 作廢,緩存是 {4=4, 3=3} lRUCache.get(1); // 返回 -1 (未找到) lRUCache.get(3); // 返回 3 lRUCache.get(4); // 返回 4
思路
? ? ? ? 雙向鏈表維護頭尾節(jié)點,用哈希表鍵值對尋找節(jié)點
代碼
class lrulist
{public:int val;int key;lrulist* next;lrulist* last;lrulist(int value, int k) : val(value), key(k), next(nullptr), last(nullptr){}
};
class LRUCache {
public:unordered_map<int, lrulist*> hashmap;lrulist* back;lrulist* front;int size;int cap;void push_front(int value, int key){lrulist* newnode = new lrulist(value, key);hashmap[key] = newnode;if(front){newnode->next = front;front->last = newnode;}elseback = newnode;front = newnode;++size;}void move(lrulist* node){if(node == front)return;if(back == node){back = back->last;if(back)back->next = nullptr; }else{node->last->next = node->next;node->next->last = node->last; }node->next = front;if(front)front->last = node;front = node;}void del_node(lrulist* node){if(front == node){front = front->next;if(front)front->last = nullptr;}else if(back == node){back = back->last;if(back)back->next = nullptr;}hashmap.erase(node->key);--size;delete node; }LRUCache(int capacity) : size(0), cap(capacity), front(nullptr), back(nullptr){}int get(int key) {if(hashmap.find(key) != hashmap.end()){move(hashmap[key]);return hashmap[key]->val;}elsereturn -1;}void put(int key, int value) {if(hashmap.find(key) == hashmap.end()){if(size == cap)del_node(back);push_front(value, key);}else{hashmap[key]->val = value;move(hashmap[key]);}}
};