LRUCache演算法的簡單實現

2021-08-07 12:00:35 字數 1149 閱讀 7116

lru是least recently used的縮寫,意為最近最少使用演算法。

lrucache是一種常用的快取替換演算法,根據使用率淘汰資料,即使用率最小的會被淘汰,通常會用乙個雙向鍊錶來實現,在這個雙向鍊錶中,如果乙個cache被命中,則將這個資料移動到鍊錶的頭部,而不經常使用的cache就會逐漸移向鍊錶的尾部,我們會給這個鍊錶設定乙個大小作為該雙向鍊錶的最大容量,當鍊表達到最大容量時,就取出鍊錶尾部的乙個資料丟掉。

快取裡存放的一般是鍵值對,就是 key / value的結構,最簡單的lrucache大致有兩種操作:

一種是get(key),這個方法是從快取裡查詢是否有key的元素,有的話返回其value值, 沒有的話返回-1。

一種是set(key, value),這個方法是,若快取裡沒有key的元素,那麼放到快取裡,如果快取已經滿了,將最不常用的那個(key, value)給移除,再把新元素放進去,並插入到鍊錶的頭部(最前面);若快取裡已經有key的元素了,那麼更新key的value值,並將更新後的key / value放到最前面。

雖然上述中已經用鍊錶實現了基本操作,但是也會存在乙個問題:如果直接用雙向鍊錶的話,從快取中取數時每次都需要遍歷鍊錶,這樣就會消耗大量的時間,如果採用map實現鍵值key / value對應,這樣就避免了每次查詢的時候都要在雙向鍊錶中順序遍歷了,很大程度上提高了查詢的效率。

下面是乙個簡單的lrucache的實現:

template

class lrucache

t get(k key)

else

} void set(k key, t value)

else

} else

}private:

struct listnode

}; void cacheinserthead(listnode* node)

void cachedeletenode(listnode* node)

private:

int max_size;

int current_size;

unordered_map

cachemap;

listnode* head;

listnode* tail;

t err_;

};

LRU Cache的簡單c 實現

lru cache是乙個cache的置換演算法,含義是 最近最少使用 把滿足 最近最少使用 的資料從cache中剔除出去,並且保證cache中第乙個資料是最近剛剛訪問的,因為這樣的資料更有可能被接下來的程式所訪問。lru的應用比較廣泛,最基礎的記憶體頁置換中就用了,對了,這裡有個概念要清楚一下,ca...

簡單的LRU Cache設計與實現

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

LRu Cache演算法原理

lru cache演算法原理 1.新資料插入到鍊錶頭部 2.每當快取命中 即快取資料被訪問 則將資料移到鍊錶頭部 3.當鍊表滿的時候,將鍊錶尾部的資料丟棄。分析 命中率 當存在熱點資料時,lru的效率很好,但偶發性的 週期性的批量操作會導致lru命中率急劇下降,快取汙染情況比較嚴重。複雜度 實現簡單...