146 LRU快取機制

2021-09-22 21:25:19 字數 1600 閱讀 6392

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

lru chshe 的get操作需要在o(1)的時間內得到乙個指定的key, 並將這個key放到最前面, put操作像這個結構新增乙個key和value,如果這個key已經存在,刪除資料結構中的key,並將這個新的key放到最前面,如果超容量,那麼刪除最後乙個元素。

由此可以看出,實現這個結構可以使用雜湊表加雙向鍊錶來實現,而c++ stl中已經有雙向鍊錶這個結構。所以可以直接用stl實現。

class lrucache 

// o(1) 時間

// 將元素放到最前面

int get(int key)

// 加入乙個元素到casche中 o(1)

// 如果key存在, 將key移到開頭

// 如果不存在, 插入新節點

// 如果容量超限, 刪除最後乙個節點

void put(int key, int value)

}private:

int _capacity; // cache的最大長度

list> _list; // 雙向鍊錶

// 乙個雜湊表

unordered_map>::iterator> _m;

};/**

* 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快取機制

參考 官方解答 主要思路 需要字典實現快速查詢,同時需要保證一定的順序。帶頭尾節點的雙向鍊錶可以實現快速刪除和新增頭尾節點。因為節點的屬性包括前乙個節點和後乙個節點,即使是中間的節點也可以實現快速刪除。思路1 使用ordereddict實現 可參考 python ordereddict 詳解 時間複...