LRU Cache 的簡單 C++ 實現

吳YH堅發表於2016-09-18

什麼是 LRU

LRU Cache是一個Cache的置換演算法,含義是“最近最少使用”,把滿足“最近最少使用”的資料從Cache中剔除出去,並且保證Cache中第一個資料是最近剛剛訪問的,因為這樣的資料更有可能被接下來的程式所訪問。

LRU的應用比較廣泛,最基礎的記憶體頁置換中就用了,對了,這裡有個概念要清楚一下,Cache不見得是CPU的快取記憶體的那個Cache,這裡的Cache直接翻譯為快取,就是兩種儲存方式的速度有比較大的差別,都可以用Cache快取資料,比如硬碟明顯比記憶體慢,所以常用的資料我們可以Cache在記憶體中。

LRU 基本演算法描述

前提:

由於我只是簡單實現一下這個演算法,所以資料都用int代替,下一個版本會改成模板形式的,更加通用。

要求:

  1. 只提供兩個介面,一個獲取資料getValue(key),一個寫入資料putValue(key,value)
  2. 無論是獲取還是寫入資料,當前這個資料要保持在最容易訪問的位置
  3. 快取數量有限,最長時間沒被訪問的資料應該置換出快取

演算法:

為了滿足上面幾個條件,實際上可以用一個雙向連結串列來實現,每次訪問完資料(不管是獲取還是寫入),調整雙向連結串列的順序,把剛剛訪問的資料調整到連結串列的最前方,以後再訪問的時候速度將最快。

為了方便,提供一個頭和一個尾節點,不存具體的數,連結串列的基本形式如下面的這個簡單表述

Head <===> Node1 <===> Node2 <===> Node3 <===> Near

OK,就這麼些,比較簡單,實現起來也不難,用c++封裝一個LRUCache類,類提供兩個方法,分別是獲取和更新,初始化類的時候傳入Cache的節點數。

先定義一個存資料的節點資料結構

類定義:

類實現:

說在後面的話

其實,程式還可以優化,首先,把資料int型別換成模板形式的通用型別,另外,資料查詢的時候複雜度為O(n),可以換成hash表來存資料,連結串列只做置換處理,這樣查詢新增的時候速度將快很多。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

LRU Cache 的簡單 C++ 實現

相關文章