leetcode LRU快取機制

2021-10-08 17:48:47 字數 1789 閱讀 8038

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