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 ...