LeetCode146 LRU快取機制

2021-09-27 02:09:01 字數 1083 閱讀 8720

題目:

運用你所掌握的資料結構,設計和實現乙個  lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。

寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。

思路:

要讓 put 和 get 方法的時間複雜度為 o(1)o(1),我們可以總結出 cache 這個資料結構必要的條件:查詢快,插入快,刪除快,有順序之分。

因為顯然 cache 必須有順序之分,以區分最近使用的和久未使用的資料;而且我們要在 cache 中查詢鍵是否已存在;如果容量滿了要刪除最後乙個資料;每次訪問還要把資料插入到隊頭。

那麼,什麼資料結構同時符合上述條件呢?雜湊表查詢快,但是資料無固定順序;鍊錶有順序之分,插入刪除快,但是查詢慢。所以結合一下,形成一種新的資料結構:雜湊鍊錶。

lru 快取演算法的核心資料結構就是雜湊鍊錶,雙向鍊錶和雜湊表的結合體。

題解:

class lrucache 

int get(int key)

void put(int key, int value)

//cache 沒滿可以直接新增

cache.push_front(make_pair(key,value));

map[key] = cache.begin();

}else

}};/**

* your lrucache object will be instantiated and called as such:

* lrucache* obj = new lrucache(capacity);

* int param_1 = obj->get(key);

* obj->put(key,value);

*/

參考:

學渣帶你刷Leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰已經存在,則變更其資料值...

leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...

LeetCode 146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料get和 寫入資料put。獲取資料get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料put key,value 如果金鑰不存在,則寫入其資料值。當快取容量...