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分鐘,如果每分鐘進行一次調頁,主存塊...