題解 LRU快取

2021-10-09 04:33:12 字數 1787 閱讀 9784

設計和構建乙個「最近最少使用」快取,該快取會刪除最近最少使用的專案。快取應該從鍵對映到值(允許你插入和檢索特定鍵對應的值),並在初始化時指定最大容量。當快取被填滿時,它應該刪除最近最少使用的專案。

它應該支援以下操作: 獲取資料get和 寫入資料put

獲取資料get(key):如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回-1

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

例:

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

本文使用雙向鍊錶構建lru快取,鍊錶中每個節點表示一塊快取(包含keyvalue)。除此之外,還用乙個雜湊表將快取的key值和對應鍊錶節點的位址關聯起來。

每次訪問乙個節點時,都要將它移動到鍊錶的第乙個位置上,並更新雜湊表中對應的項。

每次刪除乙個節點時,要刪除的是鍊錶中最後乙個位置的節點,同時也要刪除雜湊表中對應的項。

每次新增乙個節點時,要將新建的節點新增在鍊錶第乙個位置,並向雜湊表中新增對應的項。

快取工作的大體流程是:

(1)初始化時,指定快取的最大容量。

class

lrucache

intget

(int key)

else

}void

put(

int key,

int value)

(this

->ln)

.push_front

(node

(key, value));

(this

->um)

[key]=(

this

->ln)

.begin()

;}else

}private

:class

node};

list ln;

int capacity;

unordered_map<

int, list

::iterator> um;};

/** * 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);

*/

LRU快取策略

為最近最少使用 lru 快取策略設計乙個資料結構,它應該支援以下操作 獲取資料 get 和寫入資料 set 獲取資料get key 如果快取中存在key,則獲取其資料值 通常是正數 否則返回 1。寫入資料set key,value 如果key還沒有在快取中,則寫入其資料值。當快取達到上限,它應該在寫...

LRU快取演算法

為什麼要有lru快取演算法 我們用快取來存放以前讀取的資料,而不是直接丟掉,這樣,再次讀取的時候,可以直接在快取裡面取,而不用再重新查詢一遍,這樣系統的反應能力會有很大提高。但是,當我們讀取的個數特別大的時候,我們不可能把所有已經讀取的資料都放在快取裡,畢竟記憶體大小是一定的,我們一般把最近常讀取的...

LRU快取機制

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