LRU演算法及例題講解
概念:
LRU(least recently used)是將近期最不會訪問的資料給淘汰掉,其實LRU是認為最近被使用過的資料,那麼將來被訪問的概率也多,最近沒有被訪問,那麼將來被訪問的概率也比較低“,其實這個並不是正確的,但是因為LRU演算法簡單,儲存空間沒有被浪費,所以還是用的比較廣泛的。
LRU原理:
LRU一般採用連結串列的放緩死實現,便於快速移動資料位置。網上找了一個圖,感覺畫的很贊,所以就粘過來了,為了說明問題~~~~~感謝這個圖的作者!!!!
LRU的實現有兩種方式:快取命中後,是否要這個資料快取項到LRU佇列的最前端。
首先這個圖說明的是LRU的一種實現方式,那就是在快取訪問命中後,要將這個資料快取項到達LRU佇列的最前端。第五步,將E插入快取池後,這個快取池已經滿了,所以第六步插入F後,要考慮把近期沒有訪問的資料,也就是A給淘汰掉了(可憐的A啊。。。。)第七步,C被訪問,從時間點來說,C最近被訪問過了,所以移動到了連結串列的頭部(暫時沒有被淘汰);第八步,將G存入快取後,G位於連結串列頭部,那麼B只能被淘汰了。。。。
因為連結串列的插入和刪除時間複雜度都為O(1),所以用連結串列不用陣列。。。。。(這句是參考別人的,還不是很懂,讓我研究研究。。。)
還有資料快取項不移動到LRU最前端的方式,由下面的例題來詳細說明。
下面貼一個例題:
例:
大家一起來做題吧!
—————————————————————————————————————————————————————————————————————————————
解:
本題是有兩種解答的。
1.快取命中後,這個資料快取項不要移動到連結串列最前端:
命中不調整快取項內容快照如下:
1. 1
2. 5 1
3. 5 1
4. 3 5 1
5. 3 5 1
6. 2 3 5 1
7. 4 2 3 5(淘汰1)
8. 1 4 2 3 (淘汰5)
9 1 4 2 3(命中2
到達第6步時,快取池已經滿了,所以開始淘汰,淘汰兩次,最後淘汰5
2.快取命中後,這個資料快取項要移動到連結串列最前端
1. 1
2. 5 1
3. 1 5
4. 3 1 5
5 .5 3 1
6. 2 5 3 1
7. 4 2 5 3(淘汰1)
8. 1 4 2 5(淘汰3)
9 .2 1 4 5
淘汰2次,最後淘汰3