目录
一、手把手带你拆解 LRU 算法?
LRU 算法就是一种缓存淘汰策略,LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。
当然还有其他缓存淘汰策略,比如不要按访问的时序来淘汰,而是按访问频率(LFU 策略)来淘汰等等,各有应用场景。
1.146. LRU 缓存?
unorder_map查找快,但是数据无固定顺序;链表有顺序之分,插入删除快,但是查找慢。所以结合一下,形成一种新的数据结构。
细节:不能用queue,因为无法取出某一个元素,所以用链表 ;但是因为要删除最后一个元素,避免遍历,所以用双向链表。
要注意双向链表尾结点的处理。
二、手把手带你拆解 LFU 算法?(★★★★★)
LFU 算法相当于是淘汰访问频次最低的数据,如果访问频次最低的数据有多条,需要淘汰最旧的数据。
1.460. LFU 缓存
代码是抄的~~~
-
自己封装一个双链表,实现以下功能:
inline bool empty(); void push_back(Node *n); void remove(Node *n); Node *pop_front(); -
两个容器
std::unordered_map<int, Node*> key_node; //每一个key,对应一个node(key,val,freq 前后结点指针)
std::unordered_map<int, DoubleList*> freq_table; //每一个freq对应一个双链表,双链表中旧元素为head->next
-
实现put,get:put和get操作会对频次造成影响,所以封装了个setfreq,其实命名为updatefreq更合适。
//更新某个节点:freq_table先删除该结点对应的freq下的该结点,加1后再pushback。
void setfreq(Node* n)

本文详细解析了LRU(最近最少使用)和LFU(最少访问频率)算法,介绍了它们如何作为缓存淘汰策略,并通过实例演示了如何使用双链表和unordered_map实现LRU和LFU缓存。重点在于手把手教你实现核心数据结构和关键操作。
1517

被折叠的 条评论
为什么被折叠?



