運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料get
和 寫入資料put
。
獲取資料get(key)
- 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。
寫入資料put(key, value)
- 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。
高階:
你是否可以在o(1)時間複雜度內完成這兩種操作?
示例:
lrucache cache = new lrucache( 2 /* 快取容量 */ );lru chshe 的get操作需要在o(1)的時間內得到乙個指定的key, 並將這個key放到最前面, put操作像這個結構新增乙個key和value,如果這個key已經存在,刪除資料結構中的key,並將這個新的key放到最前面,如果超容量,那麼刪除最後乙個元素。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
由此可以看出,實現這個結構可以使用雜湊表加雙向鍊錶來實現,而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 詳解 時間複...