什麼是LRU演算法?

2021-10-19 09:23:20 字數 1345 閱讀 3817

假設 序列為 4 3 4 2 3 1 4 2物理塊有3個 則首輪 4調入記憶體 4次輪 3調入記憶體 3 4之後 4調入記憶體 4 3之後 2調入記憶體 2 4 3之後 3調入記憶體 3 2 4之後 1調入記憶體 1 3 2(因為最少使用的是4,所以丟棄4)之後 4調入記憶體 4 1 3(原理同上)最後 2調入記憶體 2 4 1

規律就是,如果新存入或者訪問乙個值,則將這個值放在佇列開頭。如果儲存容量超過上限cap,那麼刪除隊尾元素,再存入新的值。

我們下面通過乙個簡單的儲存int的方式來實現lru cache,實現put和get功能。

lru(least recently used,最近最少使用)演算法。該演算法的觀點是,最近被訪問的資料那麼它將來訪問的概率就大,快取滿的時候,優先淘汰最無人問津者

演算法實現思路:基於乙個雙鏈表的資料結構,在沒有滿員的情況下,新來的 k-v 放在鍊錶的頭部,以後每次獲取快取中的 k-v 時就將該k-v移到最前面,快取滿的時候優先淘汰末尾的。

雙向鍊錶的特點,具有頭尾指標,每個節點都有 prev(前驅) 和 next(後繼) 指標分別指向他的前乙個和後乙個節點。

關鍵點:在雙鏈表的插入過程中要注意順序問題,一定是在保持鍊錶不斷的情況下先處理指標,最後才將原頭指標指向新插入的元素,在**的實現中請注意看我在注釋中說明的順序注意點!

class lrucache 

this.size = 0

}get(key, ifreturnnode)

// 不是頭結點,鐵定要移動元素了

if (node.prev)

//把當前節點的後繼交接給當前節點的前驅去指向。

node.prev.next = node.next

}if (node.next)

node.prev = undefined //移動到最前面,所以沒了前驅

node.next = this.head //注意!!! 這裡要先把之前的排頭給接到手!!!!讓當前節點的後繼指向原排頭

if (this.head)

this.head = node //完成了交接,才能執行此步!不然就找不到之前的排頭啦!

return ifreturnnode ?

node :

node.value

}set(key, value)

node =

this.map[key] = node

if(this.head)else

this.size++//減少乙個快取槽位}}

//節點存不存在都要給他重新賦值啊

node.value = value

}}module.exports = lrucache

什麼是LRU演算法

lru是 least recently used 的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的。關 於作業系統的記憶體管理,如何節省利用容量不大的記憶體為最多的程序提供資源,一直是研究的重要方向。而記憶體的虛擬儲存管理,是現在最通用,最成功的方式 在記憶體有限的情況下,擴充套件一...

什麼是LRU(最近最少使用)演算法?

lru least recently used 最近最少使用。是一種 記憶體管理 演算法。lru演算法基於一種假設 長期不被使用的資料,在未來被用到的機率也不大。因此,當資料所佔記憶體達到一定閾值時,要移除掉最近最少使用的資料。lru演算法使用了一種有趣的資料結構,叫做 雜湊鍊錶 1 雜湊表 是由若...

什麼是演算法

演算法 algorithm 是指解題方 而完整的描述,是一系列解決問題的清晰指令,演算法代表著用系統的方法描述解決問題的策略機制。演算法的有窮性是指演算法必須能在執行有限個步驟之後終止 演算法的每一步驟必須有確切的定義 乙個演算法有 0 個或多個輸入,以刻畫運算物件的初始情況,所謂 0 個輸入是指演...