LRU Cache的簡單c 實現

2021-06-18 05:50:49 字數 1555 閱讀 9157

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

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

前提:

要求:

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

為了方便,提供乙個頭和乙個尾節點,不存具體的數,鍊錶的基本形式如下面的這個簡單表述

head <===> node1 <===> node2 <===> node3 <===> near

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

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

typedef struct _node_cachenode;

類定義:

class lrucache;

類實現:

lrucache::lrucache(int cache_size)

lrucache::~lrucache()

delete p_cache_list_near; }

void lrucache::detachnode(cachenode *node)

void lrucache::addtofront(cachenode *node)

int lrucache::getvalue(int key)

p=p->next;

} return -1;

}bool lrucache::putvalue(int key,int value)

p=p->next; }

if(cache_real_size_ >= cache_size_)

p=new cachenode();//(cachenode *)malloc(sizeof(cachenode));

if(p==null)

return false;

addtofront(p);

p->key=key;

p->value=value;

cache_real_size_++;

return true;

}void lrucache::displaynodes()

cout << endl;

}

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

LRUCache演算法的簡單實現

lru是least recently used的縮寫,意為最近最少使用演算法。lrucache是一種常用的快取替換演算法,根據使用率淘汰資料,即使用率最小的會被淘汰,通常會用乙個雙向鍊錶來實現,在這個雙向鍊錶中,如果乙個cache被命中,則將這個資料移動到鍊錶的頭部,而不經常使用的cache就會逐漸...

簡單的LRU Cache設計與實現

要求 設計並實現乙個lru快取的資料結構,支援get和set操作 get key 若快取中存在key,返回對應的value,否則返回 1 set key,value 若快取中存在key,替換其value,否則插入key及其value,如果插入時快取已經滿了,應該使用lru演算法把最近最久沒有使用的k...

LruCache實現原理

lrucache 什麼是lrucache?lrucache實現原理是什麼?這兩個問題其實可以作為乙個問題來回答,知道了什麼是 lrucache,就只然而然的知道 lrucache 的實現原理 lru的全稱是least recently used 近期最少使用的!所以我們可以推斷出 lrucache ...