就是一種快取淘汰策略。
計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為「有用的」的資料呢?
lru 快取淘汰演算法就是一種常用策略。lru 的全稱是 least recently used,也就是說我們認為最近使用過的資料應該是是「有用的」,很久都沒用過的資料應該是無用的,記憶體滿了就優先刪那些很久沒用過的資料。
leetcode 146. lru快取機制
運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。
獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。
寫入資料 put(key, value) - 如果金鑰已經存在,則變更其資料值;如果金鑰不存在,則插入該組「金鑰/資料值」。當快取容量達到上限時,它應該在寫入新資料之前刪除最久未使用的資料值,從而為新的資料值留出空間。
採用hashmap和鍊錶來實現。
思路:
(1)hashmap用於儲存鍵值對(key-value),鍊錶用來儲存最近使用的資料(key)。
(2)鍊錶中的key,最近使用的存放在index = 0位置,不常用的就是index=size()-1位置處的key
(3)如果hashmap容量達到快取的最大容量,再進行新增的時候就要找到要刪除的key。也就是鍊錶中index=size()-1位置處的key
(4)再將資料新增到hashmap中,並且將key新增到鍊錶的開頭index=0
注意:在**中,只要涉及到get和put,都表示該key被使用,所以都應該放在鍊錶的開頭
**:
class
lrucache
//獲取
public
intget
(int key)
//key存在,更新鍊錶
lrulist.
remove
(integer.
valueof
(key));
lrulist.
add(
0, key)
;return val;
}public
void
put(
int key,
int value)
//超過容量上限,刪除不常使用的那個key-value
if(lrucache.
size()
>=capacity)
//新增新的key-value
lrucache.
put(key, value)
; lrulist.
add(
0,key);}
}
該方法雖然思路簡單,但是由於使用了鍊錶linkedlist,所以刪除元素的時候比較麻煩。 LRU快取機制實現
題目描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set key,value 將記錄 key,value 插入該結構 get key 返回key對應的value值 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key...
演算法 LRU 146 LRU快取機制
設計和實現乙個lru 最近最少使用 快取資料結構,使它應該支援以下操作 get和put。get key 如果金鑰存在於快取中,則獲取金鑰的值 值總是正數 否則返回 1。put key,value 如果金鑰不存在,請設定或插入值。當快取達到其容量時,它應該在插入新專案之前使最近最少使用的專案作廢。後續...
LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...