1. 程式人生 > >LRU演算法及例題講解

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