計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為「有用的」的資料呢?lru 快取淘汰演算法就是一種常用策略。lru 的全稱是 least recently used,也就是說我們認為最近使用過的資料應該是是「有用的」,很久都沒用過的資料應該是無用的,記憶體滿了就優先刪那些很久沒用過的資料。
lru演算法實際上是要設計乙個類實現快取管理機制。首先,快取的大小需要限定,同時要實現兩個方法,乙個是get(key),查詢當前快取佇列中是否有需要的快取,若有,則返回value,同時將該快取提至快取佇列頭部;否則,返回-1。另乙個是put(key, value),首先判斷要插入的快取是否已存在,如果已存在,更新value值,並將其提至快取佇列頭部;反之,就需要將其插入快取佇列中。如果此時快取佇列已滿,需要先刪除快取佇列中的乙個快取,再將要插入的快取放置到快取佇列頭部。
(要求get(key)和put(key, value)的時間複雜度均為o(1)。由前面的演算法描述可知,不論是get(key)還是put(key, value)都需要查詢快取佇列是否存在要查詢或要插入的快取,很自然想到要使用map來儲存相關的資訊。同時考慮如何界定最近最久未使用這個概念。由演算法描述部分可知,沒做乙個插入或查詢操作,都會將使用過的快取提至隊頭,因此隊尾的快取既是最近最久未使用的快取。我們知道list做插入和刪除很方便,同時c++裡封裝這個類,可以直接呼叫。該類是乙個雙向鍊錶,刪除節點更方便。基於上述討論,選擇使用map+list實現該設計。
變數說明:
cap 快取佇列容量
cache 快取佇列,其中資料型別為pair
m 雜湊表,儲存key->list結點的對映,注意雜湊表中鍵值是key,對映值是指向對應結點的指標。
// an highlighted block
class
lrucache
int get
(int key)
void
put(int key, int value)
cache.
push_front
(make_pair
(key, value));
// 插入快取佇列
m[key]
= cache.
begin()
;// 更新map對映關係
}else}}
;
C 學習筆記( )
一 語法 迴圈 foreach 型別識別符號 in 表示式 code 用法 例子int temp foreach int num in temp 每次從temp取乙個元素賦給num直至取完 console.writeline n num 每行顯示乙個元素 執行結果 c 中唯讀 只寫控制 class ...
C 學習筆記
1.函式特徵 有函式頭和函式體 接受乙個引數 返回乙個值 需要乙個原型。2.c 命名規則 在名稱中只能使用字母字元 數字和下劃線 名稱的第乙個字元不能是數字 區分大寫字母和小寫字母 不能將c 關鍵字用作名稱 以兩個下劃線或下劃線和大寫字母打頭的名稱被保留給實現 編譯器及其使用的資源 使用,以乙個下劃...
c 學習筆記
屬性 屬性開頭字母大寫 屬性可以判斷輸入的非法值 屬性本身不儲存值 依靠字段 索引器 using system using system.collections.generic using system.linq using system.text namespace b try catch exc...