labuladong刷题笔记二(设计数据结构)

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

目录

一、手把手带你拆解 LRU 算法?

1.146. LRU 缓存?

二、手把手带你拆解 LFU 算法?(★★★★★)

1.460. LFU 缓存


一、手把手带你拆解 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值