假設 序列為 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 個輸入是指演...