運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。
獲取資料 get(key) - 如果關鍵字 (key) 存在於快取中,則獲取關鍵字的值(總是正數),否則返回 -1。
寫入資料 put(key, value) - 如果關鍵字已經存在,則變更其資料值;如果關鍵字不存在,則插入該組「關鍵字/值」。當快取容量達到上限時,它應該在寫入新資料之前刪除最久未使用的資料值,從而為新的資料值留出空間。
示例:
lrucache cache =
newlrucache(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的條件。
在每次get、put時,需要更新key的優先順序,所有需要乙個儲存資料的有序資料結構。
由於需要維護一定長度,所以需要維護該資料結構乙個常量,用來表示該資料結構的長度。
最後使用了陣列去儲存對應的key-value,使用乙個常量限制陣列的長度,在構造該資料結構時便賦值。
在get時,先獲取對應key的位置,返回該value,並且把該項刪除再增加到陣列頭(提公升其優先順序)。
在put時,如果已有key,則更新value和把該項刪除再增加到陣列頭,如果沒有則判斷其長度是否達上限,如果是則進行unshift和pop操作。
class
lrucache
get(key)
return-1
;};put
(key, value)if(
this
.arr.length ===
this
.arrlength)
// 增加項
this
.arr.
unshift()
;};}
map物件在迭代時會根據物件中元素的插入順序來進行乙個forof迴圈在每次迭代後會返回乙個形式為[key,value]的陣列。map是有序的。
可以使用map來作為該資料結構,由於map在頻繁增刪鍵值對的場景下效能更好。使用map改進之後,花費時間較少一半,消耗空間不變。
**如下:
class
lrucache
get(key)
return-1
};put(key, value)
elseif(
this
.cache.size >=
this
.capacity)
this
.cache.
set(key, value)};
}
Leetcode LRU快取機制
lru least recently used 最後思路 使用了linkedhashmap這個資料結構,它本身可以按訪問順序排序並且將剛剛訪問過的資料放在尾部。class lrucache public int get int key public void put int key,int valu...
Leetcode LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...
LeetCode LRU快取機制
使用雙向鍊錶來表示最久未使用的結點,最久未使用的結點放在了尾部 使用雜湊表來存放真正的資料 容量 int size 實際大小,當size超過capacity時,刪除最久未使用的結點 mapcache newhashmap 雜湊表用來存放真正的資料 dlinkednode head,tail 新增首尾...