LRU Cache資料結構簡介

2021-06-21 05:32:24 字數 2088 閱讀 2298

lru是least recently used的縮寫,意思是最近最少使用,它是一種cache替換演算法。 什麼是cache?狹義的cache指的是位於cpu和主存間的快速ram, 通常它不像系統主存那樣使用dram技術,而使用昂貴但較快速的sram技術。 廣義上的cache指的是位於速度相差較大的兩種硬體之間, 用於協調兩者資料傳輸速度差異的結構。除了cpu與主存之間有cache, 記憶體與硬碟之間也有cache,乃至在硬碟與網路之間也有某種意義上的cache── 稱為internet臨時資料夾或網路內容快取等。

cache的容量有限,因此當cache的容量用完後,而又有新的內容需要新增進來時, 就需要挑選並捨棄原有的部分內容,從而騰出空間來放新內容。lru cache 的替換原則就是將最近最少使用的內容替換掉。其實,lru譯成最久未使用會更形象, 因為該演算法每次替換掉的就是一段時間內最久沒有使用過的內容。

lru的典型實現是hash map + doubly linked list

, 雙向鍊錶用於儲存資料結點,並且它是按照結點最近被使用的時間來儲存的。 如果乙個結點被訪問了, 我們有理由相信它在接下來的一段時間被訪問的概率要大於其它結點。於是, 我們把它放到雙向鍊錶的頭部。當我們往雙向煉表裡插入乙個結點, 我們也有可能很快就會使用到它,同樣把它插入到頭部。 我們使用這種方式不斷地調整著雙向鍊錶,鍊錶尾部的結點自然也就是最近一段時間, 最久沒有使用到的結點。那麼,當我們的cache滿了, 需要替換掉的就是雙向鍊錶中最後的那個結點(不是尾結點,頭尾結點不儲存實際內容)。

如下是雙向煉表示意圖,注意頭尾結點不儲存實際內容:

頭 --> 結 --> 結 --> 結 --> 尾

結 點 點 點 結

點<-- 1 <-- 2 <-- 3 <-- 點

假如上圖cache已滿了,我們要替換的就是結點3。

雜湊表的作用是什麼呢?如果沒有雜湊表,我們要訪問某個結點,就需要順序地乙個個找, 時間複雜度是o(n)。使用雜湊表可以讓我們在o(1)的時間找到想要訪問的結點, 或者返回未找到。

當我們通過鍵值來訪問型別為t的資料時,呼叫get函式。如果鍵值為key的資料已經在 cache中,那就返回該資料,同時將儲存該資料的結點移到雙向鍊錶頭部。 如果我們查詢的資料不在cache中,我們就可以通過put介面將資料插入雙向鍊錶中。 如果此時的cache還沒滿,那麼我們將新結點插入到鍊錶頭部, 同時用雜湊表儲存結點的鍵值及結點位址對。如果cache已經滿了, 我們就將鍊錶中的最後乙個結點(注意不是尾結點)的內容替換為新內容, 然後移動到頭部,更新雜湊表。

注意,hash map並不是c++標準的一部分,我使用的是linux下g++ 4.6.1, hash_map放在/usr/include/c++/4.6/ext下,需要使用__gnu_cxx名空間, linux平台可以切換到c++的include目錄:cd /usr/include/c++/版本 然後grep -ir 「hash_map」 ./ 檢視在哪個檔案中,一般標頭檔案的最後幾行會提示它所在的名空間。 當然如果你已經很fashion地在使用c++ 11,就不會有這些小困擾了。

#include #include #include using namespace std;

using namespace stdext;

templatestruct lrucacheentry

;templateclass lrucache

~lrucache()

void put(k key, t data)

else

else

} }t get(k key)

else return null;// 如果cache中沒有,返回t的預設值。與hashmap行為一致

}private:

// 分離結點

void detach(lrucacheentry* node)

// 將結點插入頭部

void attach(lrucacheentry* node) };

int main(){

hash_mapmap;

map[9]= 999;

coutlru_cache.put(1, "one");

cout<

(五)LRU Cache資料結構簡介

參考 lru的典型實現是hash map doubly linked list,雙向鍊錶用於儲存資料結點,並且它是按照結點最近被使用的時間來儲存的。如果乙個結點被訪問了,我們有理由相信它在接下來的一段時間被訪問的概率要大於其它結點。於是,我們把它放到雙向鍊錶的頭部。當我們往雙向煉表裡插入乙個結點,我...

資料結構 簡介

資料元素 是組成資料有一定意義的基本單位,比如乙個人的基本資訊包括姓名 性別 年齡等 資料物件 是性質相同的資料元素的集合,比如正整數資料物件n 資料結構 是資料的組織形式,即資料元素之間存在的一種或幾種特定關係 資料型別 是用來刻畫一組性質相同的資料及其上的操作。可以分為原子型別和結構型別。抽象資...

資料結構簡介

資料結構 是指相互之間存在一種或多種特定關係的 資料元素 的集合。聽起來是不是很抽象,簡單理解 資料結構就是描述物件間邏輯關係的學科。比如 佇列就是一種先進先出的邏輯結構,棧是一種先進後出的邏輯結構,家譜是一種樹形的邏輯結構!初學資料結構的時候很不理解為什麼有 棧 這個東西 佇列很容易理解 無論購物...