緩存算法(頁面置換算法)-FIFO、LFU、LRU

在前一篇文章中經過leetcode的一道題目瞭解了LRU算法的具體設計思路,下面繼續來探討一下另外兩種常見的Cache算法:FIFO、LFUhtml

1.FIFO算法

  FIFO(First in First out),先進先出。其實在操做系統的設計理念中不少地方都利用到了先進先出的思想,好比做業調度(先來先服務),爲何這個原則在不少地方都會用到呢?由於這個原則簡單、且符合人們的慣性思惟,具有公平性,而且實現起來簡單,直接使用數據結構中的隊列便可實現。算法

  在FIFO Cache設計中,核心原則就是:若是一個數據最早進入緩存中,則應該最先淘汰掉。也就是說,當緩存滿的時候,應當把最早進入緩存的數據給淘汰掉。在FIFO Cache中應該支持如下操做;數組

  get(key):若是Cache中存在該key,則返回對應的value值,不然,返回-1;緩存

  set(key,value):若是Cache中存在該key,則重置value值;若是不存在該key,則將該key插入到到Cache中,若Cache已滿,則淘汰最先進入Cache的數據。數據結構

  舉個例子:假如Cache大小爲3,訪問數據序列爲set(1,1),set(2,2),set(3,3),set(4,4),get(2),set(5,5)post

  則Cache中的數據變化爲:操作系統

  (1,1)                               set(1,1).net

  (1,1) (2,2)                       set(2,2)設計

  (1,1) (2,2) (3,3)               set(3,3)code

  (2,2) (3,3) (4,4)               set(4,4)

  (2,2) (3,3) (4,4)               get(2)

  (3,3) (4,4) (5,5)               set(5,5)

   那麼利用什麼數據結構來實現呢?

  下面提供一種實現思路:

  利用一個雙向鏈表保存數據,當來了新的數據以後便添加到鏈表末尾,若是Cache存滿數據,則把鏈表頭部數據刪除,而後把新的數據添加到鏈表末尾。在訪問數據的時候,若是在Cache中存在該數據的話,則返回對應的value值;不然返回-1。若是想提升訪問效率,能夠利用hashmap來保存每一個key在鏈表中對應的位置。

2.LFU算法

  LFU(Least Frequently Used)最近最少使用算法。它是基於「若是一個數據在最近一段時間內使用次數不多,那麼在未來一段時間內被使用的可能性也很小」的思路。

  注意LFU和LRU算法的不一樣之處,LRU的淘汰規則是基於訪問時間,而LFU是基於訪問次數的。舉個簡單的例子:

  假設緩存大小爲3,數據訪問序列爲set(2,2),set(1,1),get(2),get(1),get(2),set(3,3),set(4,4),

  則在set(4,4)時對於LFU算法應該淘汰(3,3),而LRU應該淘汰(1,1)。

  那麼LFU Cache應該支持的操做爲:

  get(key):若是Cache中存在該key,則返回對應的value值,不然,返回-1;

  set(key,value):若是Cache中存在該key,則重置value值;若是不存在該key,則將該key插入到到Cache中,若Cache已滿,則淘汰最少訪問的數據。

  爲了可以淘汰最少使用的數據,所以LFU算法最簡單的一種設計思路就是 利用一個數組存儲 數據項,用hashmap存儲每一個數據項在數組中對應的位置,而後爲每一個數據項設計一個訪問頻次,當數據項被命中時,訪問頻次自增,在淘汰的時候淘汰訪問頻次最少的數據。這樣一來的話,在插入數據和訪問數據的時候都能達到O(1)的時間複雜度,在淘汰數據的時候,經過選擇算法獲得應該淘汰的數據項在數組中的索引,並將該索引位置的內容替換爲新來的數據內容便可,這樣的話,淘汰數據的操做時間複雜度爲O(n)。

  另外還有一種實現思路就是利用 小頂堆+hashmap,小頂堆插入、刪除操做都能達到O(logn)時間複雜度,所以效率相比第一種實現方法更加高效。

  若是哪位朋友有更高效的實現方式(好比O(1)時間複雜度),不妨探討一下,不勝感激。

3.LRU算法

  LRU算法的原理以及實如今前一篇博文中已經談到,在此不進行贅述:

  http://www.cnblogs.com/dolphin0520/p/3741519.html

  參考連接:http://blog.csdn.net/hexinuaa/article/details/6630384

         http://blog.csdn.net/beiyetengqing/article/details/7855933

       http://outofmemory.cn/wr/?u=http%3A%2F%2Fblog.csdn.net%2Fyunhua_lee%2Farticle%2Fdetails%2F7648549

       http://blog.csdn.net/alexander_xfl/article/details/12993565

做者: 海子
         
本博客中未標明轉載的文章歸做者 海子和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。
相關文章
相關標籤/搜索