LRU快取機制演算法實現

2021-10-06 09:30:07 字數 1553 閱讀 5293

就是一種快取淘汰策略。

計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為「有用的」的資料呢?

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 如果金鑰不存在,則寫入其資料值。...