LeetCode 146. LRU缓存机制(哈希链表)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 146. LRU缓存机制(哈希链表)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. 題目信息
- 2. 解題
- 2.1 手動實現list
- 2.2 使用內置list
1. 題目信息
運用你所掌握的數據結構,設計和實現一個 LRU (最近最少使用) 緩存機制。它應該支持以下操作: 獲取數據 get 和 寫入數據 put 。
獲取數據 get(key) - 如果密鑰 (key) 存在于緩存中,則獲取密鑰的值(總是正數),否則返回 -1。
寫入數據 put(key, value) - 如果密鑰不存在,則寫入其數據值。當緩存容量達到上限時,它應該在寫入新數據之前刪除最近最少使用的數據值,從而為新的數據值留出空間。
進階:
你是否可以在 O(1) 時間復雜度內完成這兩種操作?
示例:LRUCache cache = new LRUCache( 2 /* 緩存容量 */ );cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 該操作會使得密鑰 2 作廢 cache.get(2); // 返回 -1 (未找到) cache.put(4, 4); // 該操作會使得密鑰 1 作廢 cache.get(1); // 返回 -1 (未找到) cache.get(3); // 返回 3 cache.get(4); // 返回 4來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/lru-cache
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
- 類似題目:LeetCode 460. LFU緩存
2.1 手動實現list
要 put 和 get 方法的時間復雜度為 O(1),這個數據結構要:查找快,插入快,刪除快,有順序之分。
- 有順序之分,區分最近使用的和久未使用的數據
- 容量滿了要刪除最后一個數據
- 訪問時要把數據插入到隊頭。
哈希表查找快,但數據無順序
鏈表有順序之分,插入刪除快,但查找慢。
結合一下以上兩者的優點。
- LRU 緩存算法的核心數據結構就是哈希鏈表,雙向鏈表和哈希表的組合體。
借一張圖表示下哈希鏈表。
2.2 使用內置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();}} };總結
以上是生活随笔為你收集整理的LeetCode 146. LRU缓存机制(哈希链表)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 986. 区间列表的交
- 下一篇: c语言(int)x 100,【单选题】下