LeetCode 146. LRU缓存机制(哈希链表)
文章目錄
- 1. 題目信息
- 2. 解題
- 2.1 手動(dòng)實(shí)現(xiàn)list
- 2.2 使用內(nèi)置list
1. 題目信息
運(yùn)用你所掌握的數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)和實(shí)現(xiàn)一個(gè) LRU (最近最少使用) 緩存機(jī)制。它應(yīng)該支持以下操作: 獲取數(shù)據(jù) get 和 寫入數(shù)據(jù) put 。
獲取數(shù)據(jù) get(key) - 如果密鑰 (key) 存在于緩存中,則獲取密鑰的值(總是正數(shù)),否則返回 -1。
寫入數(shù)據(jù) put(key, value) - 如果密鑰不存在,則寫入其數(shù)據(jù)值。當(dāng)緩存容量達(dá)到上限時(shí),它應(yīng)該在寫入新數(shù)據(jù)之前刪除最近最少使用的數(shù)據(jù)值,從而為新的數(shù)據(jù)值留出空間。
進(jìn)階:
你是否可以在 O(1) 時(shí)間復(fù)雜度內(nèi)完成這兩種操作?
示例:LRUCache cache = new LRUCache( 2 /* 緩存容量 */ );cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 該操作會(huì)使得密鑰 2 作廢 cache.get(2); // 返回 -1 (未找到) cache.put(4, 4); // 該操作會(huì)使得密鑰 1 作廢 cache.get(1); // 返回 -1 (未找到) cache.get(3); // 返回 3 cache.get(4); // 返回 4來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/lru-cache
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
- 類似題目:LeetCode 460. LFU緩存
2.1 手動(dòng)實(shí)現(xiàn)list
要 put 和 get 方法的時(shí)間復(fù)雜度為 O(1),這個(gè)數(shù)據(jù)結(jié)構(gòu)要:查找快,插入快,刪除快,有順序之分。
- 有順序之分,區(qū)分最近使用的和久未使用的數(shù)據(jù)
- 容量滿了要?jiǎng)h除最后一個(gè)數(shù)據(jù)
- 訪問時(shí)要把數(shù)據(jù)插入到隊(duì)頭。
哈希表查找快,但數(shù)據(jù)無順序
鏈表有順序之分,插入刪除快,但查找慢。
結(jié)合一下以上兩者的優(yōu)點(diǎn)。
- LRU 緩存算法的核心數(shù)據(jù)結(jié)構(gòu)就是哈希鏈表,雙向鏈表和哈希表的組合體。
借一張圖表示下哈希鏈表。
2.2 使用內(nèi)置list
class LRUCache {list<int> cache;int cap;unordered_map<int,int> kv;unordered_map<int,list<int>::iterator> kPos; public:LRUCache(int capacity) {cap = capacity;}int get(int key) {if(!kv.count(key))return -1;put(key,kv[key]);return kv[key];}void put(int key, int value) {if(kv.count(key)){cache.erase(kPos[key]);cache.push_front(key);kPos[key] = cache.begin();kv[key] = value;}else{if(cap == cache.size()){int lastkey = cache.back();cache.pop_back();kv.erase(lastkey);}kv[key] = value;cache.push_front(key);kPos[key] = cache.begin();}} };總結(jié)
以上是生活随笔為你收集整理的LeetCode 146. LRU缓存机制(哈希链表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 986. 区间列表的交
- 下一篇: c语言(int)x 100,【单选题】下