LRU(leastLeast Recently Used)
一、什么是LRU
最近最少使用的内存管理算法
长期不被使用的数据,在未来被使用的概率也不大,所以当内存达到一定的交换阈值,会将最近最少使用的数据移除。
二、使用方法
采用哈希表和双向链表结合方式,使得访问数据。插入数据的效率达到O(1)。
哈希表: unordered_map<int,list<int,pair<int,int>::iterator>
链表: list<pair<int,int>>
采用哈希表可以使得查找效率达到O(1) ,哈希表的第二个值存储链表的迭代器
三、代码(内有注释)
class LRUCache {public:LRUCache(int capacity) {//确定链表的节点数_capacity=capacity;}//查找节点值,直接从哈希表中查找,找不到返回-1//找到的话,找到节点值,然后将这个节点前后的节点相连,将此节点移动的链表的最后位置//此处采用list自带的splice 函数 (哪个位置,链表,移动链表的那个节点); int get(int key) {auto umit=_hashMap.find(key);if(umit!=_hashMap.end()){LRU_LST_IT listIt=umit->second;int value=listIt->second;_listCache.splice(_listCache.end(),_listCache,listIt);//连接左右,取出值放在后面//_listCache.erase(listIt);//_hashMap.erase(key);//_listCache.push_back(make_pair(key,value));//_hashMap[key]=--_listCache.end();return value; }else{return -1;}}//插入节点//当前哈希表中是否存在//存在则直接将当前节点移动到链表最后//不存在则判断链表个节点个数是否满了//满了,则删除掉最前面的节点和哈希表中的最前面节点信息//然后将新节点插入到链表后面,并且构建哈希表的key-value信息////不满则直接在链表后面插入新节点,并且构建哈希表的key-value信息 void put(int key, int value) {auto umit=_hashMap.find(key);if(umit!=_hashMap.end()){//auto endit=_listCache.end();LRU_LST_IT ltIt=umit->second;ltIt->second=value;_listCache.splice(_listCache.end(),_listCache,umit->second);}else{if(_listCache.size()==_capacity){_hashMap.erase(_listCache.front().first);_listCache.pop_front();}_listCache.push_back(make_pair(key,value));_hashMap[key]=--_listCache.end(); }}
private:typedef list<std::pair<int,int>>::iterator LRU_LST_IT;typedef std::pair<int,int> LRU_LST;
//链表定义 哈希表定义 节点个数list<LRU_LST> _listCache;unordered_map<int,LRU_LST_IT> _hashMap; int _capacity;
};
四、图
LRU(leastLeast Recently Used)相关推荐
- 操作系统之虚拟存储管理 java python 实现 最优(Optimal)置换算法 先进先出(FIFO)页面置换算法 LRU(Least Recently Used)置换算法
操作系统之虚拟存储管理 实验内容:模拟请求分页虚拟存器管理技术中的硬件地址变换.缺页中断以及页式淘汰算法,处理缺页中断. 实验目的:清楚认识请求分页管理. 最佳(Optimal)置换算法 其所选择的被 ...
- LRU(Least Recently Used)算法简单介绍
文章目录 LRU算法简介 使用场景 简单实现 简单介绍 LRU算法简介 LRU英文翻译过来就是least recently used,字面意思就是最近最少使用,说白了就是一种淘汰算法,当有新的元素插入 ...
- LRU(Least Recently Used)缓存淘汰策略算法
LRU LRU(Least Recently Used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也更高". ...
- LRU(least recently used)算法浅析
LRU(Least recently used)算法,顾名思义:最近最少使用. LRU-1算法 算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的 ...
- 最近最少使用LRU(Least Recently Used)算法java实现
最近最少使用LRU(Least Recently Used)算法java实现 一.使用LinkedHashMap算法实现 二.手撸 LRU 算法实现(Hash表 + 双向链表) 三.总结 最近最少使用 ...
- 代码写对了还挂了?程序媛小姐姐从 LRU Cache 带你看面试的本质
来源 | 码农田小齐 责编 | Carol 前言 在讲这道题之前,我想先聊聊「技术面试究竟是在考什么」这个问题. 技术面试究竟在考什么 在人人都知道刷题的今天,面试官也都知道大家会刷题准备面试,代码 ...
- 从 LRU Cache 带你看面试的本质
前言 在讲这道题之前,我想先聊聊「技术面试究竟是在考什么」这个问题. 技术面试究竟在考什么 在人人都知道刷题的今天,面试官也都知道大家会刷题准备面试,代码大家都会写,那面试为什么还在考这些题?那为什么 ...
- java 最少使用(lru)置换算法_「面试」LRU了解么?看看LinkedHashMap如何实现LRU算法...
以下内容均是本人原创,希望你看完之后能有更多更深入的了解,欢迎关注➕ 问题:使用Java完成一个简单的LRU算法 什么是LRU算法 LRU(Least Recently Used),也就是最近最少使用 ...
- 如何设计LRU Cache算法
前言 相信有的伙伴在面试的过程中,或多或少的会被问到redis的内存淘汰策略,可能大部分人都知道都有哪些对应的策略,毕竟对于八股文的套路大家肯定早已铭记于心.但是当面试官问你如何实现或者让你去写一个对 ...
最新文章
- 带无线驱动的linux版本,怎么在Linux里查询无线网卡的驱动程序版本
- python使用符号#表示单行注释-【经济金融及Python应用讲义】Python编程规范之注释...
- 6.项目资源管理总结
- windows 环境下mysql的操作浅析
- Chrome DevTools进阶教程
- 计算机系统的工作方式,某计算机系统输入/输出采用双缓冲工作方式,其工作过程如下图所示,假设磁盘块与缓冲 - 信管网...
- 插入排序(边输边排)
- Spring注解@ConfigurationPropertie
- VALSE学习(十六): Visual Question Generation and Answering-视觉问题生成和视觉问题
- Spark-Mllib(二)基本统计
- React中的三种类型组件介绍
- 用拉格朗日插值法,牛顿插值和分段线性插值计算近似值
- win10系统cf玩一局就服务器断开,win10系统玩cf游戏经常自动退出的详细步骤
- SD卡和TF卡的区别/差异
- html导航栏背景图片,页面导航栏滚动时改变导航栏背景样式及回到顶部
- 携程AI和推荐系统的云化实践
- 求三个数的最小公倍数的解法之美
- 手把手教你用docker 搭建zoolkepper 和 dubbo 的测试环境
- 1.回文是指正读和反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈。)2.假设以带头结点的循环链
- vuecli 实现导航切换
热门文章
- II——caffe+ubuntu14.04 64bit+cuda6.5配置说明——补充
- 手机整屏显示数据php,JavaScript实现移动端页面按手机屏幕分辨率自动缩放示例...
- Cannot load excludes configuration file
- Horizon Clientfor Linux安装过程记录
- SpringMVC+Vue项目停车场管理系统
- 下三角矩阵在一维空间中的存储检索
- CNT-OSI七层参考模型和TCP/IP四层网络协议
- 春节共享手抄报素材怎么整理?
- python manage.py migrate和 migrate --fake和migrate --fake-initial的区别
- Windows10系统下JDK1.8的下载安装及环境变量配置