LRU(最近最少使用淘汰算法)基本实现
LRU(Least Recently Used)
出发点:在页式存储管理中,如果一页很长时间未被访问,则它在最近一段时间内也不会被访问,即时间局部性,那我们就把它调出(置换出)内存,相反的,如果一个数据刚刚被访问过,那么该数据很大概率会在未来一段时间内访问。
可以使用栈、队列、链表来简单实现,在InnoDB中,使用适应性hash,来实现热点页的查找(因为快速)。
1. 用栈(数组模拟)简单实现访页逻辑:
- #include <iostream>
- using namespace std;
- void conduct(int Size, int Num, int A[]);//处理函数
- void print(int a[], int num);//输出函数
- int main()
- {
- int stack_size, num, i, acess[];
- cout << "输入栈空间:" ;
- cin >> stack_size;
- cout << "输入进程数(Max=100):" ;
- cin >> num;
- cout << "输入进程访页顺序:" ;
- for(i=; i<num; i++)
- {
- cin >> acess[i];
- }
- conduct(stack_size, num, acess);
- return ;
- }
- void conduct(int Size, int Num, int A[])
- {
- int j, k, Stack[Size];
- for(j=; j<Size; j++)
- {
- cout << "进入:" << A[j] <<endl;
- Stack[j]=A[j];//先处理前几个元素
- }
- int locate;bool flag;
- for(j=Size; j<Num; j++)
- {
- flag=false;
- for(k=; k<Size; k++)
- {
- if(Stack[k]==A[j])
- {
- flag=true;
- locate=k;
- }
- }
- if(flag==true)//有重复
- {
- cout << "重复进程:" << A[j] <<endl;
- cout << "取出再压栈" <<endl;
- int tempp;
- for(k=locate; k<Size; k++)
- {
- Stack[k]=Stack[k+];
- }
- Stack[Size-]=A[j];
- cout << "压栈完成" <<endl;
- cout << "当前顺序:";
- print(Stack, Size);
- }
- else
- {
- cout << "非重复,压栈:" << A[j] <<endl;
- for(k=; k<Size-; k++)
- {
- Stack[k]=Stack[k+];
- }
- Stack[Size-]=A[j];
- cout << "置换完成。" <<endl;
- cout << "当前顺序:";
- print(Stack, Size);
- }
- }
- }
- void print(int a[], int num)
- {
- int k;
- for(k=; k<num; k++)
- {
- cout << a[k] << " ";
- }
- cout << endl;
- }
Code::Blocks 17.12 运行通过!
结果:
2. 使用lis容器实现LRU逻辑
- #include <iostream>
- #include <list>
- #include <vector>
- using namespace std;
- class LRU
- {
- public:
- LRU();
- ~LRU();
- void insret(int x);
- void printQ();
- private:
- list<int> lst;
- int count;//当前页数
- int max_size = ;//最大容纳页数
- };
- LRU::LRU()
- {
- this->count = ;
- }
- LRU::~LRU()
- {
- }
- //插入算法,先查找,找到先删除再插入;未找到,直接插入
- void LRU::insret(int x)
- {
- cout << "访页:" << x << " ";
- auto res = find(lst.begin(), lst.end(), x);
- if (res != lst.end())
- {
- cout << "(exist)" << " ";
- lst.erase(res);
- lst.push_front(x);
- }
- else
- {
- lst.push_front(x);
- this->count++;
- }
- if (this->count > this->max_size)
- {
- lst.pop_back();
- this->count--;
- }
- printQ();
- }
- //打印list
- void LRU::printQ()
- {
- list<int>::iterator it = this->lst.begin();
- cout << "当前队列/热点页:";
- for (; it != lst.end(); it++)
- {
- cout << *it << " ";
- }
- cout << "\ndone. size -- " << this->count << " " << " max_size -- " << this->max_size << endl << endl;
- }
- int main()
- {
- LRU lru;
- vector<int> test = {, , , , , , , , , , , , , , , };
- for (int i : test)
- lru.insret(i);
- return ;
- }
结果:
LRU(最近最少使用淘汰算法)基本实现的更多相关文章
- Golang 随机淘汰算法缓存实现
缓存如果写满, 它必须淘汰旧值以容纳新值, 最近最少使用淘汰算法 (LRU) 是一个不错的选择, 因为你如果最近使用过某些值, 这些值更可能被保留. 你如果构造一个比缓存限制还长的循环, 当循环最后的 ...
- 缓存淘汰算法--LRU算法
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...
- 缓存淘汰算法---LRU
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...
- 【转】缓存淘汰算法系列之1——LRU类
原文地址:http://www.360doc.com/content/13/0805/15/13247663_304901967.shtml 参考地址(一系列关于缓存的,后面几篇也都在这里有):htt ...
- 04 | 链表(上):如何实现LRU缓存淘汰算法?
今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是+LRU+缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...
- 缓存淘汰算法---LRU转
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...
- LRU算法---缓存淘汰算法
计算机中的缓存大小是有限的,如果对所有数据都缓存,肯定是不现实的,所以需要有一种淘汰机制,用于将一些暂时没有用的数据给淘汰掉,以换入新鲜的数据进来,这样可以提高缓存的命中率,减少磁盘访问的次数. LR ...
- 淘汰算法 LRU、LFU和FIFO
含义: FIFO:First In First Out,先进先出LRU:Least Recently Used,最近最少使用 LFU:Least Frequently Used,最不经常使用 以上三者 ...
- 数据结构与算法之美 06 | 链表(上)-如何实现LRU缓存淘汰算法
常见的缓存淘汰策略: 先进先出 FIFO 最少使用LFU(Least Frequently Used) 最近最少使用 LRU(Least Recently Used) 链表定义: 链表也是线性表的一种 ...
随机推荐
- 解决使用display:inline-block时元素间隔问题
在写个人博客页时出现了一个百思不得其解的问题,不知道为什么出现以下情况: 可以看到,下面的a标签中出现了一个间隔,怎么都去不掉,查阅资料后发现,问题原因如下: 1.第一种解决办法,去掉HTML元素中的 ...
- Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)
写在前面 本文地址:http://www.cnblogs.com/yilezhu/p/9315644.html 作者:yilezhu 上一篇关于Asp.Net Core Web Api图片上传的文章使 ...
- vue 项目实战 (生命周期钩子)
开篇先来一张图 下图是官方展示的生命周期图 Vue实例的生命周期钩子函数(8个) 1. beforeCreate 刚 new了一个组件,无法访问到数据和真实的do ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- 项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!
前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近. 很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实 ...
- [NewLife.XCode]功能设置
NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...
- Xpath 获取html文档的标签
1.html page content: <div class="mnr-c _yE"> <div class="_kk _wI">In ...
- React 中无用但可以装逼的知识
最近看了Dan Abramov的一些博客,学到了一些React的一些有趣的知识.决定结合自己的理解总结下.这些内容可能对你实际开发并没有什么帮助,不过这可以让你了解到更多React底层实现的内容以及为 ...
- 第6章 LVM详解
6.1 LVM相关概念和机制 LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的. lvm需要使用的软件包为lvm2 ...
- spring boot(三) 集成mybatis
前言 还记得之前我们写接口也是基于SpringMVC+MyBatis环境下,项目入手就需要N个配置文件,N个步骤才能实现,不但繁琐,而且时间长了xml配置文件太多,难以维护.现在基于spring bo ...