LRU缓存机制
题目链接
LRU,即Least-Recently-Used。是一种高速缓存替换策略,是一种缓存机制。主要是利用局部性原理。
(资料图片)
局部性原理分两种,空间局部性和时间局部性。
在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次应用。
在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。
显然,LRU是利用到了时间局部性。
在CSAPP的P434组相联高速缓存中不命中时的行替换出现。
题目分析最近最少使用(LRU)策略会替换最后一次访问时间最久远的那一行。
实现 LRUCache 类:
LRUCache(int capacity)
以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key)
如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value)
如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出最久未使用的关键字。函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
来源:力扣(LeetCode)
这是一道很优秀的设计问题,而不是关于某个问题的算法。
题目要求你利用相关的知识,设计一个能够简单实现LRU 缓存机制的类。
根据刚刚所说的CSAPP中的背景知识,可以知道要设计出的类:
需要存储每个键值。(put函数插入,get函数查询)键值对(key,value)需要用哈希表来存储。(O(1) 的平均时间复杂度)那现在留下的问题就是,如何做到逐出。
队列首先可以想到,利用队列的先进先出原则。
如果使用了,就将它拿出,再插入到队列中。队首为最久未使用,队尾为最近使用。那么如何逐出?拿出怎么做到?这里就遇到了难以删除的问题。
双向链表所以,下面介绍双向链表的解法。
双向链表可以直接访问到尾部。尾部代表最久未使用。链表方便插入和删除。根据键值,利用哈希表能定位到对应的存储节点。内存泄漏?双向链表可以利用指向关系做到删除,将节点剔除于链表外。
然而我们在剔除后,对于访问的节点来说,还需要再加到头部节点。而对于没有访问的节点,我们需要真正删除它。
所以代码中有两个delete函数,来避免内存泄漏。
代码class LRUCache {private: struct DoubleLinkNode { int key; int value; DoubleLinkNode* prev; DoubleLinkNode* next; DoubleLinkNode(): key(0), value(0), prev(nullptr), next(nullptr) {} DoubleLinkNode(int _key, int _value): key(_key), value(_value), prev(nullptr), next(nullptr){} }; map cache; DoubleLinkNode* head; DoubleLinkNode* tail; int capacity; int size; void addNodeHead(DoubleLinkNode* node)//双向链表头插法 { node->next = head->next; node->prev = head; head->next->prev = node; head->next = node; } void deleteNode(DoubleLinkNode* node)//剔除尾节点 { node->next->prev = node->prev; node->prev->next = node->next; } void moveNodeHead(DoubleLinkNode* node) { deleteNode(node); addNodeHead(node); } DoubleLinkNode* deleteTail()//删除尾节点 { DoubleLinkNode* temp = tail->prev; deleteNode(temp); return temp; }public: LRUCache(int capacity) { this->capacity = capacity; size = 0; head = new DoubleLinkNode(); tail = new DoubleLinkNode(); head->next = tail; tail->prev = head; } int get(int key) { if (cache.count(key)) { moveNodeHead(cache[key]); return cache[key]->value; }else { return -1; } } void put(int key, int value) { if (cache.count(key)) { cache[key]->value = value; moveNodeHead(cache[key]); }else { DoubleLinkNode* node = new DoubleLinkNode(key, value); addNodeHead(node); cache[key] = node; size += 1; if (size > capacity) { DoubleLinkNode* temp = deleteTail(); cache.erase(temp->key); delete temp;//避免内存泄漏 size -= 1; } } }};/** * Your LRUCache object will be instantiated and called as such: * LRUCache* obj = new LRUCache(capacity); * int param_1 = obj->get(key); * obj->put(key,value); */
标签:
为您推荐
广告
- LRU缓存机制
- 每日消息!无氧铜和纯铜网线哪个好(无氧铜和纯铜的区别)
- 王者荣耀凯曙光守护者的刀图片 王者荣耀凯曙光守护者_视讯
- 世界新动态:点主_关于点主介绍
- 中国驻瑞典大使崔爱民会见瑞典博壳松公司总裁耶普松 全球关注
- 【世界聚看点】首辆香港单牌车经港珠澳大桥入粤!
- 逆水寒手游流水难追奇遇攻略|微速讯
- 以色列宣布抓捕伊朗特工,伊媒反驳:“颠倒黑白”
- 陈奕迅最好听的十首歌曲-陈奕迅最好听的十首歌 全球新要闻
- 《金匮方歌括》凡例
- 44岁还在演偶像剧,上节目说自己长不大,言承旭是纯情还是油腻?-今日热闻
- IP私域 系统搭建课,视频号+私域 1套 体系 3大课程,打通你的个人ip私域靠谱副业推荐
- 显示器驱动程序停止响应并且恢复(显示器驱动程序停止响应)
- G6上市,N7快充谁强? 信息
- 环球快资讯:三次递表后终于在港上市,累计亏损近60亿的Keep前路何往?
- 范菲菲_关于范菲菲的简介
- 青岛保皇电脑版(青岛保皇) 世界新消息
- 每日动态!两岸学者对谈:推动两岸青年交流 增进互信
- 机电工程中级职称论文_机电工程师职称论文 快播报
- 国家技能鉴定报名中心_国家技能鉴定报名
- 1记者:拜仁仍在关注穆阿尼&DV9 夏窗尾声再决定是否外租特尔 焦点快看
- 2pvc单壁波纹管规格_pvc单壁波纹管 当前快看
- 3thinkpad x250配置参数_thinkpad x250
- 4今日热议:首次!门头沟成功入选“中国山水工程”
- 512个著名的芭蕾舞剧(十二个著名的芭蕾舞剧)|世界球精选
- 6新华指数|山东港口原油现货价格上涨(6月30日) 全球新资讯
- 7若为自由故两者皆可抛谁在狱里说的(若为自由故两者皆可抛)_今亮点
- 8锋龙股份(002931)6月30日主力资金净买入3828.49万元_环球快看点
- 9天天要闻:配800V快充 智己LS6将于成都车展亮相
- 10每日快报!云南省外汇业务自律机制召开2023年“汇率风险中性”推进大会
广告
- 【天天新视野】微距拍摄有必要补光吗 微距照片拍摄不清晰 你知道是什么原因吗
- 【警方视点】哈尔滨市公安局出入境管理局针对未成年学生推出暑期专项服务 当前快讯
- 好消息!长宁这座过街天桥建成开通啦
- DNF缪斯buff换装选什么 缪斯buff换装选择推荐|今日热门
- 全球快报:开封有个包青天,为何却在开封知府石碑上被除名?
- 高级定制官网在哪下载 最新官方下载安装地址
- 林依晨电视剧的全部吻戏_林依晨电视剧
- 索信达控股(03680.HK)完成发行1.43亿股认购股份|当前热闻
- 荷兰国际:德国通胀可能在夏季过后大幅下降_热点
- 角平分线的画法视频(角平分线的画法)
- 【环球报资讯】上海口岸太阳能电池出口火热,前五个月出口值达783.9亿元人民币
- 北极星电力新闻网_北极星电力论坛电力论坛 环球热文
- 焦点讯息:世体:巴萨决定续约特纳斯,并计划将他租借至另一家西甲球队
- 视焦点讯!迪马:奇克在米兰城接受体检,当地时间今天下午签约
- 河北鹰手营子矿区:第五届青年交友联谊会成功举办|世界播报
- 布罗佐维奇尚未交易成功,这阻碍了国米采购罗马目标弗拉特西
- ip地址的组成包括(IP地址的组成及分类) 最新快讯
- 青春不落幕!大学毕业季感人瞬间|世界实时
- 宏润集团
- 世界微资讯!国际滑联2023-2024赛季花滑大奖赛参赛名单出炉