LRU與LFU快取替換演算法C 實現

2021-10-08 20:41:49 字數 3282 閱讀 7194

lfu實現

資料結構unordered_map+dqueue;

unordered_map的鍵為key,值為node*,方便快速訪問資料;

dqueue雙端佇列,快速刪除、插入node*;

簡單的lru是存在缺點的,比如有某一次快取操作是完全隨機的,但是lru快取中替換為了這一次隨機的訪問資料(指的是,只有這一次被訪問,接下來不會被訪問),導致快取被汙染;

因此也有對lru的改進版,比如lru-k,新增加乙個歷史佇列,只有在歷史佇列中的快取訪問次數達到k次,才會被放置到實際的快取佇列中;至於如何管理歷史佇列,可以使用fifo,也可以使用lru。(當k=1時,即退化為普通的lru演算法)

#include

using

namespace std;

class

lrucache};

//迴圈佇列

class

dqueue

~dqueue()

delete head;

}bool

isempty()

void

erase

(node* node)

void

push_back

(node* node)

node*

pop_front()

};dqueue queue;

unordered_map<

int, node*

>map;

int size =0;

int capacity;

public

:lrucache

(int capacity)

:capacity

(capacity)

intget

(int key)

void

put(

int key,

int value)

else

else

node-

>key = key;

node-

>val = value;

map[key]

= node;

} queue.

push_back

(node);}

};

資料結構unordered_map+dqueue;

keymap的鍵為key,值為node*,方便快速訪問資料;frepmap的鍵為freq頻率,值為dqueue,可以支援快速查詢最少訪問頻率的資料,並進行基於頻率的資料管理;

dqueue雙端佇列,快速刪除、插入node*;

class

lfucache};

//迴圈佇列

class

dqueue

~dqueue()

delete head;

}bool

isempty()

void

erase

(node* node)

void

push_back

(node* node)

node*

pop_front()

};unordered_map<

int, node*

>keymap;

unordered_map<

int, dqueue>freqmap;

int size =0;

int capacity;

int minfreq =1;

//更新key的頻率

void

updatefreq

(int key)

++node-

>freq;

freqmap[node-

>freq]

.push_back

(node);}

public

:lfucache

(int capacity)

:capacity

(capacity)

intget

(int key)

void

put(

int key,

int value)

node* node =

null;if

(size >= capacity)

else

minfreq =1;

node-

>key = key;

node-

>val = value;

node-

>freq = minfreq;

keymap[key]

= node;

freqmap[node-

>freq]

.push_back

(node);}

};

class

lfucache};

unordered_map<

int, list

::iterator>keymap;

unordered_map<

int, list>freqmap;

int minfreq =1;

int size =0;

int capacity;

void

updatefreq

(int key)

++node.freq;

freqmap[node.freq]

.push_front

(node)

; keymap[key]

= freqmap[node.freq]

.begin()

;}public

:lfucache

(int capacity)

:capacity

(capacity)

intget

(int key)

void

put(

int key,

int value)

else

if(size >= capacity)

node node

(key, value,1)

; minfreq =1;

freqmap[minfreq]

.push_front

(node)

; keymap[key]

= freqmap[minfreq]

.begin()

;++size;}}

;

LRU快取替換演算法介紹與程式設計實現

快取中容量是有限的,當要查詢的資料不在快取中時,我們要用新資料替換掉 部分原有得資料,有很多種替換策略,lru就是最近最少使用的被替換,我們想要 將來被使用的資料保留下來,但我們不知道將來會使用那些資料,就按照最近使用資料近似將來也會使用的資料。我們要如何體現最近最少使用呢?採用乙個佇列,新加入的資...

C 實現快取演算法LRU和LFU

運用你所掌握的資料結構,設計和實現乙個lru 最近最少使用 快取機制 它應該支援以下操作 獲取資料get和 寫入資料put。獲取資料get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料put key,value 如果金鑰不存在,則寫入其資料值。當快取容量達...

LRU 與 LFU 演算法

lru是最近最少使用頁面置換演算法 least recently used 也就是首先淘汰最長時間未被使用的頁面 lfu是最近最不常用頁面置換演算法 least frequently used 也就是淘汰一定時期內被訪問次數最少的頁 比如,第二種方法的時期t為10分鐘,如果每分鐘進行一次調頁,主存塊...