設計和構建乙個「最近最少使用」快取,該快取會刪除最近最少使用的專案。快取應該從鍵對映到值(允許你插入和檢索特定鍵對應的值),並在初始化時指定最大容量。當快取被填滿時,它應該刪除最近最少使用的專案。
它應該支援以下操作: 獲取資料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
快取,鍊錶中每個節點表示一塊快取(包含key
和value
)。除此之外,還用乙個雜湊表將快取的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 如果金鑰不存在,則寫入其資料值。...