146 LRU快取機制

2021-10-23 08:55:46 字數 1486 閱讀 5299

題目描述:

運用你所掌握的資料結構,設計和實現乙個 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

方法1:使用unordered_map實現查詢的 o(1),使用鍊錶實現刪除的o(1);

主要思路:

(1)使用鍊錶和unordered_map兩種資料結構的配合實現;

(2)list中儲存pair型別,分別表示鍵 key 和值 value,儲存到 list 中,unordered_map中分別儲存 int 和 list的迭代器,既list>::iterator,分別表示 鍵 key 和對應的 list 中的位置,既迭代器;

(3)這樣,實現在查詢時,直接通過鍵,在map中找對應的迭代器是否存在,若存在,為多少的問題,同樣在刪除的時候,可以直接在鍊錶的對應的迭代器的位置進行刪除,只不過,注意要在每次操作list 之後,同步的更新map 的對應的元素;

class

lrucache

intget

(int key)

return-1

;}void

put(

int key,

int value)

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

*/

146 LRU快取機制

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

146 LRU快取機制

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

146 LRU快取機制

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